UNPKG

sku-pg

Version:

Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!

503 lines (408 loc) 15.4 kB
<!DOCTYPE html> <html> <!-- Copyright 2007 The Closure Library Authors. All Rights Reserved. Use of this source code is governed by an Apache 2.0 License. See the COPYING file for details. --> <!-- Author: Michael Davidson (mpd@google.com) --> <head> <title>Closure Unit Tests - goog.ui.AutoComplete.InputHandler</title> <script src="../../base.js"></script> <script> goog.require('goog.events.KeyCodes'); goog.require('goog.testing.jsunit'); goog.require('goog.testing.MockClock'); goog.require('goog.ui.AutoComplete.InputHandler'); </script> </head> <body> <script> /** Mock out the input element. */ function MockElement() { goog.events.EventTarget.call(this); this.setAttributeNS = function() {}; this.setAttribute = function(key, value) { this[key] = value; }; this.focus = function() {} this.blur = function() {} this.ownerDocument = document; } goog.inherits(MockElement, goog.events.EventTarget); function MockAutoCompleter() { this.setTokenWasCalled = false; this.getTarget = function() { return mockElement }; this.setTarget = function() { }; this.setToken = function() { this.setTokenWasCalled = true; }; this.selectHilited = function() { }; this.cancelDelayedDismiss = function() { }; this.dismissOnDelay = function() {}; } /** * MockInputHandler simulates key events for testing the IME behavior of * InputHandler. */ function MockInputHandler() { goog.ui.AutoComplete.InputHandler.call(this); this.ac_ = new MockAutoCompleter(); this.cursorPosition_ = 0; this.attachInput(mockElement); } goog.inherits(MockInputHandler, goog.ui.AutoComplete.InputHandler); /** Checks for updates to the text area, should not happen during IME. */ MockInputHandler.prototype.update = function() { this.updates++; }; /** Simulates key events. */ MockInputHandler.prototype.fireKeyEvents = function(keyCode, down, press, up) { if (down) this.fireEvent('keydown', keyCode); if (press) this.fireEvent('keypress', keyCode); if (up) this.fireEvent('keyup', keyCode); }; /** Simulates an event. */ MockInputHandler.prototype.fireEvent = function(type, keyCode) { var e = {}; e.type = type; e.keyCode = keyCode; e.preventDefault = function() {}; if (!goog.userAgent.IE) { e.which = type == 'keydown' ? keyCode : 0; } e = new goog.events.BrowserEvent(e); mockElement.dispatchEvent(e); }; MockInputHandler.prototype.setCursorPosition = function(cursorPosition) { this.cursorPosition_ = cursorPosition; }; MockInputHandler.prototype.getCursorPosition = function() { return this.cursorPosition_; }; // Variables used by all test var mh = null; var oldMac, oldWin, oldLinux, oldIe, oldFf, oldWebkit, oldVersion; var oldUsesKeyDown; var mockElement; var mockClock; function setUp() { oldMac = goog.userAgent.MAC; oldWin = goog.userAgent.WINDOWS; oldLinux = goog.userAgent.LINUX; oldIe = goog.userAgent.IE; oldFf = goog.userAgent.GECKO; oldWebkit = goog.userAgent.WEBKIT; oldVersion = goog.userAgent.VERSION; oldUsesKeyDown = goog.events.KeyHandler.USES_KEYDOWN_; mockClock = new goog.testing.MockClock(true); mockElement = new MockElement; mh = new MockInputHandler; } function tearDown() { goog.userAgent.MAC = oldMac; goog.userAgent.WINDOWS = oldWin; goog.userAgent.LINUX = oldLinux; goog.userAgent.IE = oldIe; goog.userAgent.GECKO = oldFf; goog.userAgent.WEBKIT = oldWebkit; goog.userAgent.VERSION = oldVersion; goog.events.KeyHandler.USES_KEYDOWN_ = oldUsesKeyDown; mockClock.dispose(); mockElement.dispose(); } /** Used to simulate behavior of Windows/Firefox3 */ function simulateWinFirefox3() { goog.userAgent.MAC = false; goog.userAgent.WINDOWS = true; goog.userAgent.LINUX = false; goog.userAgent.IE = false; goog.userAgent.GECKO = true; goog.userAgent.WEBKIT = false; goog.events.KeyHandler.USES_KEYDOWN_ = false; } /** Used to simulate behavior of Windows/InternetExplorer7 */ function simulateWinIe7() { goog.userAgent.MAC = false; goog.userAgent.WINDOWS = true; goog.userAgent.LINUX = false; goog.userAgent.IE = true; goog.userAgent.GECKO = false; goog.userAgent.WEBKIT = false; goog.events.KeyHandler.USES_KEYDOWN_ = true; } /** Used to simulate behavior of Windows/Chrome */ function simulateWinChrome() { goog.userAgent.MAC = false; goog.userAgent.WINDOWS = true; goog.userAgent.LINUX = false; goog.userAgent.IE = false; goog.userAgent.GECKO = false; goog.userAgent.WEBKIT = true; goog.userAgent.VERSION = '525'; goog.events.KeyHandler.USES_KEYDOWN_ = true; } /** Used to simulate behavior of Mac/Firefox3 */ function simulateMacFirefox3() { goog.userAgent.MAC = true; goog.userAgent.WINDOWS = false; goog.userAgent.LINUX = false; goog.userAgent.IE = false; goog.userAgent.GECKO = true; goog.userAgent.WEBKIT = false; goog.events.KeyHandler.USES_KEYDOWN_ = true; } /** Used to simulate behavior of Mac/Safari3 */ function simulateMacSafari3() { goog.userAgent.MAC = true; goog.userAgent.WINDOWS = false; goog.userAgent.LINUX = false; goog.userAgent.IE = false; goog.userAgent.GECKO = false; goog.userAgent.WEBKIT = true; goog.userAgent.VERSION = '525'; goog.events.KeyHandler.USES_KEYDOWN_ = true; } /** Used to simulate behavior of Linux/Firefox3 */ function simulateLinuxFirefox3() { goog.userAgent.MAC = false; goog.userAgent.WINDOWS = false; goog.userAgent.LINUX = true; goog.userAgent.IE = false; goog.userAgent.GECKO = true; goog.userAgent.WEBKIT = false; goog.events.KeyHandler.USES_KEYDOWN_ = true; } /** Test the normal, non-IME case */ function testRegularKey() { // Each key fires down, press, and up in that order, and each should // trigger an autocomplete update assertFalse('IME should not be triggered', mh.waitingForIme_); mh.fireKeyEvents(goog.events.KeyCodes.K, true, true, true); assertFalse('IME should not be triggered by K', mh.waitingForIme_); mh.fireKeyEvents(goog.events.KeyCodes.A, true, true, true); assertFalse('IME should not be triggered by A', mh.waitingForIme_); } /** * This test simulates the key inputs generated by pressing * '<ime_on>a<enter>i<ime_off>u' using the Japanese IME * on Windows/Firefox3. */ function testImeWinFirefox3() { simulateWinFirefox3(); mh.fireEvent('focus', ''); assertFalse('IME should not be triggered', mh.waitingForIme_); // ime_on // a mh.fireKeyEvents(goog.events.KeyCodes.WIN_IME, true, true, false); // Event is not generated for key code a. assertTrue('IME should be triggered', mh.waitingForIme_); // enter mh.fireKeyEvents(goog.events.KeyCodes.ENTER, false, false, true); assertFalse('IME should not be triggered', mh.waitingForIme_); // i mh.fireKeyEvents(goog.events.KeyCodes.WIN_IME, true, true, false); // Event is not generated for key code i. assertTrue('IME should be triggered', mh.waitingForIme_); // ime_off // u mh.fireKeyEvents(goog.events.KeyCodes.U, true, true, true); assertFalse('IME should not be triggered', mh.waitingForIme_); mh.fireEvent('blur', ''); } /** * This test simulates the key inputs generated by pressing * '<ime_on>a<enter>i<ime_off>u' using the Japanese IME * on Windows/InternetExplorer7. */ function testImeWinIe7() { simulateWinIe7(); mh.fireEvent('focus', ''); assertFalse('IME should not be triggered', mh.waitingForIme_); // ime_on // a mh.fireKeyEvents(goog.events.KeyCodes.WIN_IME, true, false, false); mh.fireKeyEvents(goog.events.KeyCodes.A, false, false, true); assertTrue('IME should be triggered', mh.waitingForIme_); // enter mh.fireKeyEvents(goog.events.KeyCodes.WIN_IME, true, false, false); mh.fireKeyEvents(goog.events.KeyCodes.ENTER, false, false, true); assertFalse('IME should not be triggered', mh.waitingForIme_); // i mh.fireKeyEvents(goog.events.KeyCodes.WIN_IME, true, false, false); mh.fireKeyEvents(goog.events.KeyCodes.I, false, false, true); assertTrue('IME should be triggered', mh.waitingForIme_); // ime_off // u mh.fireKeyEvents(goog.events.KeyCodes.U, true, true, true); assertFalse('IME should not be triggered', mh.waitingForIme_); mh.fireEvent('blur', ''); } /** * This test simulates the key inputs generated by pressing * '<ime_on>a<enter>i<ime_off>u' using the Japanese IME * on Windows/Chrome. */ function testImeWinChrome() { simulateWinChrome(); mh.fireEvent('focus', ''); assertFalse('IME should not be triggered', mh.waitingForIme_); // ime_on // a mh.fireKeyEvents(goog.events.KeyCodes.WIN_IME, true, false, false); mh.fireKeyEvents(goog.events.KeyCodes.A, false, false, true); assertTrue('IME should be triggered', mh.waitingForIme_); // enter mh.fireKeyEvents(goog.events.KeyCodes.WIN_IME, true, false, false); mh.fireKeyEvents(goog.events.KeyCodes.ENTER, false, false, true); assertFalse('IME should not be triggered', mh.waitingForIme_); // i mh.fireKeyEvents(goog.events.KeyCodes.WIN_IME, true, false, false); mh.fireKeyEvents(goog.events.KeyCodes.I, false, false, true); assertTrue('IME should be triggered', mh.waitingForIme_); // ime_off // u mh.fireKeyEvents(goog.events.KeyCodes.U, true, true, true); assertFalse('IME should not be triggered', mh.waitingForIme_); mh.fireEvent('blur', ''); } /** * This test simulates the key inputs generated by pressing * '<ime_on>a<enter>i<ime_off>u' using the Japanese IME * on Mac/Firefox3. */ function testImeMacFirefox3() { // TODO(user): Currently our code cannot distinguish preedit characters // from normal ones for Mac/Firefox3. // Enable this test after we fix it. simulateMacFirefox3(); mh.fireEvent('focus', ''); assertFalse('IME should not be triggered', mh.waitingForIme_); // ime_on // a mh.fireKeyEvents(goog.events.KeyCodes.WIN_IME, true, true, false); assertTrue('IME should be triggered', mh.waitingForIme_); mh.fireKeyEvents(goog.events.KeyCodes.A, true, false, true); assertTrue('IME should be triggered', mh.waitingForIme_); // enter mh.fireKeyEvents(goog.events.KeyCodes.ENTER, true, true, true); assertFalse('IME should not be triggered', mh.waitingForIme_); // i mh.fireKeyEvents(goog.events.KeyCodes.WIN_IME, true, true, false); mh.fireKeyEvents(goog.events.KeyCodes.I, true, false, true); assertTrue('IME should be triggered', mh.waitingForIme_); // ime_off // u mh.fireKeyEvents(goog.events.KeyCodes.U, true, true, true); assertFalse('IME should not be triggered', mh.waitingForIme_); mh.fireEvent('blur', ''); } /** * This test simulates the key inputs generated by pressing * '<ime_on>a<enter>i<ime_off>u' using the Japanese IME * on Mac/Safari3. */ function testImeMacSafari3() { simulateMacSafari3(); mh.fireEvent('focus', ''); assertFalse('IME should not be triggered', mh.waitingForIme_); // ime_on // a mh.fireKeyEvents(goog.events.KeyCodes.WIN_IME, true, false, false); mh.fireKeyEvents(goog.events.KeyCodes.A, false, false, true); assertTrue('IME should be triggered', mh.waitingForIme_); // enter mh.fireKeyEvents(goog.events.KeyCodes.WIN_IME, true, false, false); mh.fireKeyEvents(goog.events.KeyCodes.ENTER, false, false, true); assertFalse('IME should not be triggered', mh.waitingForIme_); // i mh.fireKeyEvents(goog.events.KeyCodes.WIN_IME, true, false, false); mh.fireKeyEvents(goog.events.KeyCodes.I, false, false, true); assertTrue('IME should be triggered', mh.waitingForIme_); // ime_off // u mh.fireKeyEvents(goog.events.KeyCodes.U, true, true, true); assertFalse('IME should not be triggered', mh.waitingForIme_); mh.fireEvent('blur', ''); } /** * This test simulates the key inputs generated by pressing * '<ime_on>a<enter>i<ime_off>u' using the Japanese IME * on Linux/Firefox3. */ function testImeLinuxFirefox3() { // TODO(user): Currently our code cannot distinguish preedit characters // from normal ones for Linux/Firefox3. // Enable this test after we fix it. simulateLinuxFirefox3(); mh.fireEvent('focus', ''); assertFalse('IME should not be triggered', mh.waitingForIme_); // ime_on mh.fireKeyEvents(goog.events.KeyCodes.WIN_IME, true, true, false); // a mh.fireKeyEvents(goog.events.KeyCodes.A, true, false, true); assertTrue('IME should be triggered', mh.waitingForIme_); // enter mh.fireKeyEvents(goog.events.KeyCodes.ENTER, true, true, true); assertFalse('IME should not be triggered', mh.waitingForIme_); // i mh.fireKeyEvents(goog.events.KeyCodes.WIN_IME, true, true, false); mh.fireKeyEvents(goog.events.KeyCodes.I, true, false, true); assertTrue('IME should be triggered', mh.waitingForIme_); // ime_off // u mh.fireKeyEvents(goog.events.KeyCodes.U, true, true, true); assertFalse('IME should not be triggered', mh.waitingForIme_); mh.fireEvent('blur', ''); } /** * Make sure that the active element handling works. */ function testActiveElement() { assertNull(mh.activeElement_); mockElement.dispatchEvent('keydown'); assertEquals(mockElement, mh.activeElement_); mockElement.dispatchEvent('blur'); assertNull(mh.activeElement_); mockElement.dispatchEvent('focus'); assertEquals(mockElement, mh.activeElement_); mh.detachInput(mockElement); assertNull(mh.activeElement_); } function testUpdateDoesNotTriggerSetTokenForSelectRow() { var ih = new goog.ui.AutoComplete.InputHandler(); // Set up our input handler with the necessary mocks var mockAutoCompleter = new MockAutoCompleter(); ih.ac_ = mockAutoCompleter; ih.activeElement_ = mockElement; var row = {}; ih.selectRow(row, false); ih.update(); assertFalse('update should not call setToken on selectRow', mockAutoCompleter.setTokenWasCalled); ih.update(); assertFalse('update should not call setToken on selectRow', mockAutoCompleter.setTokenWasCalled); } function testSetTokenText() { var ih = new MockInputHandler(); // Set up our input handler with the necessary mocks var mockAutoCompleter = new MockAutoCompleter(); ih.ac_ = mockAutoCompleter; ih.activeElement_ = mockElement; mockElement.value = 'bob, wal, joey'; ih.setCursorPosition(8); ih.setTokenText('waldo', true /* multi-row */); assertEquals('bob, waldo, joey', mockElement.value); } function testGetThrottleTime() { var ih = new goog.ui.AutoComplete.InputHandler(); ih.setThrottleTime(999); assertEquals('throttle time set+get', 999, ih.getThrottleTime()); } function testGetUpdateDuringTyping() { var ih = new goog.ui.AutoComplete.InputHandler(); ih.setUpdateDuringTyping(false); assertFalse('update during typing set+get', ih.getUpdateDuringTyping()); } </script> </body> </html>