tstMouseImpl.cpp revision 442eb47642533329b286ac90dc6811476f0203fb
de4157257515400c2c25373591135f110227b68cvboxsync * Main unit test - Mouse class.
772269936494ffaddd0750ba9e28e805ba81398cvboxsync * Copyright (C) 2011-2013 Oracle Corporation
b263fac6f6e7fa933c7bfb2a45d598fe8e458c09vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
b263fac6f6e7fa933c7bfb2a45d598fe8e458c09vboxsync * available from http://www.virtualbox.org. This file is free software;
b263fac6f6e7fa933c7bfb2a45d598fe8e458c09vboxsync * you can redistribute it and/or modify it under the terms of the GNU
b263fac6f6e7fa933c7bfb2a45d598fe8e458c09vboxsync * General Public License (GPL) as published by the Free Software
b263fac6f6e7fa933c7bfb2a45d598fe8e458c09vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
b263fac6f6e7fa933c7bfb2a45d598fe8e458c09vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
b263fac6f6e7fa933c7bfb2a45d598fe8e458c09vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
de4157257515400c2c25373591135f110227b68cvboxsync/******************************************************************************
772269936494ffaddd0750ba9e28e805ba81398cvboxsync* Header Files *
de4157257515400c2c25373591135f110227b68cvboxsync******************************************************************************/
de4157257515400c2c25373591135f110227b68cvboxsync#define IN_VMM_R3 /* Kill most Windows warnings on CFGMR3* implementations. */
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync PPDMIVMMDEVPORT getVMMDevPort(void) { return &VMMDevPort; }
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync void getFramebufferDimensions(int32_t *px1, int32_t *py1,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync int getScreenResolution(uint32_t cScreen, ULONG *pcx, ULONG *pcy,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync VMMDevMouseInterface *getVMMDevMouseInterface() { return &mVMMDev; }
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync DisplayMouseInterface *getDisplayMouseInterface() { return &mDisplay; }
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync /** @todo why on earth is this not implemented? */
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync void onMouseCapabilityChange(BOOL supportsAbsolute, BOOL supportsRelative,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic int pdmdrvhlpAttach(PPDMDRVINS pDrvIns, uint32_t fFlags,
de4157257515400c2c25373591135f110227b68cvboxsyncstatic struct
de4157257515400c2c25373591135f110227b68cvboxsyncstatic int mousePutEvent(PPDMIMOUSEPORT pInterface, int32_t iDeltaX,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic struct
de4157257515400c2c25373591135f110227b68cvboxsyncstatic int mousePutEventAbs(PPDMIMOUSEPORT pInterface, uint32_t uX,
de4157257515400c2c25373591135f110227b68cvboxsyncstatic void *pdmiBaseQuery(struct PDMIBASE *pInterface, const char *pszIID)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic struct
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic int setAbsoluteMouse(PPDMIVMMDEVPORT, int32_t x, int32_t y)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic int updateMouseCapabilities(PPDMIVMMDEVPORT, uint32_t, uint32_t)
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsyncvoid TestDisplay::getFramebufferDimensions(int32_t *px1, int32_t *py1,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncint TestDisplay::getScreenResolution(uint32_t cScreen, ULONG *pcx,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncDECLEXPORT(bool) CFGMR3AreValuesValid(PCFGMNODE, const char *)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync return true;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncDECLEXPORT(int) CFGMR3QueryPtr(PCFGMNODE, const char *, void **pv)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync/******************************************************************************
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync* Main test code *
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync******************************************************************************/
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic int setup(void)
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync VMMDevPort.pfnUpdateMouseCapabilities = updateMouseCapabilities;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync ppdmdrvIns = (struct PDMDRVINS *) RTMemAllocZ( sizeof(struct PDMDRVINS)
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsyncstatic void teardown(void)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync/** @test testAbsToVMMDevNewProtocol */
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic void testAbsToVMMDevNewProtocol(RTTEST hTest)
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync RTTestSub(hTest, "Absolute event to VMMDev, new protocol");
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync pConnector = (PPDMIMOUSECONNECTOR)pBase->pfnQueryInterface(pBase,
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync pConnector->pfnReportModes(pConnector, true, false, false);
8796769239832e686064138005dd1b45f038348bvboxsync pMouse->onVMMDevGuestCapsChange( VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE
7d4e1fc3835655581f938a1a387bc32049de8150vboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.x, 0x8000, 200),
7d4e1fc3835655581f938a1a387bc32049de8150vboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.y, 0x8000, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pMouse->PutMouseEventAbsolute(-319, -239, 0, 0, 0);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.x, 0, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.y, 0, 200),
7dd5b2ea2a3826ec17c0739510c1e826490d1e76vboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.x, 0xffff, 200),
d03529f7488e26f644d57a8d7daebde5b497fa72vboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.y, 0xffff, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync/** @test testAbsToVMMDevOldProtocol */
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic void testAbsToVMMDevOldProtocol(RTTEST hTest)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTestSub(hTest, "Absolute event to VMMDev, old protocol");
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pConnector = (PPDMIMOUSECONNECTOR)pBase->pfnQueryInterface(pBase,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pConnector->pfnReportModes(pConnector, true, false, false);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pMouse->onVMMDevGuestCapsChange(VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE);
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.x, 0x8000, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.y, 0x8000, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.x, 0, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.y, 0, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pMouse->PutMouseEventAbsolute(-319, -239, 0, 0, 0);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.x, -0x8000, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.y, -0x8000, 200),
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync/** @test testAbsToAbsDev */
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync RTTestSub(hTest, "Absolute event to absolute device");
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync pConnector = (PPDMIMOUSECONNECTOR)pBase->pfnQueryInterface(pBase,
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync pConnector->pfnReportModes(pConnector, false, true, false);
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync pMouse->onVMMDevGuestCapsChange( VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync RTTESTI_CHECK_MSG(approxEq(mouseEventAbs.x, 0x8000, 200),
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync RTTESTI_CHECK_MSG(approxEq(mouseEventAbs.y, 0x8000, 200),
7dd5b2ea2a3826ec17c0739510c1e826490d1e76vboxsync pMouse->PutMouseEventAbsolute(-319, -239, 0, 0, 0);
7dd5b2ea2a3826ec17c0739510c1e826490d1e76vboxsync RTTESTI_CHECK_MSG(approxEq(mouseEventAbs.x, 0, 200),
de4157257515400c2c25373591135f110227b68cvboxsync RTTESTI_CHECK_MSG(approxEq(mouseEventAbs.y, 0, 200),
de4157257515400c2c25373591135f110227b68cvboxsync RTTESTI_CHECK_MSG(approxEq(mouseEventAbs.x, 0xffff, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(mouseEventAbs.y, 0xffff, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pMouse->PutMouseEventAbsolute(-640, -480, 0, 0, 0);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync/** @todo generate this using the @test blocks above */
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync * Init the runtime, test and say hello.
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTEXITCODE rcExit = RTTestInitAndCreate("tstMouseImpl", &hTest);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync * Run the tests.
becf3c759c574f9450ebc8b558c1cca8dc8b944bvboxsync for (unsigned i = 0; g_tests[i]; ++i)