From 0040ff636c1ee40b275e36d54b85d565e34b047e Mon Sep 17 00:00:00 2001 From: marisaleung Date: Tue, 6 Jun 2017 14:07:14 -0700 Subject: [PATCH] Field Variable setValue() looks up variable. --- core/field_variable.js | 15 +++++ tests/jsunit/field_variable_test.js | 91 +++++++++++++++++++++++++++++ tests/jsunit/index.html | 1 + 3 files changed, 107 insertions(+) create mode 100644 tests/jsunit/field_variable_test.js diff --git a/core/field_variable.js b/core/field_variable.js index b0b13b7f3..1b41909f1 100644 --- a/core/field_variable.js +++ b/core/field_variable.js @@ -110,6 +110,21 @@ Blockly.FieldVariable.prototype.setValue = function(newValue) { Blockly.Events.fire(new Blockly.Events.Change( this.sourceBlock_, 'field', this.name, this.value_, newValue)); } + if (this.sourceBlock_) { + var variable = this.sourceBlock_.workspace.getVariableById(newValue); + if (variable) { + this.setText(variable.name); + this.value_ = newValue; + return; + } + // TODO(marisaleung): Remove name lookup after converting all Field Variable + // instances to use id instead of name. + else if (variable = this.sourceBlock_.workspace.getVariable(newValue)) { + this.setText(newValue); + this.value_ = variable.getId(); + return; + } + } this.value_ = newValue; this.setText(newValue); }; diff --git a/tests/jsunit/field_variable_test.js b/tests/jsunit/field_variable_test.js new file mode 100644 index 000000000..318cf43bd --- /dev/null +++ b/tests/jsunit/field_variable_test.js @@ -0,0 +1,91 @@ +/** + * @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 Tests for Blockly.Field + * @author marisaleung@google.com (Marisa Leung) + */ +'use strict'; + +goog.require('goog.testing'); + +var workspace; +var saved_msg = Blockly.Msg.DELETE_VARIABLE; + +function fieldVariable_setUp() { + Blockly.Msg.DELETE_VARIABLE = 'Delete the "%1" variable'; + workspace = new Blockly.Workspace(); +} + +function fieldVariable_tearDown() { + workspace.dispose(); + Blockly.Msg.DELETE_VARIABLE = saved_msg; +} + +function fieldVariable_mockBlock() { + return {'workspace': workspace, 'isShadow': function(){return false;}}; +} + +function test_fieldVariable_Constructor() { + fieldVariable_setUp(); + var fieldVariable = new Blockly.FieldVariable('name1'); + assertEquals('name1', fieldVariable.getText()); + fieldVariable_tearDown(); +} + +function test_fieldVariable_setValueMatchId() { + // Expect the fieldVariable value to be set to variable name + fieldVariable_setUp(); + workspace.createVariable('name2', null, 'id1'); + var fieldVariable = new Blockly.FieldVariable('name1'); + var mockBlock = fieldVariable_mockBlock(); + fieldVariable.setSourceBlock(mockBlock); + fieldVariable.setValue('id1'); + assertEquals('name2', fieldVariable.getText()); + assertEquals('id1', fieldVariable.value_); + fieldVariable_tearDown(); +} + +function test_fieldVariable_setValueMatchName() { + // Expect the fieldVariable value to be set to variable name + fieldVariable_setUp(); + workspace.createVariable('name2', null, 'id2'); + var fieldVariable = new Blockly.FieldVariable('name1'); + var mockBlock = fieldVariable_mockBlock(); + fieldVariable.setSourceBlock(mockBlock); + fieldVariable.setValue('name2'); + assertEquals('name2', fieldVariable.getText()); + assertEquals('id2', fieldVariable.value_); + fieldVariable_tearDown(); +} + +function test_fieldVariable_setValueNoVariable() { + // Expect the fieldVariable value to be set to the passed in string. No error + // should be thrown. + fieldVariable_setUp(); + var fieldVariable = new Blockly.FieldVariable('name1'); + var mockBlock = {'workspace': workspace, + 'isShadow': function(){return false;}}; + fieldVariable.setSourceBlock(mockBlock); + fieldVariable.setValue('id1'); + assertEquals('id1', fieldVariable.getText()); + assertEquals('id1', fieldVariable.value_); + fieldVariable_tearDown(); +} diff --git a/tests/jsunit/index.html b/tests/jsunit/index.html index c4a60b7d8..2b3512751 100644 --- a/tests/jsunit/index.html +++ b/tests/jsunit/index.html @@ -16,6 +16,7 @@ +