tstMouseImpl.cpp revision 442eb47642533329b286ac90dc6811476f0203fb
de4157257515400c2c25373591135f110227b68cvboxsync/* $Id$ */
de4157257515400c2c25373591135f110227b68cvboxsync/** @file
de4157257515400c2c25373591135f110227b68cvboxsync * Main unit test - Mouse class.
de4157257515400c2c25373591135f110227b68cvboxsync */
de4157257515400c2c25373591135f110227b68cvboxsync
de4157257515400c2c25373591135f110227b68cvboxsync/*
772269936494ffaddd0750ba9e28e805ba81398cvboxsync * Copyright (C) 2011-2013 Oracle Corporation
de4157257515400c2c25373591135f110227b68cvboxsync *
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.
b263fac6f6e7fa933c7bfb2a45d598fe8e458c09vboxsync */
de4157257515400c2c25373591135f110227b68cvboxsync
de4157257515400c2c25373591135f110227b68cvboxsync/******************************************************************************
772269936494ffaddd0750ba9e28e805ba81398cvboxsync* Header Files *
de4157257515400c2c25373591135f110227b68cvboxsync******************************************************************************/
de4157257515400c2c25373591135f110227b68cvboxsync#define IN_VMM_R3 /* Kill most Windows warnings on CFGMR3* implementations. */
7dd5b2ea2a3826ec17c0739510c1e826490d1e76vboxsync#include "MouseImpl.h"
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync#include "VMMDev.h"
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync#include "DisplayImpl.h"
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync#include <VBox/vmm/cfgm.h>
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync#include <VBox/vmm/pdmdrv.h>
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync#include <VBox/VMMDev.h>
78bdce9b23466b28a538c6e2f69c225d1393eb3bvboxsync#include <iprt/assert.h>
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync#include <iprt/test.h>
a5f487d264b5aebe8d28ad35d0353630bd2b77cdvboxsync
a5f487d264b5aebe8d28ad35d0353630bd2b77cdvboxsync#ifndef RT_OS_WINDOWS
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncNS_DECL_CLASSINFO(Mouse)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncNS_IMPL_THREADSAFE_ISUPPORTS1_CI(Mouse, IMouse)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync#endif
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncPDMIVMMDEVPORT VMMDevPort;
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncclass TestVMMDev : public VMMDevMouseInterface
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync PPDMIVMMDEVPORT getVMMDevPort(void) { return &VMMDevPort; }
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync};
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncclass TestDisplay : public DisplayMouseInterface
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync void getFramebufferDimensions(int32_t *px1, int32_t *py1,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync int32_t *px2, int32_t *py2);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync int getScreenResolution(uint32_t cScreen, ULONG *pcx, ULONG *pcy,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync ULONG *pcBPP);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync};
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncclass TestConsole : public ConsoleMouseInterface
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncpublic:
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,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync BOOL supportsMT, BOOL needsHostCursor) {}
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsyncprivate:
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync TestVMMDev mVMMDev;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync TestDisplay mDisplay;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync};
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic int pdmdrvhlpAttach(PPDMDRVINS pDrvIns, uint32_t fFlags,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync PPDMIBASE *ppBaseInterface)
3b1c0519f63fdaa66ef4bd15f98ff37726c65155vboxsync{
de4157257515400c2c25373591135f110227b68cvboxsync return VERR_PDM_NO_ATTACHED_DRIVER;
de4157257515400c2c25373591135f110227b68cvboxsync}
3186f45ef453b44e92adeddf57bae69632e2c66avboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic struct PDMDRVHLPR3 pdmHlpR3 =
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync PDM_DRVHLPR3_VERSION,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pdmdrvhlpAttach
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync};
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
de4157257515400c2c25373591135f110227b68cvboxsyncstatic struct
bbc0a3fc49446bf8fa1fcfe669c10875701692bcvboxsync{
de4157257515400c2c25373591135f110227b68cvboxsync int32_t cx;
03b6ba99f7d7ea26eb1f2b1a894a235b62c3b1d7vboxsync int32_t cy;
03b6ba99f7d7ea26eb1f2b1a894a235b62c3b1d7vboxsync} mouseEvent;
de4157257515400c2c25373591135f110227b68cvboxsync
de4157257515400c2c25373591135f110227b68cvboxsyncstatic int mousePutEvent(PPDMIMOUSEPORT pInterface, int32_t iDeltaX,
de4157257515400c2c25373591135f110227b68cvboxsync int32_t iDeltaY, int32_t iDeltaZ, int32_t iDeltaW,
de4157257515400c2c25373591135f110227b68cvboxsync uint32_t fButtonStates)
a50fbf5e37052d5105a3d5eb3e0a064d1e202920vboxsync{
a50fbf5e37052d5105a3d5eb3e0a064d1e202920vboxsync mouseEvent.cx = iDeltaX;
a50fbf5e37052d5105a3d5eb3e0a064d1e202920vboxsync mouseEvent.cy = iDeltaY;
3186f45ef453b44e92adeddf57bae69632e2c66avboxsync return VINF_SUCCESS;
3186f45ef453b44e92adeddf57bae69632e2c66avboxsync}
de4157257515400c2c25373591135f110227b68cvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic struct
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync int32_t x;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync int32_t y;
3186f45ef453b44e92adeddf57bae69632e2c66avboxsync} mouseEventAbs;
de4157257515400c2c25373591135f110227b68cvboxsync
de4157257515400c2c25373591135f110227b68cvboxsyncstatic int mousePutEventAbs(PPDMIMOUSEPORT pInterface, uint32_t uX,
8796769239832e686064138005dd1b45f038348bvboxsync uint32_t uY, int32_t iDeltaZ, int32_t iDeltaW,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync uint32_t fButtonStates)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync mouseEventAbs.x = uX;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync mouseEventAbs.y = uY;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync return VINF_SUCCESS;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync}
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic struct PDMIMOUSEPORT pdmiMousePort =
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync mousePutEvent,
de4157257515400c2c25373591135f110227b68cvboxsync mousePutEventAbs
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync};
de4157257515400c2c25373591135f110227b68cvboxsync
de4157257515400c2c25373591135f110227b68cvboxsyncstatic void *pdmiBaseQuery(struct PDMIBASE *pInterface, const char *pszIID)
de4157257515400c2c25373591135f110227b68cvboxsync{
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync return &pdmiMousePort;
de4157257515400c2c25373591135f110227b68cvboxsync}
de4157257515400c2c25373591135f110227b68cvboxsync
184ef19339e2cb26840653f353296c47fb2a8895vboxsyncstatic struct PDMIBASE pdmiBase =
de4157257515400c2c25373591135f110227b68cvboxsync{
de4157257515400c2c25373591135f110227b68cvboxsync pdmiBaseQuery
de4157257515400c2c25373591135f110227b68cvboxsync};
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync
297f387090f3fa07432f43790014437edbdd4bd3vboxsyncstatic struct PDMDRVINS pdmdrvInsCore =
de4157257515400c2c25373591135f110227b68cvboxsync{
184ef19339e2cb26840653f353296c47fb2a8895vboxsync PDM_DRVINS_VERSION,
de4157257515400c2c25373591135f110227b68cvboxsync 0,
184ef19339e2cb26840653f353296c47fb2a8895vboxsync NIL_RTRCPTR,
184ef19339e2cb26840653f353296c47fb2a8895vboxsync NIL_RTRCPTR,
7d4e1fc3835655581f938a1a387bc32049de8150vboxsync NIL_RTR0PTR,
7d4e1fc3835655581f938a1a387bc32049de8150vboxsync NIL_RTR0PTR,
de4157257515400c2c25373591135f110227b68cvboxsync &pdmHlpR3,
0e17b29891cd74ccbd23b28441e92ae817c2edefvboxsync NULL,
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync NULL,
297f387090f3fa07432f43790014437edbdd4bd3vboxsync NULL,
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync &pdmiBase
58e7c901bdf9c8c46e6e20a8e8b99a84e206ddf4vboxsync};
58e7c901bdf9c8c46e6e20a8e8b99a84e206ddf4vboxsync
58e7c901bdf9c8c46e6e20a8e8b99a84e206ddf4vboxsyncstatic struct PDMDRVINS *ppdmdrvIns = NULL;
de4157257515400c2c25373591135f110227b68cvboxsync
de4157257515400c2c25373591135f110227b68cvboxsyncComObjPtr<Mouse> pMouse;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncConsoleMouseInterface *pConsole = NULL;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic struct
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync int32_t x;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync int32_t y;
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync} absoluteMouse;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic int setAbsoluteMouse(PPDMIVMMDEVPORT, int32_t x, int32_t y)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
de4157257515400c2c25373591135f110227b68cvboxsync absoluteMouse.x = x;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync absoluteMouse.y = y;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync return VINF_SUCCESS;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync}
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic int updateMouseCapabilities(PPDMIVMMDEVPORT, uint32_t, uint32_t)
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync return VINF_SUCCESS;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync}
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsyncvoid TestDisplay::getFramebufferDimensions(int32_t *px1, int32_t *py1,
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync int32_t *px2, int32_t *py2)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync if (px1)
3836fdf773a1d1ad60a8ad35465259a78b9dc062vboxsync *px1 = -320;
3836fdf773a1d1ad60a8ad35465259a78b9dc062vboxsync if (py1)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync *py1 = -240;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync if (px2)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync *px2 = 320;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync if (py2)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync *py2 = 240;
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync}
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncint TestDisplay::getScreenResolution(uint32_t cScreen, ULONG *pcx,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync ULONG *pcy, ULONG *pcBPP)
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync{
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync NOREF(cScreen);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync if (pcx)
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync *pcx = 640;
3836fdf773a1d1ad60a8ad35465259a78b9dc062vboxsync if (pcy)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync *pcy = 480;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync if (pcBPP)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync *pcBPP = 32;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync return S_OK;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync}
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncDECLEXPORT(bool) CFGMR3AreValuesValid(PCFGMNODE, const char *)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync return true;
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync}
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncDECLEXPORT(int) CFGMR3QueryPtr(PCFGMNODE, const char *, void **pv)
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync{
3fe248388d5963369daa1ccc7afbaecd55a588e6vboxsync *pv = pMouse;
3fe248388d5963369daa1ccc7afbaecd55a588e6vboxsync return VINF_SUCCESS;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync}
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync/******************************************************************************
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync* Main test code *
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync******************************************************************************/
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic int setup(void)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync VMMDevPort.pfnSetAbsoluteMouse = setAbsoluteMouse;
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync VMMDevPort.pfnUpdateMouseCapabilities = updateMouseCapabilities;
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync HRESULT hrc = pMouse.createObject();
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync AssertComRC(hrc);
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync if (FAILED(hrc))
3836fdf773a1d1ad60a8ad35465259a78b9dc062vboxsync return VERR_GENERAL_FAILURE;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pConsole = new TestConsole;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pMouse->init(pConsole);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync ppdmdrvIns = (struct PDMDRVINS *) RTMemAllocZ( sizeof(struct PDMDRVINS)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync + Mouse::DrvReg.cbInstance);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync *ppdmdrvIns = pdmdrvInsCore;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync Mouse::DrvReg.pfnConstruct(ppdmdrvIns, NULL, 0);
a5f487d264b5aebe8d28ad35d0353630bd2b77cdvboxsync return VINF_SUCCESS;
a5f487d264b5aebe8d28ad35d0353630bd2b77cdvboxsync}
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsyncstatic void teardown(void)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pMouse.setNull();
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync if (pConsole)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync delete pConsole;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync if (ppdmdrvIns)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTMemFree(ppdmdrvIns);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync}
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic bool approxEq(int a, int b, int prec)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync return a - b < prec && b - a < prec;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync}
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync/** @test testAbsToVMMDevNewProtocol */
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic void testAbsToVMMDevNewProtocol(RTTEST hTest)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync PPDMIBASE pBase;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync PPDMIMOUSECONNECTOR pConnector;
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync RTTestSub(hTest, "Absolute event to VMMDev, new protocol");
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync pBase = &ppdmdrvIns->IBase;
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync pConnector = (PPDMIMOUSECONNECTOR)pBase->pfnQueryInterface(pBase,
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync PDMIMOUSECONNECTOR_IID);
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync pConnector->pfnReportModes(pConnector, true, false, false);
8796769239832e686064138005dd1b45f038348bvboxsync pMouse->onVMMDevGuestCapsChange( VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE
dc470e20d516c2332fe6821456cd7ffcc556c342vboxsync | VMMDEV_MOUSE_NEW_PROTOCOL);
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync pMouse->PutMouseEventAbsolute(0, 0, 0, 0, 0);
7d4e1fc3835655581f938a1a387bc32049de8150vboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.x, 0x8000, 200),
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync ("absoluteMouse.x=%d\n", absoluteMouse.x));
7d4e1fc3835655581f938a1a387bc32049de8150vboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.y, 0x8000, 200),
8796769239832e686064138005dd1b45f038348bvboxsync ("absoluteMouse.y=%d\n", absoluteMouse.y));
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pMouse->PutMouseEventAbsolute(-319, -239, 0, 0, 0);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.x, 0, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync ("absoluteMouse.x=%d\n", absoluteMouse.x));
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.y, 0, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync ("absoluteMouse.y=%d\n", absoluteMouse.y));
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pMouse->PutMouseEventAbsolute(320, 240, 0, 0, 0);
7dd5b2ea2a3826ec17c0739510c1e826490d1e76vboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.x, 0xffff, 200),
d03529f7488e26f644d57a8d7daebde5b497fa72vboxsync ("absoluteMouse.x=%d\n", absoluteMouse.x));
d03529f7488e26f644d57a8d7daebde5b497fa72vboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.y, 0xffff, 200),
7dd5b2ea2a3826ec17c0739510c1e826490d1e76vboxsync ("absoluteMouse.y=%d\n", absoluteMouse.y));
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTestSubDone(hTest);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync}
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync/** @test testAbsToVMMDevOldProtocol */
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic void testAbsToVMMDevOldProtocol(RTTEST hTest)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync PPDMIBASE pBase;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync PPDMIMOUSECONNECTOR pConnector;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTestSub(hTest, "Absolute event to VMMDev, old protocol");
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pBase = &ppdmdrvIns->IBase;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pConnector = (PPDMIMOUSECONNECTOR)pBase->pfnQueryInterface(pBase,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync PDMIMOUSECONNECTOR_IID);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pConnector->pfnReportModes(pConnector, true, false, false);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pMouse->onVMMDevGuestCapsChange(VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE);
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync pMouse->PutMouseEventAbsolute(320, 240, 0, 0, 0);
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.x, 0x8000, 200),
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync ("absoluteMouse.x=%d\n", absoluteMouse.x));
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.y, 0x8000, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync ("absoluteMouse.y=%d\n", absoluteMouse.y));
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pMouse->PutMouseEventAbsolute(0, 0, 0, 0, 0);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.x, 0, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync ("absoluteMouse.x=%d\n", absoluteMouse.x));
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.y, 0, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync ("absoluteMouse.y=%d\n", absoluteMouse.y));
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pMouse->PutMouseEventAbsolute(-319, -239, 0, 0, 0);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.x, -0x8000, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync ("absoluteMouse.x=%d\n", absoluteMouse.x));
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(absoluteMouse.y, -0x8000, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync ("absoluteMouse.y=%d\n", absoluteMouse.y));
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync RTTestSubDone(hTest);
be6a7ee8f237a71cf075c128e8e391e6c3654687vboxsync}
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync/** @test testAbsToAbsDev */
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsyncstatic void testAbsToAbsDev(RTTEST hTest)
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync{
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync PPDMIBASE pBase;
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync PPDMIMOUSECONNECTOR pConnector;
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync RTTestSub(hTest, "Absolute event to absolute device");
184ef19339e2cb26840653f353296c47fb2a8895vboxsync pBase = &ppdmdrvIns->IBase;
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync pConnector = (PPDMIMOUSECONNECTOR)pBase->pfnQueryInterface(pBase,
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync PDMIMOUSECONNECTOR_IID);
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync pConnector->pfnReportModes(pConnector, false, true, false);
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync pMouse->onVMMDevGuestCapsChange( VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync | VMMDEV_MOUSE_NEW_PROTOCOL);
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync pMouse->PutMouseEventAbsolute(0, 0, 0, 0, 0);
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync RTTESTI_CHECK_MSG(approxEq(mouseEventAbs.x, 0x8000, 200),
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync ("mouseEventAbs.x=%d\n", mouseEventAbs.x));
9ab5fb4455f72f3d979ff63e8789cb3241b80b52vboxsync RTTESTI_CHECK_MSG(approxEq(mouseEventAbs.y, 0x8000, 200),
3b1c0519f63fdaa66ef4bd15f98ff37726c65155vboxsync ("mouseEventAbs.y=%d\n", mouseEventAbs.y));
7dd5b2ea2a3826ec17c0739510c1e826490d1e76vboxsync pMouse->PutMouseEventAbsolute(-319, -239, 0, 0, 0);
7dd5b2ea2a3826ec17c0739510c1e826490d1e76vboxsync RTTESTI_CHECK_MSG(approxEq(mouseEventAbs.x, 0, 200),
05f96de6c3d830f3008119aee971aa7fdd728dabvboxsync ("mouseEventAbs.x=%d\n", mouseEventAbs.x));
de4157257515400c2c25373591135f110227b68cvboxsync RTTESTI_CHECK_MSG(approxEq(mouseEventAbs.y, 0, 200),
de4157257515400c2c25373591135f110227b68cvboxsync ("mouseEventAbs.y=%d\n", mouseEventAbs.y));
de4157257515400c2c25373591135f110227b68cvboxsync pMouse->PutMouseEventAbsolute(320, 240, 0, 0, 0);
de4157257515400c2c25373591135f110227b68cvboxsync RTTESTI_CHECK_MSG(approxEq(mouseEventAbs.x, 0xffff, 200),
0eeb01dea73774d9388efba3ac9ca0a1093252dcvboxsync ("mouseEventAbs.x=%d\n", mouseEventAbs.x));
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(approxEq(mouseEventAbs.y, 0xffff, 200),
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync ("mouseEventAbs.y=%d\n", mouseEventAbs.y));
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync mouseEventAbs.x = mouseEventAbs.y = 0xffff;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync pMouse->PutMouseEventAbsolute(-640, -480, 0, 0, 0);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(mouseEventAbs.x = 0xffff,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync ("mouseEventAbs.x=%d\n", mouseEventAbs.x));
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTESTI_CHECK_MSG(mouseEventAbs.y == 0xffff,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync ("mouseEventAbs.y=%d\n", mouseEventAbs.y));
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTestSubDone(hTest);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync}
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync/** @todo generate this using the @test blocks above */
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsynctypedef void (*PFNTEST)(RTTEST);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncstatic PFNTEST g_tests[] =
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync testAbsToVMMDevNewProtocol,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync testAbsToVMMDevOldProtocol,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync testAbsToAbsDev,
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync NULL
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync};
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsyncint main(void)
becf3c759c574f9450ebc8b558c1cca8dc8b944bvboxsync{
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync /*
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync * Init the runtime, test and say hello.
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync */
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTEST hTest;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTEXITCODE rcExit = RTTestInitAndCreate("tstMouseImpl", &hTest);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync if (rcExit != RTEXITCODE_SUCCESS)
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync return rcExit;
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync RTTestBanner(hTest);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync /*
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync * Run the tests.
becf3c759c574f9450ebc8b558c1cca8dc8b944bvboxsync */
becf3c759c574f9450ebc8b558c1cca8dc8b944bvboxsync for (unsigned i = 0; g_tests[i]; ++i)
7dd5b2ea2a3826ec17c0739510c1e826490d1e76vboxsync {
7dd5b2ea2a3826ec17c0739510c1e826490d1e76vboxsync int rc = setup();
de4157257515400c2c25373591135f110227b68cvboxsync AssertRC(rc);
19d5b809210ca8f1ab03a31f36eb28235621350bvboxsync if (RT_SUCCESS(rc))
19d5b809210ca8f1ab03a31f36eb28235621350bvboxsync g_tests[i](hTest);
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync teardown();
19d5b809210ca8f1ab03a31f36eb28235621350bvboxsync }
19d5b809210ca8f1ab03a31f36eb28235621350bvboxsync
19d5b809210ca8f1ab03a31f36eb28235621350bvboxsync /*
3c125fffb3ee3f0f8229db88ef5f2082ed3cc81cvboxsync * Summary
19d5b809210ca8f1ab03a31f36eb28235621350bvboxsync */
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync return RTTestSummaryAndDestroy(hTest);
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync}
bbc0a3fc49446bf8fa1fcfe669c10875701692bcvboxsync
2ff8e2b6836f4ddd408f5bf0b4377d566c55a46fvboxsync