dinput: Combine ASCII and Unicode device create callbacks. Add tests.
diff --git a/dlls/dinput/joystick_osx.c b/dlls/dinput/joystick_osx.c
index 2fa0bb9..a36bac8 100644
--- a/dlls/dinput/joystick_osx.c
+++ b/dlls/dinput/joystick_osx.c
@@ -878,12 +878,12 @@
     return 0xffff;
 }
 
-static HRESULT joydev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev)
+static HRESULT joydev_create_device(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPVOID *pdev, int unicode)
 {
     unsigned short index;
     int joystick_devices_count;
 
-    TRACE("%p %s %p %p\n",dinput, debugstr_guid(rguid), riid, pdev);
+    TRACE("%p %s %s %p %i\n", dinput, debugstr_guid(rguid), debugstr_guid(riid), pdev, unicode);
     *pdev = NULL;
 
     if ((joystick_devices_count = find_joystick_devices()) == 0)
@@ -892,66 +892,49 @@
     if ((index = get_joystick_index(rguid)) < 0xffff &&
         joystick_devices_count && index < joystick_devices_count)
     {
-        if ((riid == NULL) ||
-        IsEqualGUID(&IID_IDirectInputDeviceA,  riid) ||
-        IsEqualGUID(&IID_IDirectInputDevice2A, riid) ||
-        IsEqualGUID(&IID_IDirectInputDevice7A, riid) ||
-        IsEqualGUID(&IID_IDirectInputDevice8A, riid))
-        {
-            JoystickImpl *This;
-            HRESULT hr = alloc_device(rguid, dinput, &This, index);
+        JoystickImpl *This;
+        HRESULT hr;
 
-            *pdev = (LPDIRECTINPUTDEVICEA)(This ? &This->generic.base.IDirectInputDevice8A_iface : NULL);
-            return hr;
+        if (riid == NULL)
+            ;/* nothing */
+        else if (IsEqualGUID(&IID_IDirectInputDeviceA,  riid) ||
+                 IsEqualGUID(&IID_IDirectInputDevice2A, riid) ||
+                 IsEqualGUID(&IID_IDirectInputDevice7A, riid) ||
+                 IsEqualGUID(&IID_IDirectInputDevice8A, riid))
+        {
+            unicode = 0;
+        }
+        else if (IsEqualGUID(&IID_IDirectInputDeviceW,  riid) ||
+                 IsEqualGUID(&IID_IDirectInputDevice2W, riid) ||
+                 IsEqualGUID(&IID_IDirectInputDevice7W, riid) ||
+                 IsEqualGUID(&IID_IDirectInputDevice8W, riid))
+        {
+            unicode = 1;
+        }
+        else
+        {
+            WARN("no interface\n");
+            return DIERR_NOINTERFACE;
         }
 
-        WARN("no interface\n");
-        return DIERR_NOINTERFACE;
+        hr = alloc_device(rguid, dinput, &This, index);
+        if (!This) return hr;
+
+        if (unicode)
+            *pdev = &This->generic.base.IDirectInputDevice8W_iface;
+        else
+            *pdev = &This->generic.base.IDirectInputDevice8A_iface;
+        return hr;
     }
 
     return DIERR_DEVICENOTREG;
 }
 
-static HRESULT joydev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEW* pdev)
-{
-    unsigned short index;
-    int joystick_devices_count;
-
-    TRACE("%p %s %p %p\n",dinput, debugstr_guid(rguid), riid, pdev);
-    *pdev = NULL;
-
-    if ((joystick_devices_count = find_joystick_devices()) == 0)
-        return DIERR_DEVICENOTREG;
-
-    if ((index = get_joystick_index(rguid)) < 0xffff &&
-        joystick_devices_count && index < joystick_devices_count)
-    {
-        if ((riid == NULL) ||
-        IsEqualGUID(&IID_IDirectInputDeviceW,  riid) ||
-        IsEqualGUID(&IID_IDirectInputDevice2W, riid) ||
-        IsEqualGUID(&IID_IDirectInputDevice7W, riid) ||
-        IsEqualGUID(&IID_IDirectInputDevice8W, riid))
-        {
-            JoystickImpl *This;
-            HRESULT hr = alloc_device(rguid, dinput, &This, index);
-
-            *pdev = (LPDIRECTINPUTDEVICEW)(This ? &This->generic.base.IDirectInputDevice8W_iface : NULL);
-            return hr;
-        }
-        WARN("no interface\n");
-        return DIERR_NOINTERFACE;
-    }
-
-    WARN("invalid device GUID %s\n",debugstr_guid(rguid));
-    return DIERR_DEVICENOTREG;
-}
-
 const struct dinput_device joystick_osx_device = {
   "Wine OS X joystick driver",
   joydev_enum_deviceA,
   joydev_enum_deviceW,
-  joydev_create_deviceA,
-  joydev_create_deviceW
+  joydev_create_device
 };
 
 static const IDirectInputDevice8AVtbl JoystickAvt =
@@ -1032,7 +1015,6 @@
   "Wine OS X joystick driver",
   NULL,
   NULL,
-  NULL,
   NULL
 };