sku-pg
Version:
Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!
248 lines (214 loc) • 6.67 kB
HTML
<html>
<!--
Copyright 2007 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.
-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Closure Unit Tests - goog.ui.RichTextSpellChecker</title>
<script src="../base.js"></script>
<script>
goog.require('goog.dom');
goog.require('goog.testing.jsunit');
goog.require('goog.ui.RichTextSpellChecker');
</script>
</head>
<body>
<div id="test1"></div>
<div id="test2"></div>
<div id="test3"></div>
<script>
var attributeSet = ['b', 'u', 'del', 'i'];
var vocabulary = ['test', 'words', 'a', 'few', 'missspelling', 'iggnore'];
// We don't use Math.random() to make test predictable. Math.random is not
// repeatable, so a success on the dev machine != success in the lab (or on
// other dev machines). This is the same pseudorandom logic that CRT rand()
// uses.
var rseed = 1;
function random(range) {
rseed = (rseed * 1103515245 + 12345) & 0xffffffff;
return ((rseed >> 16) & 0x7fff) % range;
};
function localSpellCheckingFunction(words, spellChecker, callback) {
var len = words.length;
var results = [];
for (var i = 0; i < len; i++) {
var word = words[i];
var found = false;
// Last two words are considered misspellings
for (var j = 0 ; j < vocabulary.length - 2 ; ++j) {
if (vocabulary[j] == word) {
found = true;
break;
}
}
if (found) {
results.push([word, goog.spell.SpellCheck.WordStatus.VALID]);
} else {
results.push([word, goog.spell.SpellCheck.WordStatus.INVALID,
['foo','bar']]);
}
}
callback.call(spellChecker, results);
};
function generateRandomSpace() {
var string = '';
var nSpace = 1 + random(4);
for (var i = 0; i < nSpace ; ++i) {
string += ' ';
}
return string;
};
function generateRandomString(maxWords) {
var string = '';
var nWords = 1 + random(maxWords);
for (var i = 0; i < nWords ; ++i) {
string += vocabulary[random(vocabulary.length)];
string += generateRandomSpace();
}
return string;
};
function generateRandomHtml(rootNode, branchFactor, attributes, numAttr) {
if (numAttr == 0) {
var text = document.createTextNode(generateRandomString(10));
rootNode.appendChild(text);
return;
}
var lastElementWasText = false;
for (var i = 0; i < branchFactor; ++i) {
var rand = random(10);
if (rand < 8 && !lastElementWasText) {
lastElementWasText = true;
var text = document.createTextNode(generateRandomString(10));
rootNode.appendChild(text);
} else {
lastElementWasText = false;
var rand = random(numAttr);
var index = 0;
for (;;) {
while (attributes[index] == null) {
++index;
}
if (rand == 0)
break;
++index;
--rand;
};
var attr = attributes[index];
var el = document.createElement(attr);
rootNode.appendChild(el);
rand = random(10);
if (rand == 0) {
el.className = 'goog-quote';
}
attributes[index] = null;
generateRandomHtml(el, branchFactor, attributes, numAttr-1);
attributes[index] = attr;
}
}
};
var timerQueue = [];
function processTimerQueue() {
while (timerQueue.length > 0) {
var fn = timerQueue.shift();
fn();
}
};
function localTimer(fn, delay, obj) {
if (obj) {
fn = goog.bind(fn, obj);
}
timerQueue.push(fn);
return timerQueue.length;
};
function testDocumentIntegrity() {
var handler = new goog.spell.SpellCheck(localSpellCheckingFunction);
var s = new goog.ui.RichTextSpellChecker(handler);
s.asyncWordsPerBatch_ = 100;
var el = document.getElementById('test1');
s.decorate(el);
generateRandomHtml(el, 4, attributeSet, attributeSet.length);
var el2 = el.cloneNode(true);
var timerSav = goog.Timer.callOnce;
goog.Timer.callOnce = localTimer;
s.setExcludeMarker('goog-quote');
s.check();
processTimerQueue();
s.ignoreWord('iggnore');
processTimerQueue();
s.check();
processTimerQueue();
s.resume();
processTimerQueue();
goog.Timer.callOnce = timerSav;
assertEquals('Spell checker run should not change the underlying element.',
el2.innerHTML, el.innerHTML);
s.dispose();
};
function testExcludeMarkers() {
var handler = new goog.spell.SpellCheck(localSpellCheckingFunction);
var s = new goog.ui.RichTextSpellChecker(handler);
s.setExcludeMarker(['DIV.goog-quote', 'goog-comment', 'SPAN.goog-note']);
assertArrayEquals(['goog-quote', 'goog-comment', 'goog-note'],
s.excludeMarker);
assertArrayEquals(['DIV', undefined, 'SPAN'], s.excludeTags);
var el = document.getElementById('test1');
el.innerHTML = '<div class="goog-quote"></div>' +
'<div class="goog-yes">skip</div>' +
'<div class="goog-note"></div>' +
'<div class="goog-comment"></div>' +
'<br>';
var children = el.childNodes;
var length = children.length;
assertEquals(5, length);
assertTrue(s.isExcluded_(children[0]));
assertFalse(s.isExcluded_(children[1]));
assertFalse(s.isExcluded_(children[2]));
assertTrue(s.isExcluded_(children[3]));
assertFalse(s.isExcluded_(children[4]));
}
function testBiggerDocument() {
var handler = new goog.spell.SpellCheck(localSpellCheckingFunction);
var s = new goog.ui.RichTextSpellChecker(handler);
var el = document.getElementById('test2');
s.decorate(el);
generateRandomHtml(el, 4, attributeSet, attributeSet.length);
var el2 = el.cloneNode(true);
var timerSav = goog.Timer.callOnce;
goog.Timer.callOnce = localTimer;
s.check();
processTimerQueue();
s.resume();
processTimerQueue();
goog.Timer.callOnce = timerSav;
assertEquals('Spell checker run should not change the underlying element.',
el2.innerHTML, el.innerHTML);
s.dispose();
};
function testElementOverflow() {
var handler = new goog.spell.SpellCheck(localSpellCheckingFunction);
var s = new goog.ui.RichTextSpellChecker(handler);
s.asyncWordsPerBatch_ = 100;
var el = document.getElementById('test3');
s.decorate(el);
var text = generateRandomString(200);
el.appendChild(document.createTextNode(text));
var el2 = el.cloneNode(true);
var timerSav = goog.Timer.callOnce;
goog.Timer.callOnce = localTimer;
s.check();
processTimerQueue();
s.check();
processTimerQueue();
s.resume();
processTimerQueue();
goog.Timer.callOnce = timerSav;
assertEquals('Spell checker run should not change the underlying element.',
el2.innerHTML, el.innerHTML);
s.dispose();
};
</script>
</body>
</html>