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
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>