[6/6] winmm/tests: Add joystick tests
Bruno Jesus
00cpxxx at gmail.com
Wed Dec 10 22:54:36 CST 2014
The motivation was bug https://bugs.winehq.org/show_bug.cgi?id=37695
Manually tested with and without a joystick in Wine, Windows 98, XP and 8.
98 RUN:
joystick.c:53: Joystick[0] - name: 'Driver de joystick da Microsoft',
axes: 2, buttons: 8, period range: 10 - 1000
joystick: 78 tests executed (0 marked as todo, 0 failures), 0 skipped.
XP RUN:
joystick.c:53: Joystick[0] - name: 'Driver de joystick para PC da M',
axes: 2, buttons: 8, period range: 10 - 1000
joystick: 84 tests executed (0 marked as todo, 0 failures), 0 skipped.
Windows 8:
joystick.c:53: Joystick[0] - name: 'Microsoft PC-joystick driver',
axes: 2, buttons: 8, period range: 10 - 1000
joystick: 84 tests executed (0 marked as todo, 0 failures), 0 skipped.
-------------- next part --------------
---
dlls/winmm/tests/Makefile.in | 1 +
dlls/winmm/tests/joystick.c | 205 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 206 insertions(+)
create mode 100644 dlls/winmm/tests/joystick.c
diff --git a/dlls/winmm/tests/Makefile.in b/dlls/winmm/tests/Makefile.in
index 887a695..5d81e38 100644
--- a/dlls/winmm/tests/Makefile.in
+++ b/dlls/winmm/tests/Makefile.in
@@ -4,6 +4,7 @@ IMPORTS = winmm user32 advapi32
C_SRCS = \
capture.c \
generated.c \
+ joystick.c \
mci.c \
mcicda.c \
midi.c \
diff --git a/dlls/winmm/tests/joystick.c b/dlls/winmm/tests/joystick.c
new file mode 100644
index 0000000..4d16ff6
--- /dev/null
+++ b/dlls/winmm/tests/joystick.c
@@ -0,0 +1,205 @@
+/*
+ * Unit tests for joystick APIs
+ *
+ * Copyright 2014 Bruno Jesus
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "mmsystem.h"
+#include "wine/test.h"
+
+HWND window;
+
+LRESULT CALLBACK proc_window(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
+{
+ return DefWindowProcA(hwnd, msg, wparam, lparam);
+}
+
+void create_window(void)
+{
+ const char name[] = "Joystick Test";
+ WNDCLASSA wc;
+
+ memset(&wc, 0, sizeof(wc));
+ wc.lpfnWndProc = proc_window;
+ wc.hInstance = 0;
+ wc.lpszClassName = name;
+ RegisterClassA(&wc);
+ window = CreateWindowExA(0, name, name, WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
+ NULL, NULL, NULL, NULL);
+ ok(window != NULL, "Expected CreateWindowEx to work, error %d\n", GetLastError());
+}
+
+void destroy_window(void)
+{
+ DestroyWindow(window);
+ window = NULL;
+}
+
+void test_api(void)
+{
+ MMRESULT ret;
+ JOYCAPSA jc;
+ JOYCAPSW jcw;
+ JOYINFO info;
+ union _infoex
+ {
+ JOYINFOEX ex;
+ char buffer[sizeof(JOYINFOEX) * 2];
+ } infoex;
+ UINT i, par, devices, joyid, win98 = 0, win8 = 0;
+ UINT period[] = {0, 1, 9, 10, 100, 1000, 1001, 10000, 65535, 65536, 0xFFFFFFFF};
+ UINT threshold_error = 0x600, period_win8_error = 0x7CE;
+ UINT flags[] = { JOY_RETURNALL, JOY_RETURNBUTTONS, JOY_RETURNCENTERED, JOY_RETURNPOV,
+ JOY_RETURNPOVCTS, JOY_RETURNR, JOY_RETURNRAWDATA, JOY_RETURNU,
+ JOY_RETURNV, JOY_RETURNX, JOY_RETURNY, JOY_RETURNZ };
+
+ devices = joyGetNumDevs();
+ joyid = -1;
+ /* joyGetNumDevs does NOT return the number of joysticks connected, only slots in the OS */
+ for (i = 0; i < devices; i++)
+ {
+ memset(&jc, 0, sizeof(jc));
+ ret = joyGetDevCapsA(JOYSTICKID1 + i, &jc, sizeof(jc));
+ if (ret == JOYERR_NOERROR)
+ {
+ joyid = JOYSTICKID1 + i;
+ trace("Joystick[%d] - name: '%s', axes: %d, buttons: %d, period range: %d - %d\n",
+ JOYSTICKID1 + i, jc.szPname, jc.wNumAxes, jc.wNumButtons, jc.wPeriodMin, jc.wPeriodMax);
+ ret = joyGetDevCapsW(JOYSTICKID1 + i, &jcw, sizeof(jcw));
+ if (ret != MMSYSERR_NOTSUPPORTED) /* Win 98 */
+ {
+ ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret);
+ ok(jc.wNumAxes == jcw.wNumAxes, "Expected %d == %d\n", jc.wNumAxes, jcw.wNumAxes);
+ ok(jc.wNumButtons == jcw.wNumButtons, "Expected %d == %d\n", jc.wNumButtons, jcw.wNumButtons);
+ }
+ else win98++;
+ break;
+ }
+ else
+ {
+ ok(ret == JOYERR_PARMS, "Expected %d, got %d\n", JOYERR_PARMS, ret);
+ ret = joyGetDevCapsW(JOYSTICKID1 + i, &jcw, sizeof(jcw));
+ ok(ret == JOYERR_PARMS || (ret == MMSYSERR_NOTSUPPORTED) /* Win 98 */,
+ "Expected %d, got %d\n", JOYERR_PARMS, ret);
+ }
+ }
+ /* Test invalid joystick - If no joystick is present the driver is not initialized,
+ * so a NODRIVER error is returned, if at least one joystick is present the error is
+ * about invalid parameters. */
+ ret = joyGetDevCapsA(joyid + devices, &jc, sizeof(jc));
+ ok(ret == MMSYSERR_NODRIVER || ret == JOYERR_PARMS,
+ "Expected %d or %d, got %d\n", MMSYSERR_NODRIVER, JOYERR_PARMS, ret);
+
+ if (joyid == -1)
+ {
+ skip("This test requires a real joystick.\n");
+ return;
+ }
+
+ /* Capture tests */
+ ret = joySetCapture(NULL, joyid, 100, FALSE);
+ ok(ret == JOYERR_PARMS || broken(win98 && ret == MMSYSERR_INVALPARAM) /* Win 98 */,
+ "Expected %d, got %d\n", JOYERR_PARMS, ret);
+ ret = joySetCapture(window, joyid, 100, FALSE);
+ ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret);
+ ret = joySetCapture(window, joyid, 100, FALSE); /* double capture */
+ if (ret == JOYERR_NOCANDO)
+ {
+ todo_wine
+ ok(broken(1), "Expected double capture using joySetCapture to work\n");
+ if (!win98 && broken(1)) win8++; /* Windows 98 or 8 cannot cope with that */
+ }
+ else ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret);
+ ret = joyReleaseCapture(joyid);
+ ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret);
+ ret = joyReleaseCapture(joyid);
+ ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret); /* double release */
+
+ /* Try some unusual period values for joySetCapture and unusual threshold values for joySetThreshold.
+ * Windows XP allows almost all test values, Windows 8 will return error on most test values, Windows
+ * 98 allows anything but cuts the values to their maximum supported values internally. */
+ for (i = 0; i < sizeof(period) / sizeof(period[0]); i++)
+ {
+ ret = joySetCapture(window, joyid, period[i], FALSE);
+ if (win8 && ((1 << i) & period_win8_error))
+ ok(ret == JOYERR_NOCANDO, "Test [%d]: Expected %d, got %d\n", i, JOYERR_NOCANDO, ret);
+ else
+ ok(ret == JOYERR_NOERROR, "Test [%d]: Expected %d, got %d\n", i, JOYERR_NOERROR, ret);
+ ret = joyReleaseCapture(joyid);
+ ok(ret == JOYERR_NOERROR, "Test [%d]: Expected %d, got %d\n", i, JOYERR_NOERROR, ret);
+ /* Reuse the periods to test the threshold */
+ ret = joySetThreshold(joyid, period[i]);
+ if (!win98 && (1 << i) & threshold_error)
+ ok(ret == MMSYSERR_INVALPARAM, "Test [%d]: Expected %d, got %d\n", i, MMSYSERR_INVALPARAM, ret);
+ else
+ ok(ret == JOYERR_NOERROR, "Test [%d]: Expected %d, got %d\n", i, JOYERR_NOERROR, ret);
+ par = 0xdead;
+ ret = joyGetThreshold(joyid, &par);
+ ok(ret == JOYERR_NOERROR, "Test [%d]: Expected %d, got %d\n", i, JOYERR_NOERROR, ret);
+ if (!win98 || (win98 && i < 8))
+ {
+ if ((1 << i) & threshold_error)
+ ok(par == period[8], "Test [%d]: Expected %d, got %d\n", i, period[8], par);
+ else
+ ok(par == period[i], "Test [%d]: Expected %d, got %d\n", i, period[i], par);
+ }
+ }
+
+ /* Position tests */
+ ret = joyGetPos(joyid, NULL);
+ ok(ret == MMSYSERR_INVALPARAM, "Expected %d, got %d\n", MMSYSERR_INVALPARAM, ret);
+ ret = joyGetPos(joyid, &info);
+ ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret);
+ ret = joyGetPosEx(joyid, NULL);
+ ok(ret == MMSYSERR_INVALPARAM || broken(win8 && ret == JOYERR_PARMS) /* Win 8 */,
+ "Expected %d, got %d\n", MMSYSERR_INVALPARAM, ret);
+ memset(&infoex, 0, sizeof(infoex));
+ ret = joyGetPosEx(joyid, &infoex.ex);
+ ok(ret == JOYERR_PARMS || broken(win98 && ret == MMSYSERR_INVALPARAM),
+ "Expected %d, got %d\n", JOYERR_PARMS, ret);
+ infoex.ex.dwSize = sizeof(infoex.ex);
+ ret = joyGetPosEx(joyid, &infoex.ex);
+ ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret);
+ infoex.ex.dwSize = sizeof(infoex.ex) - 1;
+ ret = joyGetPosEx(joyid, &infoex.ex);
+ ok(ret == JOYERR_PARMS || broken(win98 && ret == MMSYSERR_INVALPARAM),
+ "Expected %d, got %d\n", JOYERR_PARMS, ret);
+ infoex.ex.dwSize = sizeof(infoex);
+ ret = joyGetPosEx(joyid, &infoex.ex);
+ ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret);
+
+ infoex.ex.dwSize = sizeof(infoex.ex);
+ for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++)
+ {
+ infoex.ex.dwFlags = flags[i];
+ ret = joyGetPosEx(joyid, &infoex.ex);
+ ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret);
+ }
+}
+
+START_TEST(joystick)
+{
+ create_window();
+ test_api();
+ destroy_window();
+}
--
1.8.3.2
More information about the wine-patches
mailing list