diff --git a/tests/jsunit/index.html b/tests/jsunit/index.html index 7cf6ca27d..bfef4841e 100644 --- a/tests/jsunit/index.html +++ b/tests/jsunit/index.html @@ -7,6 +7,7 @@ + diff --git a/tests/jsunit/test_utilities.js b/tests/jsunit/test_utilities.js new file mode 100644 index 000000000..75cdf3c77 --- /dev/null +++ b/tests/jsunit/test_utilities.js @@ -0,0 +1,75 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2017 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. + */ + + /** + * @fileoverview Test utilities. + * @author marisaleung@google.com (Marisa Leung) + */ +'use strict'; + +goog.require('goog.testing'); + + +/** + * Check that two arrays have the same content. + * @param {!Array.} array1 The first array. + * @param {!Array.} array2 The second array. + */ +function isEqualArrays(array1, array2) { + assertEquals(array1.length, array2.length); + for (var i = 0; i < array1.length; i++) { + assertEquals(array1[i], array2[i]); + } +} + +/** + * Creates a controlled MethodMock. Sets the expected return values and + * the parameters if any exist. Sets the method to replay. + * @param {!goog.testing.MockControl} mockControl Object that holds a set + * of mocks for this test. + * @param {!Object} scope The scope of the method to be mocked out. + * @param {!string} funcName The name of the function we're going to mock. + * @param {Array} parameters The parameters to call the mock with. + * @param {Array} return_values The values to return when called. + * @return {!goog.testing.MockInterface} The mocked method. + */ +function setUpMockMethod(mockControl, scope, funcName, parameters, + return_values) { + var mockMethod = mockControl.createMethodMock(scope, funcName); + if (return_values) { + for (var i = 0, return_value; return_value = return_values[i]; i++) { + if (parameters && i < parameters.length) { + mockMethod(parameters[i]).$returns(return_value); + } + else { + mockMethod().$returns(return_value); + } + } + } + // If there are no return values but there are parameters, we are only + // recording specific method calls. + else if (parameters) { + for (var i = 0; i < parameters.length; i++) { + mockMethod(parameters[i]); + } + } + mockMethod.$replay(); + return mockMethod; +} diff --git a/tests/jsunit/variable_map_test.js b/tests/jsunit/variable_map_test.js index fbb33209b..c40f19285 100644 --- a/tests/jsunit/variable_map_test.js +++ b/tests/jsunit/variable_map_test.js @@ -133,10 +133,9 @@ function test_createVariableNullAndUndefinedType() { function test_createVariableNullId() { variableMapTest_setUp(); - var mockGenUid = setUpMockMethod(Blockly.utils, 'genUid', null, '1'); + setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1']); try { variable_map.createVariable('name1', 'type1', null); - mockGenUid.$verify(); variableMapTest_checkVariableValues('name1', 'type1', '1'); } finally { @@ -146,10 +145,9 @@ function test_createVariableNullId() { function test_createVariableUndefinedId() { variableMapTest_setUp(); - var mockGenUid = setUpMockMethod(Blockly.utils, 'genUid', null, '1'); + setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1']); try { variable_map.createVariable('name1', 'type1', undefined); - mockGenUid.$verify(); variableMapTest_checkVariableValues('name1', 'type1', '1'); } finally { @@ -205,8 +203,8 @@ function test_getVariablesOfType_Trivial() { variable_map.createVariable('name4', 'type3', 'id4'); var result_array_1 = variable_map.getVariablesOfType('type1'); var result_array_2 = variable_map.getVariablesOfType('type5'); - this.isEqualArrays([var_1, var_2], result_array_1); - this.isEqualArrays([], result_array_2); + isEqualArrays([var_1, var_2], result_array_1); + isEqualArrays([], result_array_2); variableMapTest_tearDown(); } @@ -217,7 +215,7 @@ function test_getVariablesOfType_Null() { var var_3 = variable_map.createVariable('name3', '', 'id3'); variable_map.createVariable('name4', 'type1', 'id4'); var result_array = variable_map.getVariablesOfType(null); - this.isEqualArrays([var_1, var_2, var_3], result_array); + isEqualArrays([var_1, var_2, var_3], result_array); variableMapTest_tearDown(); } @@ -226,7 +224,7 @@ function test_getVariablesOfType_EmptyString() { var var_1 = variable_map.createVariable('name1', null, 'id1'); var var_2 = variable_map.createVariable('name2', null, 'id2'); var result_array = variable_map.getVariablesOfType(''); - this.isEqualArrays([var_1, var_2], result_array); + isEqualArrays([var_1, var_2], result_array); variableMapTest_tearDown(); } @@ -235,14 +233,14 @@ function test_getVariablesOfType_Deleted() { var variable = variable_map.createVariable('name1', null, 'id1'); variable_map.deleteVariable(variable); var result_array = variable_map.getVariablesOfType(''); - this.isEqualArrays([], result_array); + isEqualArrays([], result_array); variableMapTest_tearDown(); } function test_getVariablesOfType_DoesNotExist() { variableMapTest_setUp(); var result_array = variable_map.getVariablesOfType('type1'); - this.isEqualArrays([], result_array); + isEqualArrays([], result_array); variableMapTest_tearDown(); } @@ -253,14 +251,14 @@ function test_getVariableTypes_Trivial() { variable_map.createVariable('name3', 'type2', 'id3'); variable_map.createVariable('name4', 'type3', 'id4'); var result_array = variable_map.getVariableTypes(); - this.isEqualArrays(['type1', 'type2', 'type3'], result_array); + isEqualArrays(['type1', 'type2', 'type3'], result_array); variableMapTest_tearDown(); } function test_getVariableTypes_None() { variableMapTest_setUp(); var result_array = variable_map.getVariableTypes(); - this.isEqualArrays([], result_array); + isEqualArrays([], result_array); variableMapTest_tearDown(); } @@ -270,13 +268,13 @@ function test_getAllVariables_Trivial() { var var_2 = variable_map.createVariable('name2', 'type1', 'id2'); var var_3 = variable_map.createVariable('name3', 'type2', 'id3'); var result_array = variable_map.getAllVariables(); - this.isEqualArrays([var_1, var_2, var_3], result_array); + isEqualArrays([var_1, var_2, var_3], result_array); variableMapTest_tearDown(); } function test_getAllVariables_None() { variableMapTest_setUp(); var result_array = variable_map.getAllVariables(); - this.isEqualArrays([], result_array); + isEqualArrays([], result_array); variableMapTest_tearDown(); } diff --git a/tests/jsunit/workspace_test.js b/tests/jsunit/workspace_test.js index 986a20560..a3ab32f1c 100644 --- a/tests/jsunit/workspace_test.js +++ b/tests/jsunit/workspace_test.js @@ -71,18 +71,6 @@ function createMockBlock(variable_name) { return block; } -/** - * Check that two arrays have the same content. - * @param {!Array.} array1 The first array. - * @param {!Array.} array2 The second array. - */ -function isEqualArrays(array1, array2) { - assertEquals(array1.length, array2.length); - for (var i = 0; i < array1.length; i++) { - assertEquals(array1[i], array2[i]); - } -} - /** * Check if a variable with the given values exists. * @param {!string} name The expected name of the variable. @@ -97,27 +85,6 @@ function workspaceTest_checkVariableValues(name, type, id) { assertEquals(id, variable.getId()); } -/** - * Creates a controlled MethodMock. Set the expected return values. Set the - * method to replay. - * @param {!Object} scope The scope of the method to be mocked out. - * @param {!string} funcName The name of the function we're going to mock. - * @param {Object} parameters The parameters to call the mock with. - * @param {!Object} return_value The value to return when called. - * @return {!goog.testing.MockInterface} The mocked method. - */ -function setUpMockMethod(scope, funcName, parameters, return_value) { - var mockMethod = mockControl_.createMethodMock(scope, funcName); - if (parameters) { - mockMethod(parameters).$returns(return_value); - } - else { - mockMethod().$returns(return_value); - } - mockMethod.$replay(); - return mockMethod; -} - function test_emptyWorkspace() { workspaceTest_setUp(); try { @@ -242,12 +209,11 @@ function test_updateVariableStore_TrivialNoClear() { workspaceTest_setUp(); workspace.createVariable('name1', 'type1', 'id1'); workspace.createVariable('name2', 'type2', 'id2'); - var mockAllUsedVariables = setUpMockMethod(Blockly.Variables, - 'allUsedVariables', workspace, ['name1', 'name2']); + setUpMockMethod(mockControl_, Blockly.Variables, 'allUsedVariables', + [workspace], [['name1', 'name2']]); try { workspace.updateVariableStore(); - mockAllUsedVariables.$verify(); workspaceTest_checkVariableValues('name1', 'type1', 'id1'); workspaceTest_checkVariableValues('name2', 'type2', 'id2'); } @@ -258,12 +224,12 @@ function test_updateVariableStore_TrivialNoClear() { function test_updateVariableStore_NameNotInvariableMap_NoClear() { workspaceTest_setUp(); - setUpMockMethod(Blockly.Variables, 'allUsedVariables', workspace, ['name1']); - setUpMockMethod(Blockly.utils, 'genUid', null, '1'); + setUpMockMethod(mockControl_, Blockly.Variables, 'allUsedVariables', + [workspace], [['name1']]); + setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1']); try { workspace.updateVariableStore(); - mockControl_.$verifyAll(); workspaceTest_checkVariableValues('name1', '', '1'); } finally { @@ -275,12 +241,11 @@ function test_updateVariableStore_ClearAndAllInUse() { workspaceTest_setUp(); workspace.createVariable('name1', 'type1', 'id1'); workspace.createVariable('name2', 'type2', 'id2'); - var mockAllUsedVariables = setUpMockMethod(Blockly.Variables, - 'allUsedVariables', workspace, ['name1', 'name2']); + setUpMockMethod(mockControl_, Blockly.Variables, 'allUsedVariables', + [workspace], [['name1', 'name2']]); try { workspace.updateVariableStore(true); - mockAllUsedVariables.$verify(); workspaceTest_checkVariableValues('name1', 'type1', 'id1'); workspaceTest_checkVariableValues('name2', 'type2', 'id2'); } @@ -293,12 +258,11 @@ function test_updateVariableStore_ClearAndOneInUse() { workspaceTest_setUp(); workspace.createVariable('name1', 'type1', 'id1'); workspace.createVariable('name2', 'type2', 'id2'); - var mockAllUsedVariables = setUpMockMethod(Blockly.Variables, - 'allUsedVariables', workspace, ['name1']); + setUpMockMethod(mockControl_, Blockly.Variables, 'allUsedVariables', + [workspace], [['name1']]); try { workspace.updateVariableStore(true); - mockAllUsedVariables.$verify(); workspaceTest_checkVariableValues('name1', 'type1', 'id1'); var variabe = workspace.getVariable('name2'); assertNull(variable); @@ -313,12 +277,12 @@ function test_addTopBlock_TrivialFlyoutIsTrue() { workspace.isFlyout = true; var block = createMockBlock(); workspace.removeTopBlock(block); - setUpMockMethod(Blockly.Variables, 'allUsedVariables', block, ['name1']); - setUpMockMethod(Blockly.utils, 'genUid', null, '1'); + setUpMockMethod(mockControl_, Blockly.Variables, 'allUsedVariables', [block], + [['name1']]); + setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1']); try { workspace.addTopBlock(block); - mockControl_.$verifyAll(); workspaceTest_checkVariableValues('name1', '', '1'); } finally { @@ -330,14 +294,11 @@ function test_clear_Trivial() { workspaceTest_setUp(); workspace.createVariable('name1', 'type1', 'id1'); workspace.createVariable('name2', 'type2', 'id2'); - var mockSetGroup = mockControl_.createMethodMock(Blockly.Events, 'setGroup'); - mockSetGroup(true); - mockSetGroup(false); - mockSetGroup.$replay(); + setUpMockMethod(mockControl_, Blockly.Events, 'setGroup', [true, false], + null); try { workspace.clear(); - mockControl_.$verifyAll(); var topBlocks_length = workspace.topBlocks_.length; var varMapLength = Object.keys(workspace.variableMap_.variableMap_).length; assertEquals(0, topBlocks_length); @@ -350,14 +311,11 @@ function test_clear_Trivial() { function test_clear_NoVariables() { workspaceTest_setUp(); - var mockSetGroup = mockControl_.createMethodMock(Blockly.Events, 'setGroup'); - mockSetGroup(true); - mockSetGroup(false); - mockSetGroup.$replay(); + setUpMockMethod(mockControl_, Blockly.Events, 'setGroup', [true, false], + null); try { workspace.clear(); - mockSetGroup.$verify(); var topBlocks_length = workspace.topBlocks_.length; var varMapLength = Object.keys(workspace.variableMap_.variableMap_).length; assertEquals(0, topBlocks_length); @@ -373,17 +331,13 @@ function test_renameVariable_NoBlocks() { workspaceTest_setUp(); var oldName = 'name1'; var newName = 'name2'; - var mockSetGroup = mockControl_.createMethodMock(Blockly.Events, 'setGroup'); - var mockGenUid = mockControl_.createMethodMock(Blockly.utils, 'genUid'); - // Mocked setGroup to ensure only one call to the mocked genUid. - mockSetGroup(true); - mockSetGroup(false); - mockGenUid().$returns('1'); - mockControl_.$replayAll(); + // Mocked setGroup to ensure only one call to the mocked genUid. + setUpMockMethod(mockControl_, Blockly.Events, 'setGroup', [true, false], + null); + setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1']); try { workspace.renameVariable(oldName, newName); - mockControl_.$verifyAll(); workspaceTest_checkVariableValues('name2', '', '1'); var variable = workspace.getVariable(oldName); assertNull(variable); diff --git a/tests/jsunit/xml_test.js b/tests/jsunit/xml_test.js index 12f3ced71..255eba011 100644 --- a/tests/jsunit/xml_test.js +++ b/tests/jsunit/xml_test.js @@ -159,10 +159,7 @@ function test_domToText() { function test_domToWorkspace_BackwardCompatibility() { // Expect that workspace still loads without serialized variables. xmlTest_setUpWithMockBlocks(); - var mockGenUid = mockControl_.createMethodMock(Blockly.utils, 'genUid'); - mockGenUid().$returns('1'); - mockGenUid().$returns('1'); - mockGenUid().$replay(); + setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1', '1']); try { var dom = Blockly.Xml.textToDom( '' + @@ -313,15 +310,14 @@ function test_blockToDom_fieldToDom_trivial() { var block = new Blockly.Block(workspace, 'field_variable_test_block'); block.inputList[0].fieldRow[0].setValue('name1'); var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; - xmlTest_checkVariableFieldDomValues(resultFieldDom, 'VAR', 'type1', 'id1', 'name1') + xmlTest_checkVariableFieldDomValues(resultFieldDom, 'VAR', 'type1', 'id1', + 'name1'); xmlTest_tearDownWithMockBlocks(); } function test_blockToDom_fieldToDom_defaultCase() { xmlTest_setUpWithMockBlocks(); - var mockGenUid = mockControl_.createMethodMock(Blockly.utils, 'genUid'); - mockGenUid().$returns('1'); - mockGenUid().$replay(); + setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1', '1']); workspace.createVariable('name1'); var block = new Blockly.Block(workspace, 'field_variable_test_block'); block.inputList[0].fieldRow[0].setValue('name1'); @@ -353,9 +349,7 @@ function test_blockToDom_fieldToDom_notAFieldVariable() { function test_variablesToDom_oneVariable() { xmlTest_setUp(); - var mockGenUid = mockControl_.createMethodMock(Blockly.utils, 'genUid'); - mockGenUid().$returns('1'); - mockGenUid().$replay(); + setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1']); workspace.createVariable('name1'); var resultDom = Blockly.Xml.variablesToDom(workspace.getAllVariables());