Home | History | Annotate | Download | only in dom4
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ui/events/keycodes/dom4/keycode_converter.h"
      6 
      7 #include <map>
      8 
      9 #include "base/basictypes.h"
     10 #include "testing/gtest/include/gtest/gtest.h"
     11 
     12 using ui::KeycodeConverter;
     13 
     14 namespace {
     15 
     16 #if defined(OS_WIN)
     17 const size_t kExpectedMappedKeyCount = 138;
     18 #elif defined(OS_LINUX)
     19 const size_t kExpectedMappedKeyCount = 145;
     20 #elif defined(OS_MACOSX)
     21 const size_t kExpectedMappedKeyCount = 118;
     22 #else
     23 const size_t kExpectedMappedKeyCount = 0;
     24 #endif
     25 
     26 const uint32_t kUsbNonExistentKeycode = 0xffffff;
     27 const uint32_t kUsbUsBackslash =        0x070031;
     28 const uint32_t kUsbNonUsHash =          0x070032;
     29 
     30 TEST(UsbKeycodeMap, Basic) {
     31   ui::KeycodeConverter* key_converter = ui::KeycodeConverter::GetInstance();
     32   // Verify that the first element in the table is the "invalid" code.
     33   const ui::KeycodeMapEntry* keycode_map =
     34       key_converter->GetKeycodeMapForTest();
     35   EXPECT_EQ(key_converter->InvalidUsbKeycode(), keycode_map[0].usb_keycode);
     36   EXPECT_EQ(key_converter->InvalidNativeKeycode(),
     37             keycode_map[0].native_keycode);
     38   EXPECT_STREQ(key_converter->InvalidKeyboardEventCode(), "Unidentified");
     39   EXPECT_EQ(key_converter->InvalidNativeKeycode(),
     40             key_converter->CodeToNativeKeycode("Unidentified"));
     41 
     42   // Verify that there are no duplicate entries in the mapping.
     43   std::map<uint32_t, uint16_t> usb_to_native;
     44   std::map<uint16_t, uint32_t> native_to_usb;
     45   size_t numEntries = key_converter->NumKeycodeMapEntriesForTest();
     46   for (size_t i = 0; i < numEntries; ++i) {
     47     const ui::KeycodeMapEntry* entry = &keycode_map[i];
     48     // Don't test keys with no native keycode mapping on this platform.
     49     if (entry->native_keycode == key_converter->InvalidNativeKeycode())
     50       continue;
     51 
     52     // Verify UsbKeycodeToNativeKeycode works for this key.
     53     EXPECT_EQ(entry->native_keycode,
     54               key_converter->UsbKeycodeToNativeKeycode(entry->usb_keycode));
     55 
     56     // Verify CodeToNativeKeycode and NativeKeycodeToCode work correctly.
     57     if (entry->code) {
     58       EXPECT_EQ(entry->native_keycode,
     59                 key_converter->CodeToNativeKeycode(entry->code));
     60       EXPECT_STREQ(entry->code,
     61                    key_converter->NativeKeycodeToCode(entry->native_keycode));
     62     }
     63     else {
     64       EXPECT_EQ(key_converter->InvalidNativeKeycode(),
     65                 key_converter->CodeToNativeKeycode(entry->code));
     66     }
     67 
     68     // Verify that the USB or native codes aren't duplicated.
     69     EXPECT_EQ(0U, usb_to_native.count(entry->usb_keycode))
     70         << " duplicate of USB code 0x" << std::hex << std::setfill('0')
     71         << std::setw(6) << entry->usb_keycode
     72         << " to native 0x"
     73         << std::setw(4) << entry->native_keycode
     74         << " (previous was 0x"
     75         << std::setw(4) << usb_to_native[entry->usb_keycode]
     76         << ")";
     77     usb_to_native[entry->usb_keycode] = entry->native_keycode;
     78     EXPECT_EQ(0U, native_to_usb.count(entry->native_keycode))
     79         << " duplicate of native code 0x" << std::hex << std::setfill('0')
     80         << std::setw(4) << entry->native_keycode
     81         << " to USB 0x"
     82         << std::setw(6) << entry->usb_keycode
     83         << " (previous was 0x"
     84         << std::setw(6) << native_to_usb[entry->native_keycode]
     85         << ")";
     86     native_to_usb[entry->native_keycode] = entry->usb_keycode;
     87   }
     88   ASSERT_EQ(usb_to_native.size(), native_to_usb.size());
     89 
     90   // Verify that the number of mapped keys is what we expect, i.e. we haven't
     91   // lost any, and if we've added some then the expectation has been updated.
     92   EXPECT_EQ(kExpectedMappedKeyCount, usb_to_native.size());
     93 }
     94 
     95 TEST(UsbKeycodeMap, NonExistent) {
     96   // Verify that UsbKeycodeToNativeKeycode works for a non-existent USB keycode.
     97   ui::KeycodeConverter* key_converter = ui::KeycodeConverter::GetInstance();
     98   EXPECT_EQ(key_converter->InvalidNativeKeycode(),
     99             key_converter->UsbKeycodeToNativeKeycode(kUsbNonExistentKeycode));
    100 }
    101 
    102 TEST(UsbKeycodeMap, UsBackslashIsNonUsHash) {
    103   // Verify that UsbKeycodeToNativeKeycode treats the non-US "hash" key
    104   // as equivalent to the US "backslash" key.
    105   ui::KeycodeConverter* key_converter = ui::KeycodeConverter::GetInstance();
    106   EXPECT_EQ(key_converter->UsbKeycodeToNativeKeycode(kUsbUsBackslash),
    107             key_converter->UsbKeycodeToNativeKeycode(kUsbNonUsHash));
    108 }
    109 
    110 }  // namespace
    111