diff --git a/core/block.js b/core/block.js index 5cd0bfff7..8f5dedee9 100644 --- a/core/block.js +++ b/core/block.js @@ -1078,7 +1078,7 @@ Blockly.Block.prototype.updateVarName = function(variable) { for (var j = 0, field; field = input.fieldRow[j]; j++) { if (field.referencesVariables() && variable.getId() == field.getValue()) { - field.setText(variable.name); + field.refreshVariableName(); } } } diff --git a/core/field.js b/core/field.js index ffc903d82..f3205de49 100644 --- a/core/field.js +++ b/core/field.js @@ -723,6 +723,7 @@ Blockly.Field.prototype.getText = function() { /** * Set the text in this field. Trigger a rerender of the source block. * @param {*} newText New text. + * @deprecated 2019 setText should not be used directly. Use setValue instead. */ Blockly.Field.prototype.setText = function(newText) { if (newText === null) { diff --git a/core/field_image.js b/core/field_image.js index fc8a21fa8..8924a9418 100644 --- a/core/field_image.js +++ b/core/field_image.js @@ -170,8 +170,19 @@ Blockly.FieldImage.prototype.getFlipRtl = function() { * Set the alt text of this image. * @param {?string} alt New alt text. * @override + * @deprecated 2019 setText has been deprecated for all fields. Instead use + * setAlt to set the alt text of the field. */ Blockly.FieldImage.prototype.setText = function(alt) { + this.setAlt(alt); +}; + +/** + * Set the alt text of this image. + * @param {?string} alt New alt text. + * @public + */ +Blockly.FieldImage.prototype.setAlt = function(alt) { if (alt === null) { // No change if null. return; diff --git a/core/field_variable.js b/core/field_variable.js index 42fba9ebe..7f93b9244 100644 --- a/core/field_variable.js +++ b/core/field_variable.js @@ -253,7 +253,7 @@ Blockly.FieldVariable.prototype.doClassValidation_ = function(newId) { Blockly.FieldVariable.prototype.doValueUpdate_ = function(newId) { this.variable_ = Blockly.Variables.getVariable(this.workspace_, newId); this.value_ = newId; - this.text_ = (this.variable_.name); + this.text_ = this.variable_.name; this.isDirty_ = true; }; @@ -341,6 +341,17 @@ Blockly.FieldVariable.prototype.setTypes_ = function(opt_variableTypes, this.variableTypes = variableTypes; }; +/** + * Refreshes the name of the variable by grabbing the name of the model. + * Used when a variable gets renamed, but the ID stays the same. Should only + * be called by the block. + * @package + */ +Blockly.FieldVariable.prototype.refreshVariableName = function() { + this.text_ = this.variable_.name; + this.forceRerender(); +}; + /** * Return a sorted list of variable names for variable dropdown menus. * Include a special option at the end for creating a new variable name. diff --git a/tests/mocha/field_image_test.js b/tests/mocha/field_image_test.js index c175d3dda..c1c41b2a1 100644 --- a/tests/mocha/field_image_test.js +++ b/tests/mocha/field_image_test.js @@ -154,17 +154,49 @@ suite ('Image Fields', function() { this.imageField.setValue(undefined); assertValue(this.imageField, 'src', 'alt'); }); - test('New Src, New Alt', function() { + test('Good Src', function() { this.imageField.setValue('newSrc'); assertValue(this.imageField, 'newSrc', 'alt'); - this.imageField.setText('newAlt'); - assertValue(this.imageField, 'newSrc', 'newAlt'); }); - test('New Alt, New Src', function() { - this.imageField.setText('newAlt'); - assertValue(this.imageField, 'src', 'newAlt'); - this.imageField.setValue('newSrc'); - assertValue(this.imageField, 'newSrc', 'newAlt'); + }); + suite('setAlt', function() { + suite('No Alt -> New Alt', function() { + setup(function() { + this.imageField = new Blockly.FieldImage('src', 1, 1); + }); + test('Backwards Compat - setText', function() { + this.imageField.setText('newAlt'); + assertValue(this.imageField, 'src', 'newAlt'); + }); + test('Null', function() { + this.imageField.setText(null); + assertValue(this.imageField, 'src', ''); + }); + test('Good Alt', function() { + this.imageField.setText('newAlt'); + assertValue(this.imageField, 'src', 'newAlt'); + }); + }); + suite('Alt -> New Alt', function() { + setup(function() { + this.imageField = new Blockly.FieldImage('src', 1, 1, 'alt'); + }); + test('Backwards Compat - setText', function() { + this.imageField.setText('newAlt'); + assertValue(this.imageField, 'src', 'newAlt'); + }); + test('Null', function() { + this.imageField.setText(null); + assertValue(this.imageField, 'src', 'alt'); + }); + test('Empty String', function() { + this.imageField.setText(''); + assertValue(this.imageField, 'src', ''); + }); + test('Good Alt', function() { + this.imageField.setText('newAlt'); + assertValue(this.imageField, 'src', 'newAlt'); + }); }); }); }); diff --git a/tests/mocha/field_variable_test.js b/tests/mocha/field_variable_test.js index f83f06718..fc3be2aa7 100644 --- a/tests/mocha/field_variable_test.js +++ b/tests/mocha/field_variable_test.js @@ -27,7 +27,9 @@ suite('Variable Fields', function() { 'workspace': workspace, 'isShadow': function() { return false; - } + }, + 'renameVarById': Blockly.Block.prototype.renameVarById, + 'updateVarName': Blockly.Block.prototype.updateVarName, }; } function initField(fieldVariable, workspace) { @@ -80,7 +82,7 @@ suite('Variable Fields', function() { var result_options = Blockly.FieldVariable.dropdownCreate.call( fieldVariable); - // Expect three variable options and a rename option. + // Expect three variable options, a rename option, and a delete option. assertEquals(result_options.length, 5); isEqualArrays(result_options[0], ['name1', 'id1']); isEqualArrays(result_options[1], ['name2', 'id2']); @@ -214,7 +216,6 @@ suite('Variable Fields', function() { this.workspace.createVariable('name1', 'type1'); this.workspace.createVariable('name2', 'type2'); }); - test('variableTypes is undefined', function() { // Expect that since variableTypes is undefined, only type empty string // will be returned (regardless of what types are available on the workspace). @@ -222,7 +223,6 @@ suite('Variable Fields', function() { var resultTypes = fieldVariable.getVariableTypes_(); isEqualArrays(resultTypes, ['']); }); - test('variableTypes is explicit', function() { // Expect that since variableTypes is defined, it will be the return // value, regardless of what types are available on the workspace. @@ -233,7 +233,6 @@ suite('Variable Fields', function() { assertEquals('Default type was wrong', 'type1', fieldVariable.defaultType_); }); - test('variableTypes is null', function() { // Expect all variable types to be returned. // The field does not need to be initialized to do this--it just needs @@ -247,7 +246,6 @@ suite('Variable Fields', function() { // The empty string is always one of the options. isEqualArrays(resultTypes, ['type1', 'type2', '']); }); - test('variableTypes is the empty list', function() { var fieldVariable = new Blockly.FieldVariable('name1'); var mockBlock = getMockBlock(this.workspace); @@ -265,7 +263,6 @@ suite('Variable Fields', function() { assertEquals('The variable field\'s default type should be "b"', 'b', fieldVariable.defaultType_); }); - test('No default type', function() { var fieldVariable = new Blockly.FieldVariable(null); assertEquals('The variable field\'s default type should be the empty string', @@ -273,14 +270,12 @@ suite('Variable Fields', function() { assertNull('The variable field\'s allowed types should be null', fieldVariable.variableTypes); }); - test('Default type mismatch', function() { // Invalid default type when creating a variable field. chai.assert.throws(function() { var _fieldVariable = new Blockly.FieldVariable(null, null, ['a'], 'b'); }); }); - test('Default type mismatch with empty array', function() { // Invalid default type when creating a variable field. chai.assert.throws(function() { @@ -288,4 +283,40 @@ suite('Variable Fields', function() { }); }); }); + suite('Renaming Variables', function() { + setup(function() { + this.workspace.createVariable('name1', null, 'id1'); + Blockly.defineBlocksWithJsonArray([{ + "type": "field_variable_test_block", + "message0": "%1", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variable": "name1" + } + ], + }]); + this.variableBlock = new Blockly.Block(this.workspace, + 'field_variable_test_block'); + this.variableField = this.variableBlock.getField('VAR'); + }); + teardown(function() { + this.variableBlock.dispose(); + this.variableBlock = null; + this.variableField = null; + delete Blockly.Blocks['field_variable_test_block']; + }); + test('Rename & Keep Old ID', function() { + this.workspace.renameVariableById('id1', 'name2'); + chai.assert.equal(this.variableField.getText(), 'name2'); + chai.assert.equal(this.variableField.getValue(), 'id1'); + }); + test('Rename & Get New ID', function() { + this.workspace.createVariable('name2', null, 'id2'); + this.workspace.renameVariableById('id1', 'name2'); + chai.assert.equal(this.variableField.getText(), 'name2'); + chai.assert.equal(this.variableField.getValue(), 'id2'); + }); + }); });