mirror of
https://github.com/google/blockly.git
synced 2025-12-16 14:20:10 +01:00
* Add a workspace drag surface that blocks and bubble get moved to during a workspace drag. The surface is translated using translate3d instead of svg's translate attribute so that the browser does not have to repaint the entire workspace on every mouse move. This is very similar to the block drag surface. * Address code review comments * add back hasClass_ utility removed in #748 and stop using contains since it is not supported in IE
191 lines
8.3 KiB
JavaScript
191 lines
8.3 KiB
JavaScript
/**
|
|
* @license
|
|
* Visual Blocks Editor
|
|
*
|
|
* Copyright 2011 Google Inc.
|
|
* https://developers.google.com/blockly/
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
'use strict';
|
|
|
|
function test_genUid() {
|
|
var uuids = {};
|
|
for (var i = 0; i < 1000; i++) {
|
|
var uuid = Blockly.utils.genUid();
|
|
assertFalse('UUID different: ' + uuid, uuid in uuids);
|
|
uuids[uuid] = true;
|
|
}
|
|
}
|
|
|
|
function test_addClass() {
|
|
var p = document.createElement('p');
|
|
Blockly.utils.addClass(p, 'one');
|
|
assertEquals('Adding "one"', 'one', p.className);
|
|
Blockly.utils.addClass(p, 'one');
|
|
assertEquals('Adding duplicate "one"', 'one', p.className);
|
|
Blockly.utils.addClass(p, 'two');
|
|
assertEquals('Adding "two"', 'one two', p.className);
|
|
Blockly.utils.addClass(p, 'two');
|
|
assertEquals('Adding duplicate "two"', 'one two', p.className);
|
|
Blockly.utils.addClass(p, 'three');
|
|
assertEquals('Adding "three"', 'one two three', p.className);
|
|
}
|
|
|
|
function test_hasClass() {
|
|
var p = document.createElement('p');
|
|
p.className = ' one three two three ';
|
|
assertTrue('Has "one"', Blockly.utils.hasClass(p, 'one'));
|
|
assertTrue('Has "two"', Blockly.utils.hasClass(p, 'two'));
|
|
assertTrue('Has "three"', Blockly.utils.hasClass(p, 'three'));
|
|
assertFalse('Has no "four"', Blockly.utils.hasClass(p, 'four'));
|
|
assertFalse('Has no "t"', Blockly.utils.hasClass(p, 't'));
|
|
}
|
|
|
|
function test_removeClass() {
|
|
var p = document.createElement('p');
|
|
p.className = ' one three two three ';
|
|
Blockly.utils.removeClass(p, 'two');
|
|
assertEquals('Removing "two"', 'one three three', p.className);
|
|
Blockly.utils.removeClass(p, 'four');
|
|
assertEquals('Removing "four"', 'one three three', p.className);
|
|
Blockly.utils.removeClass(p, 'three');
|
|
assertEquals('Removing "three"', 'one', p.className);
|
|
Blockly.utils.removeClass(p, 'ne');
|
|
assertEquals('Removing "ne"', 'one', p.className);
|
|
Blockly.utils.removeClass(p, 'one');
|
|
assertEquals('Removing "one"', '', p.className);
|
|
Blockly.utils.removeClass(p, 'zero');
|
|
assertEquals('Removing "zero"', '', p.className);
|
|
}
|
|
|
|
function test_shortestStringLength() {
|
|
var len = Blockly.utils.shortestStringLength('one,two,three,four,five'.split(','));
|
|
assertEquals('Length of "one"', 3, len);
|
|
len = Blockly.utils.shortestStringLength('one,two,three,four,five,'.split(','));
|
|
assertEquals('Length of ""', 0, len);
|
|
len = Blockly.utils.shortestStringLength(['Hello World']);
|
|
assertEquals('List of one', 11, len);
|
|
len = Blockly.utils.shortestStringLength([]);
|
|
assertEquals('Empty list', 0, len);
|
|
}
|
|
|
|
function test_commonWordPrefix() {
|
|
var len = Blockly.utils.commonWordPrefix('one,two,three,four,five'.split(','));
|
|
assertEquals('No prefix', 0, len);
|
|
len = Blockly.utils.commonWordPrefix('Xone,Xtwo,Xthree,Xfour,Xfive'.split(','));
|
|
assertEquals('No word prefix', 0, len);
|
|
len = Blockly.utils.commonWordPrefix('abc de,abc de,abc de,abc de'.split(','));
|
|
assertEquals('Full equality', 6, len);
|
|
len = Blockly.utils.commonWordPrefix('abc deX,abc deY'.split(','));
|
|
assertEquals('One word prefix', 4, len);
|
|
len = Blockly.utils.commonWordPrefix('abc de,abc deY'.split(','));
|
|
assertEquals('Overflow no', 4, len);
|
|
len = Blockly.utils.commonWordPrefix('abc de,abc de Y'.split(','));
|
|
assertEquals('Overflow yes', 6, len);
|
|
len = Blockly.utils.commonWordPrefix(['Hello World']);
|
|
assertEquals('List of one', 11, len);
|
|
len = Blockly.utils.commonWordPrefix([]);
|
|
assertEquals('Empty list', 0, len);
|
|
len = Blockly.utils.commonWordPrefix('turn left,turn right'.split(','));
|
|
assertEquals('No prefix due to &nbsp;', 0, len);
|
|
len = Blockly.utils.commonWordPrefix('turn\u00A0left,turn\u00A0right'.split(','));
|
|
assertEquals('No prefix due to \\u00A0', 0, len);
|
|
}
|
|
|
|
function test_commonWordSuffix() {
|
|
var len = Blockly.utils.commonWordSuffix('one,two,three,four,five'.split(','));
|
|
assertEquals('No prefix', 0, len);
|
|
len = Blockly.utils.commonWordSuffix('oneX,twoX,threeX,fourX,fiveX'.split(','));
|
|
assertEquals('No word prefix', 0, len);
|
|
len = Blockly.utils.commonWordSuffix('abc de,abc de,abc de,abc de'.split(','));
|
|
assertEquals('Full equality', 6, len);
|
|
len = Blockly.utils.commonWordSuffix('Xabc de,Yabc de'.split(','));
|
|
assertEquals('One word prefix', 3, len);
|
|
len = Blockly.utils.commonWordSuffix('abc de,Yabc de'.split(','));
|
|
assertEquals('Overflow no', 3, len);
|
|
len = Blockly.utils.commonWordSuffix('abc de,Y abc de'.split(','));
|
|
assertEquals('Overflow yes', 6, len);
|
|
len = Blockly.utils.commonWordSuffix(['Hello World']);
|
|
assertEquals('List of one', 11, len);
|
|
len = Blockly.utils.commonWordSuffix([]);
|
|
assertEquals('Empty list', 0, len);
|
|
}
|
|
|
|
function test_tokenizeInterpolation() {
|
|
var tokens = Blockly.utils.tokenizeInterpolation('');
|
|
assertArrayEquals('Null interpolation', [], tokens);
|
|
|
|
tokens = Blockly.utils.tokenizeInterpolation('Hello');
|
|
assertArrayEquals('No interpolation', ['Hello'], tokens);
|
|
|
|
tokens = Blockly.utils.tokenizeInterpolation('Hello%World');
|
|
assertArrayEquals('Unescaped %.', ['Hello%World'], tokens);
|
|
|
|
tokens = Blockly.utils.tokenizeInterpolation('Hello%%World');
|
|
assertArrayEquals('Escaped %.', ['Hello%World'], tokens);
|
|
|
|
tokens = Blockly.utils.tokenizeInterpolation('Hello %1 World');
|
|
assertArrayEquals('Interpolation.', ['Hello ', 1, ' World'], tokens);
|
|
|
|
tokens = Blockly.utils.tokenizeInterpolation('%123Hello%456World%789');
|
|
assertArrayEquals('Interpolations.', [123, 'Hello', 456, 'World', 789], tokens);
|
|
|
|
tokens = Blockly.utils.tokenizeInterpolation('%%%x%%0%00%01%');
|
|
assertArrayEquals('Torture interpolations.', ['%%x%0', 0, 1, '%'], tokens);
|
|
|
|
Blockly.Msg = Blockly.Msg || {};
|
|
|
|
Blockly.Msg.STRING_REF = 'test string';
|
|
tokens = Blockly.utils.tokenizeInterpolation('%{bky_string_ref}');
|
|
assertArrayEquals('String table reference, lowercase', ['test string'], tokens);
|
|
tokens = Blockly.utils.tokenizeInterpolation('%{BKY_STRING_REF}');
|
|
assertArrayEquals('String table reference, uppercase', ['test string'], tokens);
|
|
|
|
Blockly.Msg.WITH_PARAM = 'before %1 after';
|
|
tokens = Blockly.utils.tokenizeInterpolation('%{bky_with_param}');
|
|
assertArrayEquals('String table reference, with parameter', ['before ', 1, ' after'], tokens);
|
|
|
|
Blockly.Msg.RECURSE = 'before %{bky_string_ref} after';
|
|
tokens = Blockly.utils.tokenizeInterpolation('%{bky_recurse}');
|
|
assertArrayEquals('String table reference, with subreference', ['before test string after'], tokens);
|
|
|
|
// Error cases...
|
|
tokens = Blockly.utils.tokenizeInterpolation('%{bky_undefined}');
|
|
assertArrayEquals('Undefined string table reference', ['%{bky_undefined}'], tokens);
|
|
|
|
Blockly.Msg['1'] = 'Will not match';
|
|
tokens = Blockly.utils.tokenizeInterpolation('before %{1} after');
|
|
assertArrayEquals('Invalid initial digit in string table reference', ['before %{1} after'], tokens);
|
|
|
|
Blockly.Msg['TWO WORDS'] = 'Will not match';
|
|
tokens = Blockly.utils.tokenizeInterpolation('before %{two words} after');
|
|
assertArrayEquals('Invalid character in string table reference: space', ['before %{two words} after'], tokens);
|
|
|
|
Blockly.Msg['TWO-WORDS'] = 'Will not match';
|
|
tokens = Blockly.utils.tokenizeInterpolation('before %{two-words} after');
|
|
assertArrayEquals('Invalid character in string table reference: dash', ['before %{two-words} after'], tokens);
|
|
|
|
Blockly.Msg['TWO.WORDS'] = 'Will not match';
|
|
tokens = Blockly.utils.tokenizeInterpolation('before %{two.words} after');
|
|
assertArrayEquals('Invalid character in string table reference: period', ['before %{two.words} after'], tokens);
|
|
|
|
Blockly.Msg['AB&C'] = 'Will not match';
|
|
tokens = Blockly.utils.tokenizeInterpolation('before %{ab&c} after');
|
|
assertArrayEquals('Invalid character in string table reference: &', ['before %{ab&c} after'], tokens);
|
|
|
|
Blockly.Msg['UNCLOSED'] = 'Will not match';
|
|
tokens = Blockly.utils.tokenizeInterpolation('before %{unclosed');
|
|
assertArrayEquals('String table reference, with parameter', ['before %{unclosed'], tokens);
|
|
}
|