// // TestHIDEvents.m // IOHIDFamily // // Created by yg on 2/23/17. // // #import <XCTest/XCTest.h> #include "IOHIDUnitTestUtility.h" #import "IOHIDEventSystemTestController.h" #include <stddef.h> namespace base { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdocumentation" #include "IOHIDEventDataBase.h" #pragma clang diagnostic pop } #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wmacro-redefined" #include "IOHIDEventData.h" #pragma clang diagnostic pop @interface TestHIDEvents : XCTestCase @end @implementation TestHIDEvents - (void)setUp { [super setUp]; // Put setup code here. This method is called before the invocation of each test method in the class. } - (void)tearDown { // Put teardown code here. This method is called after the invocation of each test method in the class. [super tearDown]; } - (void)testKeyboardEvent { CFIndex value; IOHIDEventRef event = IOHIDEventCreateKeyboardEvent (kCFAllocatorDefault, mach_absolute_time(), kHIDUsage_GD_Keyboard, kHIDUsage_KeyboardC, 1, 0 ); HIDXCTAssertAndThrowTrue (event != NULL); XCTAssert (IOHIDEventGetType(event) == kIOHIDEventTypeKeyboard); XCTAssert (IOHIDEventConformsTo (event, kIOHIDEventTypeKeyboard)); value = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldKeyboardUsagePage); XCTAssert (value == kHIDUsage_GD_Keyboard); value = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldKeyboardUsage); XCTAssert (value == kHIDUsage_KeyboardC); value = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldKeyboardDown); XCTAssert (value == 1); IOHIDEventSetIntegerValue (event, kIOHIDEventFieldKeyboardDown, 0); value = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldKeyboardDown); XCTAssert (value == 0); CFRelease (event); } - (void)testEventFieldAccess { CFIndex intValue; IOHIDFloat floatValue; IOHIDFloat doubleValue; IOHIDEventRef event = IOHIDEventCreateDigitizerEvent(kCFAllocatorDefault, mach_absolute_time(), kIOHIDDigitizerTransducerTypeHand, 2, 2, 0, 0, 1.0, 2.0, 0.0, 0.1, 0.0, 1, 1, 0); HIDXCTAssertAndThrowTrue (event != NULL); intValue = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldDigitizerIndex); XCTAssert (intValue == 2); intValue = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldDigitizerTouch); XCTAssert (intValue == 1); intValue = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldDigitizerRange); XCTAssert (intValue == 1); IOHIDEventSetIntegerValue (event, kIOHIDEventFieldDigitizerRange, 0); intValue = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldDigitizerRange); XCTAssert (intValue == 0); floatValue = IOHIDEventGetFloatValue (event, kIOHIDEventFieldDigitizerX); XCTAssert (floatValue == 1.0); intValue = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldDigitizerX); XCTAssert (intValue == 1); doubleValue = IOHIDEventGetDoubleValue (event, kIOHIDEventFieldDigitizerX); XCTAssert (doubleValue == 1.0); IOHIDEventSetFloatValue (event, kIOHIDEventFieldDigitizerX, 2.0); floatValue = IOHIDEventGetFloatValue (event, kIOHIDEventFieldDigitizerX); XCTAssert (floatValue == 2.0); intValue = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldDigitizerX); XCTAssert (intValue == 2, "intValue: %ld (0x%lx)", intValue, intValue); doubleValue = IOHIDEventGetDoubleValue (event, kIOHIDEventFieldDigitizerX); XCTAssert (doubleValue == 2.0); IOHIDEventSetIntegerValue (event, kIOHIDEventFieldDigitizerX, 3); floatValue = IOHIDEventGetFloatValue (event, kIOHIDEventFieldDigitizerX); XCTAssert (floatValue == 3.0); intValue = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldDigitizerX); XCTAssert (intValue == 3, "intValue: %ld (0x%lx)", intValue, intValue); doubleValue = IOHIDEventGetDoubleValue (event, kIOHIDEventFieldDigitizerX); XCTAssert (doubleValue == 3.0); IOHIDEventSetFloatValue (event, kIOHIDEventFieldDigitizerX, NAN); floatValue = IOHIDEventGetFloatValue (event, kIOHIDEventFieldDigitizerX); XCTAssert (floatValue != floatValue, "floatValue: %f", floatValue); CFRelease(event); event = IOHIDEventCreateAmbientLightSensorEvent(kCFAllocatorDefault, mach_absolute_time(), 0, 0); HIDXCTAssertAndThrowTrue (event != NULL); IOHIDEventSetDoubleValue (event, kIOHIDEventFieldAmbientLightColorComponent2, 5.0); floatValue = IOHIDEventGetFloatValue (event, kIOHIDEventFieldAmbientLightColorComponent2); XCTAssert (floatValue == 5.0); intValue = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldAmbientLightColorComponent2); XCTAssert (intValue == 5); doubleValue = IOHIDEventGetDoubleValue (event, kIOHIDEventFieldAmbientLightColorComponent2); XCTAssert (doubleValue == 5.0); CFRelease(event); event = IOHIDEventCreateKeyboardEvent (kCFAllocatorDefault, mach_absolute_time(), kHIDUsage_GD_Keyboard, kHIDUsage_KeyboardC, 1, 0 ); HIDXCTAssertAndThrowTrue (event != NULL); IOHIDEventSetIntegerValue (event, kIOHIDEventFieldIsRelative, 1); intValue = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldIsRelative); XCTAssert (intValue == 1); IOHIDEventSetIntegerValue (event, kIOHIDEventFieldIsCenterOrigin, 1); intValue = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldIsCenterOrigin); XCTAssert (intValue == 1); IOHIDEventSetIntegerValue (event, kIOHIDEventFieldIsBuiltIn, 1); intValue = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldIsBuiltIn); XCTAssert (intValue == 1); IOHIDEventSetIntegerValue (event, kIOHIDEventFieldIsPixelUnits, 1); intValue = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldIsPixelUnits); XCTAssert (intValue == 1); IOHIDEventSetIntegerValue (event, kIOHIDEventFieldIsCollection, 1); intValue = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldIsCollection); XCTAssert (intValue == 1); CFRelease(event); } - (void)testEventCopy { CFIndex value; IOHIDEventRef base = IOHIDEventCreateKeyboardEvent (kCFAllocatorDefault, mach_absolute_time(), kHIDUsage_GD_Keyboard, kHIDUsage_KeyboardC, 1, 0 ); HIDXCTAssertAndThrowTrue (base != NULL); IOHIDEventRef event = IOHIDEventCreateCopy (kCFAllocatorDefault, base); HIDXCTAssertAndThrowTrue (event != NULL); XCTAssert (event != base); XCTAssert (IOHIDEventGetType(event) == kIOHIDEventTypeKeyboard); value = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldKeyboardUsagePage); XCTAssert (value == kHIDUsage_GD_Keyboard); value = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldKeyboardUsage); XCTAssert (value == kHIDUsage_KeyboardC); value = IOHIDEventGetIntegerValue (event, kIOHIDEventFieldKeyboardDown); XCTAssert (value == 1); CFRelease(event); CFRelease(base); } - (void)testEventCollection { CFIndex value; uint8_t payload [256] = {0xaa, 0x55, 0xaa, 0x55} ; IOHIDEventRef parent = IOHIDEventCreateKeyboardEvent (kCFAllocatorDefault, mach_absolute_time(), kHIDUsage_GD_Keyboard, kHIDUsage_KeyboardC, 1, 0 ); HIDXCTAssertAndThrowTrue (parent != NULL); IOHIDEventRef child = IOHIDEventCreateVendorDefinedEvent(kCFAllocatorDefault, mach_absolute_time(), kHIDUsage_GD_Keyboard, kHIDUsage_KeyboardC, 0, payload, sizeof(payload), 0); HIDXCTAssertAndThrowTrue (child != NULL); IOHIDEventAppendEvent (parent, child, 0); XCTAssert (IOHIDEventConformsTo(parent, kIOHIDEventTypeKeyboard)); XCTAssert (IOHIDEventConformsTo(parent, kIOHIDEventTypeVendorDefined)); NSArray * children = (NSArray*)IOHIDEventGetChildren (parent); XCTAssert (children && children.count); XCTAssert (IOHIDEventGetParent (child) == parent); IOHIDEventRef copy = IOHIDEventCreateCopy (kCFAllocatorDefault, parent); HIDXCTAssertAndThrowTrue (copy != NULL); children = (NSArray*)IOHIDEventGetChildren (copy); XCTAssert (children && children.count); XCTAssert (IOHIDEventConformsTo(copy, kIOHIDEventTypeKeyboard)); XCTAssert (IOHIDEventConformsTo(copy, kIOHIDEventTypeVendorDefined)); IOHIDEventRef copy_child = IOHIDEventGetEvent(copy, kIOHIDEventTypeVendorDefined); HIDXCTAssertAndThrowTrue (copy_child != NULL); XCTAssert (copy_child != child); value = IOHIDEventGetIntegerValue (copy_child, kIOHIDEventFieldVendorDefinedUsage); XCTAssert (value == kHIDUsage_KeyboardC); value = IOHIDEventGetIntegerValue (copy_child, kIOHIDEventFieldVendorDefinedUsagePage); XCTAssert (value == kHIDUsage_GD_Keyboard); value = IOHIDEventGetIntegerValue (copy_child, kIOHIDEventFieldVendorDefinedDataLength); XCTAssert (value == sizeof (payload)); uint8_t *data = IOHIDEventGetDataValue (copy_child, kIOHIDEventFieldVendorDefinedData); XCTAssert (data != NULL); XCTAssert (memcmp (data, payload, value) == 0); CFRelease (parent); CFRelease (child); CFRelease (copy); } - (void)testEventCompatibility { #include "TestHIDEventCompatibility.h" } @end