mirror of
https://github.com/google/blockly.git
synced 2026-01-10 10:27:08 +01:00
380 lines
13 KiB
JavaScript
380 lines
13 KiB
JavaScript
|
|
suite('Events', function() {
|
|
setup(function() {
|
|
this.workspace = new Blockly.Workspace();
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
'type': 'field_variable_test_block',
|
|
'message0': '%1',
|
|
'args0': [
|
|
{
|
|
'type': 'field_variable',
|
|
'name': 'VAR',
|
|
'variable': 'item'
|
|
}
|
|
],
|
|
},
|
|
{
|
|
'type': 'simple_test_block',
|
|
'message0': 'simple test block'
|
|
}]);
|
|
});
|
|
|
|
teardown(function() {
|
|
delete Blockly.Blocks['field_variable_test_block'];
|
|
delete Blockly.Blocks['simple_test_block'];
|
|
this.workspace.dispose();
|
|
|
|
// Clear Blockly.Event state.
|
|
Blockly.Events.setGroup(false);
|
|
Blockly.Events.disabled_ = 0;
|
|
});
|
|
|
|
function checkExactEventValues(event, values) {
|
|
var keys = Object.keys(values);
|
|
for (var i = 0; i < keys.length; i++) {
|
|
var field = keys[i];
|
|
assertEquals(values[field], event[field]);
|
|
}
|
|
}
|
|
|
|
function checkCreateEventValues(event, block, ids, type) {
|
|
var expected_xml = Blockly.Xml.domToText(Blockly.Xml.blockToDom(block));
|
|
var result_xml = Blockly.Xml.domToText(event.xml);
|
|
assertEquals(expected_xml, result_xml);
|
|
isEqualArrays(ids, event.ids);
|
|
assertEquals(type, event.type);
|
|
}
|
|
|
|
function checkDeleteEventValues(event, block, ids, type) {
|
|
var expected_xml = Blockly.Xml.domToText(Blockly.Xml.blockToDom(block));
|
|
var result_xml = Blockly.Xml.domToText(event.oldXml);
|
|
assertEquals(expected_xml, result_xml);
|
|
isEqualArrays(ids, event.ids);
|
|
assertEquals(type, event.type);
|
|
}
|
|
|
|
suite('Constructors', function() {
|
|
test('Abstract', function() {
|
|
var event = new Blockly.Events.Abstract();
|
|
assertUndefined(event.blockId);
|
|
assertUndefined(event.workspaceId);
|
|
assertUndefined(event.varId);
|
|
checkExactEventValues(event, {'group': '', 'recordUndo': true});
|
|
});
|
|
|
|
test('UI event without block', function() {
|
|
Blockly.Events.setGroup('testGroup');
|
|
var event = new Blockly.Events.Ui(null, 'foo', 'bar', 'baz');
|
|
checkExactEventValues(event,
|
|
{
|
|
'blockId': null,
|
|
'workspaceId': null,
|
|
'type': 'ui',
|
|
'oldValue': 'bar',
|
|
'newValue': 'baz',
|
|
'element': 'foo',
|
|
'recordUndo': false,
|
|
'group': 'testGroup'
|
|
});
|
|
});
|
|
|
|
suite('With simple blocks', function() {
|
|
setup(function() {
|
|
this.FAKE_ID = 'hedgehog';
|
|
sinon.stub(Blockly.utils, "genUid").returns(this.FAKE_ID);
|
|
|
|
// Disable events while constructing the block: this is a test of the
|
|
// Blockly.Event constructors, not the block constructor.
|
|
Blockly.Events.disable();
|
|
this.block = new Blockly.Block(this.workspace, 'simple_test_block');
|
|
Blockly.Events.enable();
|
|
sinon.restore();
|
|
});
|
|
|
|
teardown(function() {
|
|
});
|
|
|
|
test('Block base', function() {
|
|
var event = new Blockly.Events.BlockBase(this.block);
|
|
assertUndefined(event.varId);
|
|
checkExactEventValues(event,
|
|
{
|
|
'blockId': this.FAKE_ID,
|
|
'workspaceId': this.workspace.id,
|
|
'group': '',
|
|
'recordUndo': true
|
|
});
|
|
});
|
|
|
|
test('Create', function() {
|
|
var event = new Blockly.Events.Create(this.block);
|
|
checkCreateEventValues(event, this.block, [this.FAKE_ID], 'create');
|
|
});
|
|
|
|
test('Block create', function() {
|
|
var event = new Blockly.Events.BlockCreate(this.block);
|
|
checkCreateEventValues(event, this.block, [this.FAKE_ID], 'create');
|
|
});
|
|
|
|
test('Delete', function() {
|
|
var event = new Blockly.Events.Delete(this.block);
|
|
checkDeleteEventValues(event, this.block, [this.FAKE_ID], 'delete');
|
|
});
|
|
|
|
test('Block delete', function() {
|
|
var event = new Blockly.Events.BlockDelete(this.block);
|
|
checkDeleteEventValues(event, this.block, [this.FAKE_ID], 'delete');
|
|
});
|
|
|
|
test('UI event with block', function() {
|
|
Blockly.Events.setGroup('testGroup');
|
|
var event = new Blockly.Events.Ui(this.block, 'foo', 'bar', 'baz');
|
|
checkExactEventValues(event,
|
|
{
|
|
'blockId': this.FAKE_ID,
|
|
'workspaceId': this.workspace.id,
|
|
'type': 'ui',
|
|
'oldValue': 'bar',
|
|
'newValue': 'baz',
|
|
'element': 'foo',
|
|
'recordUndo': false,
|
|
'group': 'testGroup'
|
|
});
|
|
});
|
|
|
|
suite('Move', function() {
|
|
test('Move by coordinate', function() {
|
|
var coordinate = new Blockly.utils.Coordinate(3, 4);
|
|
this.block.xy_ = coordinate;
|
|
|
|
var event = new Blockly.Events.Move(this.block);
|
|
checkExactEventValues(event,
|
|
{'oldCoordinate': coordinate, 'type': 'move'});
|
|
});
|
|
|
|
test('Block move by coordinate', function() {
|
|
var coordinate = new Blockly.utils.Coordinate(3, 4);
|
|
this.block.xy_ = coordinate;
|
|
|
|
var event = new Blockly.Events.BlockMove(this.block);
|
|
checkExactEventValues(event,
|
|
{'oldCoordinate': coordinate, 'type': 'move'});
|
|
});
|
|
|
|
suite('Move by parent', function() {
|
|
setup(function() {
|
|
sinon.stub(Blockly.utils, "genUid").returns("parent");
|
|
Blockly.Events.disable();
|
|
this.parentBlock = new Blockly.Block(this.workspace, 'simple_test_block');
|
|
Blockly.Events.enable();
|
|
sinon.restore();
|
|
|
|
this.block.parentBlock_ = this.parentBlock;
|
|
this.block.xy_ = new Blockly.utils.Coordinate(3, 4);
|
|
});
|
|
|
|
teardown(function() {
|
|
this.block.parentBlock_ = null;
|
|
});
|
|
|
|
test('Move by parent', function() {
|
|
// Expect the oldParentId to be set but not the oldCoordinate to be set.
|
|
var event = new Blockly.Events.Move(this.block);
|
|
checkExactEventValues(event, {'oldCoordinate': undefined,
|
|
'oldParentId': 'parent', 'type': 'move'});
|
|
});
|
|
|
|
test('Block move by parent', function() {
|
|
// Expect the oldParentId to be set but not the oldCoordinate to be set.
|
|
var event = new Blockly.Events.BlockMove(this.block);
|
|
checkExactEventValues(event, {'oldCoordinate': undefined,
|
|
'oldParentId': 'parent', 'type': 'move'});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
suite('With variable getter blocks', function() {
|
|
setup(function() {
|
|
// Disable events while constructing the block: this is a test of the
|
|
// Blockly.Event constructors, not the block constructor.
|
|
Blockly.Events.disable();
|
|
this.block = new Blockly.Block(this.workspace, 'field_variable_test_block');
|
|
Blockly.Events.enable();
|
|
});
|
|
|
|
teardown(function() {
|
|
|
|
});
|
|
|
|
test('Change', function() {
|
|
var event =
|
|
new Blockly.Events.Change(this.block, 'field', 'VAR', 'id1', 'id2');
|
|
checkExactEventValues(event, {'element': 'field', 'name': 'VAR',
|
|
'oldValue': 'id1', 'newValue': 'id2', 'type': 'change'});
|
|
});
|
|
|
|
test('Block change', function() {
|
|
var event = new Blockly.Events.BlockChange(
|
|
this.block, 'field', 'VAR', 'id1', 'id2');
|
|
checkExactEventValues(event, {'element': 'field', 'name': 'VAR',
|
|
'oldValue': 'id1', 'newValue': 'id2', 'type': 'change'});
|
|
});
|
|
});
|
|
});
|
|
|
|
suite('Variable events', function() {
|
|
setup(function() {
|
|
this.variable = this.workspace.createVariable('name1', 'type1', 'id1');
|
|
});
|
|
|
|
/**
|
|
* Check if a variable with the given values exists.
|
|
* @param {Blockly.Workspace|Blockly.VariableMap} container The workspace or
|
|
* variableMap the checked variable belongs to.
|
|
* @param {!string} name The expected name of the variable.
|
|
* @param {!string} type The expected type of the variable.
|
|
* @param {!string} id The expected id of the variable.
|
|
*/
|
|
function checkVariableValues(container, name, type, id) {
|
|
var variable = container.getVariableById(id);
|
|
assertNotUndefined(variable);
|
|
assertEquals(name, variable.name);
|
|
assertEquals(type, variable.type);
|
|
assertEquals(id, variable.getId());
|
|
}
|
|
suite('Constructors', function() {
|
|
test('Var base', function() {
|
|
var event = new Blockly.Events.VarBase(this.variable);
|
|
assertUndefined(event.blockId);
|
|
checkExactEventValues(event, {'varId': 'id1',
|
|
'workspaceId': this.workspace.id, 'group': '', 'recordUndo': true});
|
|
});
|
|
|
|
test('Var create', function() {
|
|
var event = new Blockly.Events.VarCreate(this.variable);
|
|
checkExactEventValues(event, {'varName': 'name1', 'varType': 'type1',
|
|
'type': 'var_create'});
|
|
});
|
|
|
|
test('Var delete', function() {
|
|
var event = new Blockly.Events.VarDelete(this.variable);
|
|
checkExactEventValues(event, {'varName': 'name1', 'varType': 'type1',
|
|
'varId':'id1', 'type': 'var_delete'});
|
|
});
|
|
|
|
test('Var rename', function() {
|
|
var event = new Blockly.Events.VarRename(this.variable, 'name2');
|
|
checkExactEventValues(event, {'varId': 'id1', 'oldName': 'name1',
|
|
'newName': 'name2', 'type': 'var_rename'});
|
|
});
|
|
});
|
|
|
|
suite('fromJson', function() {
|
|
test('Var create', function() {
|
|
var event = new Blockly.Events.VarCreate(this.variable);
|
|
var event2 = new Blockly.Events.VarCreate(null);
|
|
var json = event.toJson();
|
|
event2.fromJson(json);
|
|
|
|
assertEquals(JSON.stringify(json), JSON.stringify(event2.toJson()));
|
|
});
|
|
test('Var delete', function() {
|
|
var event = new Blockly.Events.VarDelete(this.variable);
|
|
var event2 = new Blockly.Events.VarDelete(null);
|
|
var json = event.toJson();
|
|
event2.fromJson(json);
|
|
|
|
assertEquals(JSON.stringify(json), JSON.stringify(event2.toJson()));
|
|
});
|
|
test('Var rename', function() {
|
|
var event = new Blockly.Events.VarRename(this.variable, '');
|
|
var event2 = new Blockly.Events.VarRename(null);
|
|
var json = event.toJson();
|
|
event2.fromJson(json);
|
|
|
|
assertEquals(JSON.stringify(json), JSON.stringify(event2.toJson()));
|
|
});
|
|
});
|
|
|
|
suite('toJson', function() {
|
|
test('Var create', function() {
|
|
var variable = this.workspace.createVariable('name1', 'type1', 'id1');
|
|
var event = new Blockly.Events.VarCreate(variable);
|
|
var json = event.toJson();
|
|
var expectedJson = ({type: "var_create", varId: "id1", varType: "type1",
|
|
varName: "name1"});
|
|
|
|
assertEquals(JSON.stringify(expectedJson), JSON.stringify(json));
|
|
});
|
|
|
|
test('Var delete', function() {
|
|
var event = new Blockly.Events.VarDelete(this.variable);
|
|
var json = event.toJson();
|
|
var expectedJson = ({type: "var_delete", varId: "id1", varType: "type1",
|
|
varName: "name1"});
|
|
|
|
assertEquals(JSON.stringify(expectedJson), JSON.stringify(json));
|
|
});
|
|
|
|
test('Var rename', function() {
|
|
var event = new Blockly.Events.VarRename(this.variable, 'name2');
|
|
var json = event.toJson();
|
|
var expectedJson = ({type: "var_rename", varId: "id1", oldName: "name1",
|
|
newName: "name2"});
|
|
|
|
assertEquals(JSON.stringify(expectedJson), JSON.stringify(json));
|
|
});
|
|
});
|
|
|
|
suite.skip('Run Forward', function() {
|
|
test('Var create', function() {
|
|
var json = {type: "var_create", varId: "id1", varType: "type1",
|
|
varName: "name1"};
|
|
var event = Blockly.Events.fromJson(json, this.workspace);
|
|
assertNull(this.workspace.getVariableById('id1'));
|
|
event.run(true);
|
|
checkVariableValues(this.workspace, 'name1', 'type1', 'id1');
|
|
});
|
|
|
|
test('Var delete', function() {
|
|
var event = new Blockly.Events.VarDelete(this.variable);
|
|
assertNotNull(this.workspace.getVariableById('id1'));
|
|
event.run(true);
|
|
assertNull(this.workspace.getVariableById('id1'));
|
|
});
|
|
|
|
test('Var rename', function() {
|
|
var event = new Blockly.Events.VarRename(this.variable, 'name2');
|
|
event.run(true);
|
|
assertNull(this.workspace.getVariable('name1'));
|
|
checkVariableValues(this.workspace, 'name2', 'type1', 'id1');
|
|
});
|
|
});
|
|
suite.skip('Run Backward', function() {
|
|
test('Var create', function() {
|
|
var variable = this.workspace.createVariable('name1', 'type1', 'id1');
|
|
var event = new Blockly.Events.VarCreate(variable);
|
|
assertNotNull(this.workspace.getVariableById('id1'));
|
|
event.run(false);
|
|
});
|
|
|
|
test('Var delete', function() {
|
|
var json = {type: "var_delete", varId: "id1", varType: "type1",
|
|
varName: "name1"};
|
|
var event = Blockly.Events.fromJson(json, this.workspace);
|
|
assertNull(this.workspace.getVariableById('id1'));
|
|
event.run(false);
|
|
checkVariableValues(this.workspace, 'name1', 'type1', 'id1');
|
|
});
|
|
|
|
test('Var rename', function() {
|
|
var event = new Blockly.Events.VarRename(this.variable, 'name2');
|
|
event.run(false);
|
|
assertNull(this.workspace.getVariable('name2'));
|
|
checkVariableValues(this.workspace, 'name1', 'type1', 'id1');
|
|
});
|
|
});
|
|
});
|
|
});
|