sku-pg
Version:
Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!
281 lines (241 loc) • 8.77 kB
HTML
<html>
<!--
Copyright 2010 The Closure Library Authors. All Rights Reserved.
Use of this source code is governed by the Apache License, Version 2.0.
See the COPYING file for details.
Author: agrieve@google.com (Andrew Grieve)
-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Closure Unit Tests - goog.tweak.TweakUi</title>
<script src="../base.js"></script>
<script>
goog.require('goog.dom');
goog.require('goog.string');
goog.require('goog.testing.jsunit');
goog.require('goog.tweak.TweakUi');
goog.require('goog.tweak.testhelpers');
</script>
<link rel="stylesheet" type="text/css" href="../css/common.css">
</head>
<body>
<div id="root"></div>
<script>
var root = document.getElementById('root');
var registry;
var EXPECTED_ENTRIES_COUNT = 14;
function setUp() {
// Make both test cases use the same entries in order to be able to test that
// having two UIs on the same page does not cause trouble.
createRegistryEntries('');
registry = goog.tweak.getRegistry();
}
function tearDown() {
goog.tweak.activeBooleanGroup_ = null;
// When debugging a single test, don't clear out the DOM.
if (window.location.search.indexOf('runTests') == -1) {
root.innerHTML = '';
}
}
function tearDownPage() {
// When debugging a single test, don't clear out the DOM.
if (window.location.search.indexOf('runTests') != -1) {
return;
}
// Create both registries for interactive testing.
createRegistryEntries('');
registry = goog.tweak.getRegistry();
// Add an extra tweak for testing the creation of tweaks after the UI has
// already been rendered.
var entryCounter = 0;
goog.tweak.registerButton('CreateNewTweak', 'Creates a new tweak. Meant ' +
'to simulate a tweak being registered in a lazy-loaded module.',
function() {
goog.tweak.registerBoolean('Lazy' + ++entryCounter, 'Lazy-loaded tweak.');
});
goog.tweak.registerButton('CreateNewTweakInNamespace1',
'Creates a new tweak within a namespace. Meant to simulate a tweak ' +
'being registered in a lazy-loaded module.', function() {
goog.tweak.registerString('foo.bar.Lazy' + ++entryCounter,
'Lazy-loaded tweak.');
});
goog.tweak.registerButton('CreateNewTweakInNamespace2',
'Creates a new tweak within a namespace. Meant to simulate a tweak ' +
'being registered in a lazy-loaded module.', function() {
goog.tweak.registerNumber('foo.bar.baz.Lazy' + ++entryCounter, 'Lazy combo',
3, {
validValues: [1, 2, 3],
label: 'Lazy!'
});
});
var label = document.createElement('h3');
label.innerHTML = 'TweakUi:';
root.appendChild(label);
createUi(false);
label = document.createElement('h3');
label.innerHTML = 'Collapsible:';
root.appendChild(label);
createUi(true);
}
function createUi(collapsible) {
var tweakUiElem = collapsible ? goog.tweak.TweakUi.createCollapsible() :
goog.tweak.TweakUi.create();
root.appendChild(tweakUiElem);
}
function getAllEntryDivs() {
return goog.dom.getElementsByTagNameAndClass('div',
goog.tweak.TweakUi.ENTRY_CSS_CLASS_);
}
function getEntryDiv(entry) {
var label = goog.tweak.TweakUi.getNamespacedLabel_(entry);
var allDivs = getAllEntryDivs();
var ret;
for (var i = 0, div; div = allDivs[i]; i++) {
var divText = goog.dom.getTextContent(div);
if (goog.string.startsWith(divText, label) &&
goog.string.contains(divText, entry.description)) {
assertFalse('Found multiple divs matching entry ' + entry.getId(), !!ret);
ret = div;
}
}
assertTrue('getEntryDiv failed for ' + entry.getId(), !!ret);
return ret;
}
function getEntryInput(entry) {
var div = getEntryDiv(entry);
return div.getElementsByTagName('input')[0] ||
div.getElementsByTagName('select')[0];
}
function testCreate() {
createUi(false);
assertEquals('Wrong number of entry divs.', EXPECTED_ENTRIES_COUNT,
getAllEntryDivs().length);
assertFalse('checkbox should not be checked 1',
getEntryInput(boolEntry).checked);
assertTrue('checkbox should be checked 2',
getEntryInput(boolEntry2).checked);
// Enusre custom labels are being used.
var html = document.getElementsByTagName('button')[0].innerHTML;
assertTrue('Button label is wrong', html.indexOf('<btn>') > -1);
html = getEntryDiv(numEnumEntry).innerHTML;
assertTrue('Enum2 label is wrong', html.indexOf('second&') > -1);
}
function testToggleBooleanSetting() {
boolEntry.setValue(true);
createUi(false);
assertTrue('checkbox should be checked',
getEntryInput(boolEntry).checked);
boolEntry.setValue(false);
assertFalse('checkbox should not be checked 1',
getEntryInput(boolEntry).checked);
}
function testToggleStringSetting() {
strEntry.setValue('val1');
createUi(false);
assertEquals('Textbox has wrong value 1',
'val1', getEntryInput(strEntry).value);
strEntry.setValue('val2');
assertEquals('Textbox has wrong value 2',
'val2', getEntryInput(strEntry).value);
}
function testToggleStringEnumSetting() {
strEnumEntry.setValue('B');
createUi(false);
assertEquals('wrong value 1',
'B', getEntryInput(strEnumEntry).value);
strEnumEntry.setValue('C');
assertEquals('wrong value 2',
'C', getEntryInput(strEnumEntry).value);
}
function testToggleNumericSetting() {
numEntry.setValue(3);
createUi(false);
assertEquals('wrong value 1',
'3', getEntryInput(numEntry).value);
numEntry.setValue(4);
assertEquals('wrong value 2',
'4', getEntryInput(numEntry).value);
}
function testToggleNumericEnumSetting() {
numEnumEntry.setValue(2);
createUi(false);
assertEquals('wrong value 1',
'2', getEntryInput(numEnumEntry).value);
numEnumEntry.setValue(3);
assertEquals('wrong value 2',
'3', getEntryInput(numEnumEntry).value);
}
function testClickBooleanSetting() {
createUi(false);
var input = getEntryInput(boolEntry);
input.checked = true;
input.onchange();
assertTrue('setting should be true', boolEntry.getNewValue());
input.checked = false;
input.onchange();
assertFalse('setting should be false', boolEntry.getNewValue());
}
function testToggleDescriptions() {
createUi(false);
var toggleLink = root.getElementsByTagName('a')[0];
var heightBefore = root.offsetHeight;
toggleLink.onclick();
assertTrue('Expected div height to grow from toggle descriptions.',
root.offsetHeight > heightBefore);
toggleLink.onclick();
assertEquals('Expected div height to revert from toggle descriptions.',
heightBefore, root.offsetHeight);
}
function assertEntryOrder(entryId1, entryId2) {
var entry1 = registry.getEntry(entryId1);
var entry2 = registry.getEntry(entryId2);
var div1 = getEntryDiv(entry1);
var div2 = getEntryDiv(entry2);
var order = goog.dom.compareNodeOrder(div1, div2);
assertTrue(entry1.getId() + ' should be before ' + entry2.getId(), order < 0);
}
function testAddEntry() {
createUi(false);
goog.tweak.registerBoolean('Lazy1', 'Lazy-loaded tweak.');
goog.tweak.registerBoolean('Lazy2', 'Lazy-loaded tweak.',
/* defaultValue */ false, { restartRequired: false });
goog.tweak.beginBooleanGroup('LazyGroup', 'Lazy-loaded tweak.');
goog.tweak.registerBoolean('Lazy3', 'Lazy-loaded tweak.');
goog.tweak.endBooleanGroup();
assertEquals('Wrong number of entry divs.', EXPECTED_ENTRIES_COUNT + 4,
getAllEntryDivs().length);
assertEntryOrder('Enum2', 'Lazy1');
assertEntryOrder('Lazy1', 'Lazy2');
assertEntryOrder('Lazy2', 'Num');
assertEntryOrder('BoolGroup', 'Lazy3');
}
function testAddNamespacedEntries() {
createUi(false);
goog.tweak.beginBooleanGroup('NS.LazyGroup', 'Lazy-loaded tweak.');
goog.tweak.registerBoolean('NS.InGroup', 'Lazy-loaded tweak.');
goog.tweak.endBooleanGroup();
goog.tweak.registerBoolean('NS.Banana', 'Lazy-loaded tweak.');
goog.tweak.registerBoolean('NS.Apple', 'Lazy-loaded tweak.');
assertEquals('Wrong number of entry divs.', EXPECTED_ENTRIES_COUNT + 5,
getAllEntryDivs().length);
assertEntryOrder('Enum2', 'NS.Apple');
assertEntryOrder('NS.Apple', 'NS.Banana');
assertEntryOrder('NS.Banana', 'NS.InGroup');
}
function testCollapsibleIsLazy() {
if (document.createEvent) {
createUi(true);
assertEquals('Expected no entry divs.', 0, getAllEntryDivs().length);
var showLink = root.getElementsByTagName('a')[0];
var event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false,
false, false, false, 0, null);
showLink.dispatchEvent(event);
assertEquals('Wrong number of entry divs.', EXPECTED_ENTRIES_COUNT,
getAllEntryDivs().length);
}
}
</script>
</body>
</html>