| // Copyright 2010-2015, Google Inc. |
| // All rights reserved. |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are |
| // met: |
| // |
| // * Redistributions of source code must retain the above copyright |
| // notice, this list of conditions and the following disclaimer. |
| // * Redistributions in binary form must reproduce the above |
| // copyright notice, this list of conditions and the following disclaimer |
| // in the documentation and/or other materials provided with the |
| // distribution. |
| // * Neither the name of Google Inc. nor the names of its |
| // contributors may be used to endorse or promote products derived from |
| // this software without specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| /** |
| * @fileoverview This file contains unit tests of nacl_mozc.js. |
| * |
| */ |
| |
| 'use strict'; |
| |
| var keyTranslator = null; |
| var pressedKeys = null; |
| var isKanaMode = false; |
| var keyboardLayout = ''; |
| |
| function setUp() { |
| keyTranslator = new mozc.KeyTranslator(); |
| pressedKeys = {}; |
| isKanaMode = false; |
| keyboardLayout = 'us'; |
| } |
| |
| function tearDown() { |
| keyTranslator = null; |
| pressedKeys = null; |
| isKanaMode = false; |
| keyboardLayout = ''; |
| } |
| |
| function setKanaMode(newKanaMode) { |
| isKanaMode = newKanaMode; |
| } |
| |
| function setKeyboardLayout(newLayout) { |
| keyboardLayout = newLayout; |
| } |
| |
| function keyDown(code, key) { |
| var result = |
| keyTranslator.translateKeyEvent({ |
| type: 'keydown', |
| altKey: (pressedKeys['AltLeft'] || pressedKeys['AltRight']), |
| ctrlKey: (pressedKeys['ControlLeft'] || pressedKeys['ControlRight']), |
| shiftKey: (pressedKeys['ShiftLeft'] || pressedKeys['ShiftRight']), |
| code: code, |
| key: key |
| }, isKanaMode, keyboardLayout); |
| pressedKeys[code] = true; |
| return result; |
| } |
| |
| function keyUp(code, key, isKana, layout) { |
| var result = |
| keyTranslator.translateKeyEvent({ |
| type: 'keyup', |
| altKey: (pressedKeys['AltLeft'] || pressedKeys['AltRight']), |
| ctrlKey: (pressedKeys['ControlLeft'] || pressedKeys['ControlRight']), |
| shiftKey: (pressedKeys['ShiftLeft'] || pressedKeys['ShiftRight']), |
| code: code, |
| key: key |
| }, isKanaMode, keyboardLayout); |
| pressedKeys[code] = false; |
| return result; |
| } |
| |
| function testTranslateKey_Space() { |
| assertObjectEquals({special_key: 'SPACE'}, keyDown('Space', ' ')); |
| assertObjectEquals({}, keyUp('Space', ' ')); |
| } |
| |
| function testTranslateKey_F1() { |
| assertObjectEquals({special_key: 'F1'}, keyDown('', 'HistoryBack')); |
| assertObjectEquals({}, keyUp('', 'HistoryBack')); |
| } |
| |
| function testTranslateKey_CtrlLeft() { |
| assertObjectEquals({}, keyDown('ControlLeft', 'Ctrl')); |
| assertObjectEquals({modifier_keys: ['CTRL']}, keyUp('ControlLeft', 'Ctrl')); |
| } |
| |
| function testTranslateKey_CtrlRight() { |
| assertObjectEquals({}, keyDown('ControlRight', 'Ctrl')); |
| assertObjectEquals({modifier_keys: ['CTRL']}, keyUp('ControlRight', 'Ctrl')); |
| } |
| |
| function testTranslateKey_ShiftLeft() { |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({modifier_keys: ['SHIFT']}, keyUp('ShiftLeft', 'Shift')); |
| } |
| |
| function testTranslateKey_ShiftRight() { |
| assertObjectEquals({}, keyDown('ShiftRight', 'Shift')); |
| assertObjectEquals({modifier_keys: ['SHIFT']}, keyUp('ShiftRight', 'Shift')); |
| } |
| |
| function testTranslateKey_Ctrl_Shift() { |
| // Ctrl down, Shift down, Shift up, Ctrl up |
| assertObjectEquals({}, keyDown('ControlLeft', 'Ctrl')); |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({}, keyUp('ShiftLeft', 'Shift')); |
| assertObjectEquals({modifier_keys: ['CTRL', 'SHIFT']}, |
| keyUp('ControlLeft', 'Ctrl')); |
| // Ctrl down, Shift down, Ctrl up, Shift up |
| assertObjectEquals({}, keyDown('ControlLeft', 'Ctrl')); |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({}, keyUp('ControlLeft', 'Ctrl')); |
| assertObjectEquals({modifier_keys: ['CTRL', 'SHIFT']}, |
| keyUp('ShiftLeft', 'Shift')); |
| } |
| |
| function testTranslateKey_A() { |
| assertObjectEquals({key_code: 97}, keyDown('KeyA', 'a')); |
| assertObjectEquals({}, keyUp('KeyA', 'a')); |
| } |
| |
| function testTranslateKey_Ctrl_Bs() { |
| // Ctrl down, BS down, BS up, Ctrl up |
| assertObjectEquals({}, keyDown('ControlLeft', 'Ctrl')); |
| assertObjectEquals({special_key: 'BACKSPACE', modifier_keys: ['CTRL']}, |
| keyDown('Backspace', 'Backspace')); |
| assertObjectEquals({}, keyUp('Backspace', 'Backspace')); |
| assertObjectEquals({}, keyUp('ControlLeft', 'Ctrl')); |
| } |
| |
| function testTranslateKey_Ctrl_Shift_Bs() { |
| // Ctrl down, Shift down, BS down, BS up,Shift up, Ctrl up |
| assertObjectEquals({}, keyDown('ControlLeft', 'Ctrl')); |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({ |
| special_key: 'BACKSPACE', |
| modifier_keys: ['CTRL', 'SHIFT']}, |
| keyDown('Backspace', 'Backspace')); |
| assertObjectEquals({}, keyUp('Backspace', 'Backspace')); |
| assertObjectEquals({}, keyUp('ShiftLeft', 'Shift')); |
| // TODO(horo): This behavior is same as Mac Mozc. But it shoud be |
| // assertObjectEquals({}, keyUp('ControlLeft', 'Ctrl')); |
| assertObjectEquals({modifier_keys: ['CTRL']}, keyUp('ControlLeft', 'Ctrl')); |
| } |
| |
| function testTranslateKey_Shift_A() { |
| // Shift + 'a' |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({key_code: 'A'.charCodeAt(0)}, keyDown('KeyA', 'a')); |
| assertObjectEquals({}, keyUp('KeyA', 'a')); |
| assertObjectEquals({}, keyUp('ShiftLeft', 'Shift')); |
| } |
| |
| function testTranslateKey_Ctrl_A() { |
| // Ctrl + 'a' |
| assertObjectEquals({}, keyDown('ControlLeft', 'Control')); |
| assertObjectEquals({key_code: 'a'.charCodeAt(0), modifier_keys: ['CTRL']}, |
| keyDown('KeyA', 'a')); |
| assertObjectEquals({}, keyUp('KeyA', 'a')); |
| assertObjectEquals({}, keyUp('ControlLeft', 'Control')); |
| } |
| |
| function testTranslateKey_Ctrl_Alt_A() { |
| // Ctrl down, Alt down, a down, a up, Alt up, Ctrl up |
| assertObjectEquals({}, keyDown('ControlLeft', 'Control')); |
| assertObjectEquals({}, keyDown('AltLeft', 'Alt')); |
| assertObjectEquals({ |
| key_code: 'a'.charCodeAt(0), |
| modifier_keys: ['ALT', 'CTRL'] |
| }, |
| keyDown('KeyA', 'a')); |
| assertObjectEquals({}, keyUp('KeyA', 'a')); |
| assertObjectEquals({}, keyUp('AltLeft', 'Alt')); |
| assertObjectEquals({modifier_keys: ['CTRL']}, |
| keyUp('ControlLeft', 'Control')); |
| } |
| |
| function testTranslateKey_Ctrl_Shift_A() { |
| // Ctrl down, Shift down, a down, a up, Shift up, Ctrl up |
| assertObjectEquals({}, keyDown('ControlLeft', 'Control')); |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({ |
| key_code: 'a'.charCodeAt(0), |
| modifier_keys: ['CTRL', 'SHIFT'] |
| }, |
| keyDown('KeyA', 'a')); |
| assertObjectEquals({}, keyUp('KeyA', 'a')); |
| assertObjectEquals({}, keyUp('ShiftLeft', 'Shift')); |
| assertObjectEquals({modifier_keys: ['CTRL']}, |
| keyUp('ControlLeft', 'Control')); |
| } |
| |
| function testTakingScreenShotKey() { |
| assertObjectEquals({special_key: 'F5'}, keyDown('', 'ChromeOSSwitchWindow')); |
| |
| assertObjectEquals({}, keyDown('AltLeft', 'Alt')); |
| assertObjectEquals({special_key: 'F5', modifier_keys: ['ALT']}, |
| keyDown('', 'ChromeOSSwitchWindow')); |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({special_key: 'F5', modifier_keys: ['ALT', 'SHIFT']}, |
| keyDown('', 'ChromeOSSwitchWindow')); |
| assertObjectEquals({}, keyUp('AltLeft', 'Alt')); |
| assertObjectEquals({special_key: 'F5', modifier_keys: ['SHIFT']}, |
| keyDown('', 'ChromeOSSwitchWindow')); |
| assertObjectEquals({}, keyUp('ShiftLeft', 'Shift')); |
| |
| |
| assertObjectEquals({}, keyDown('ControlLeft', 'Control')); |
| assertObjectEquals({}, keyDown('AltLeft', 'Alt')); |
| assertObjectEquals({}, keyDown('', 'ChromeOSSwitchWindow')); |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({}, keyDown('', 'ChromeOSSwitchWindow')); |
| assertObjectEquals({}, keyUp('AltLeft', 'Alt')); |
| assertObjectEquals({}, keyDown('', 'ChromeOSSwitchWindow')); |
| assertObjectEquals({}, keyUp('ShiftLeft', 'Shift')); |
| assertObjectEquals({modifier_keys: ['ALT', 'CTRL', 'SHIFT']}, |
| keyUp('ControlLeft', 'Control')); |
| } |
| |
| function testDigit6Key_US() { |
| assertObjectEquals({key_code: '6'.charCodeAt(0)}, keyDown('Digit6', '6')); |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({key_code: '^'.charCodeAt(0)}, keyDown('Digit6', '^')); |
| } |
| |
| function testDigit6Key_JP() { |
| setKeyboardLayout('jp'); |
| assertObjectEquals({key_code: '6'.charCodeAt(0)}, keyDown('Digit6', '6')); |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({key_code: '&'.charCodeAt(0)}, keyDown('Digit6', '&')); |
| } |
| |
| function testDigit6Key_US_KANA() { |
| setKanaMode(true); |
| assertObjectEquals({ |
| key_code: '6'.charCodeAt(0), |
| key_string: '\u304A' // 'お' |
| }, |
| keyDown('Digit6', '6')); |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({ |
| key_code: '^'.charCodeAt(0), |
| key_string: '\u3049' // 'ぉ' |
| }, |
| keyDown('Digit6', '^')); |
| } |
| |
| function testDigit6Key_JP_KANA() { |
| setKanaMode(true); |
| setKeyboardLayout('jp'); |
| assertObjectEquals({ |
| key_code: '6'.charCodeAt(0), |
| key_string: '\u304A' // 'お' |
| }, |
| keyDown('Digit6', '6')); |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({ |
| key_code: '&'.charCodeAt(0), |
| key_string: '\u3049' // 'ぉ' |
| }, |
| keyDown('Digit6', '&')); |
| } |
| |
| function testBackquoteKey_US() { |
| assertObjectEquals({key_code: '`'.charCodeAt(0)}, keyDown('Backquote', '`')); |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({key_code: '~'.charCodeAt(0)}, keyDown('Backquote', '~')); |
| } |
| |
| function testBackquoteKey_JP() { |
| setKeyboardLayout('jp'); |
| assertObjectEquals({}, keyDown('Backquote', '')); |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({modifier_keys: ['SHIFT']}, keyDown('Backquote', '')); |
| } |
| |
| function testBackquoteKey_US_KANA() { |
| setKanaMode(true); |
| assertObjectEquals({ |
| key_code: '`'.charCodeAt(0), |
| key_string: '\u308D' // 'ろ' |
| }, |
| keyDown('Backquote', '`')); |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({ |
| key_code: '~'.charCodeAt(0), |
| key_string: '\u308D' // 'ろ' |
| }, |
| keyDown('Backquote', '~')); |
| } |
| |
| function testBackquoteKey_JP_KANA() { |
| setKanaMode(true); |
| setKeyboardLayout('jp'); |
| assertObjectEquals({}, keyDown('Backquote', '')); |
| assertObjectEquals({}, keyDown('ShiftLeft', 'Shift')); |
| assertObjectEquals({modifier_keys: ['SHIFT']}, keyDown('Backquote', '')); |
| } |
| |
| function testConvertAndNoConvertKey_US() { |
| assertObjectEquals({}, keyDown('Convert', '`')); |
| assertObjectEquals({}, keyDown('NoConvert', '`')); |
| } |
| |
| function testConvertAndNoConvertKey_JP() { |
| setKeyboardLayout('jp'); |
| assertObjectEquals({}, keyDown('Convert', '`')); |
| assertObjectEquals({}, keyDown('NoConvert', '`')); |
| } |