From 630863d9db64a129371f23755be649e2b0bd015e Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Mon, 6 Feb 2017 14:47:45 -0800 Subject: [PATCH 1/2] Add isEditable to field, and add tests --- core/field.js | 11 ++++++ tests/jsunit/field_test.js | 77 ++++++++++++++++++++++++++++++++++++++ tests/jsunit/index.html | 1 + 3 files changed, 89 insertions(+) create mode 100644 tests/jsunit/field_test.js diff --git a/core/field.js b/core/field.js index d89c9c779..7558718be 100644 --- a/core/field.js +++ b/core/field.js @@ -194,6 +194,17 @@ Blockly.Field.prototype.updateEditable = function() { } }; +/** + * Check whether this field is currently editable. Some fields are never + * editable (e.g. text labels). Those fields are not serialized to XML. Other + * fields may be editable, and therefore serialized, but may exist on + * non-editable blocks. + * @return {boolean} whether this field is editable and on an editable block + */ +Blockly.Field.prototype.isEditable = function() { + return this.EDITABLE && !!this.sourceBlock_ && this.sourceBlock_.isEditable(); +}; + /** * Gets whether this editable field is visible or not. * @return {boolean} True if visible. diff --git a/tests/jsunit/field_test.js b/tests/jsunit/field_test.js new file mode 100644 index 000000000..2af26d60d --- /dev/null +++ b/tests/jsunit/field_test.js @@ -0,0 +1,77 @@ +/** + * @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 fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +function test_field_iseditable() { + var field = new Blockly.Field("Dummy text"); + // EDITABLE is true by default, but without a source block a field can't be + // edited. + assertFalse('Field without a block is not editable', field.isEditable()); + + // Setting EDITABLE to false doesn't matter. + field = new Blockly.Field("Dummy text"); + field.EDITABLE = false; + assertFalse('Field without a block is not editable', field.isEditable()); + + // Tests with an editable source block. + var editableBlock = { + isEditable: function() { + return true; + } + }; + + field = new Blockly.Field("Dummy text"); + field.sourceBlock_ = editableBlock; + + assertTrue('Editable field with editable block is editable', + field.isEditable()); + + field = new Blockly.Field("Dummy text"); + field.sourceBlock_ = editableBlock; + field.EDITABLE = false; + + assertFalse('Non-editable field with editable block is not editable', + field.isEditable()); + + // Tests with a non-editable source block. + var nonEditableBlock = { + isEditable: function() { + return false; + } + }; + + field = new Blockly.Field("Dummy text"); + field.sourceBlock_ = nonEditableBlock; + + assertFalse('Editable field with non-editable block is not editable', + field.isEditable()); + + field = new Blockly.Field("Dummy text"); + field.sourceBlock_ = nonEditableBlock; + field.EDITABLE = false; + + assertFalse('Non-editable field with non-editable block is not editable', + field.isEditable()); +} diff --git a/tests/jsunit/index.html b/tests/jsunit/index.html index 71623d384..c24a395ee 100644 --- a/tests/jsunit/index.html +++ b/tests/jsunit/index.html @@ -11,6 +11,7 @@ + From 5a402081382669002ec907fea4bfa1fcf3808357 Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Mon, 6 Feb 2017 15:25:59 -0800 Subject: [PATCH 2/2] Separate tests --- core/field.js | 2 +- tests/jsunit/field_test.js | 50 +++++++++++++++++++++++++++----------- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/core/field.js b/core/field.js index 7558718be..e815683b5 100644 --- a/core/field.js +++ b/core/field.js @@ -201,7 +201,7 @@ Blockly.Field.prototype.updateEditable = function() { * non-editable blocks. * @return {boolean} whether this field is editable and on an editable block */ -Blockly.Field.prototype.isEditable = function() { +Blockly.Field.prototype.isCurrentlyEditable = function() { return this.EDITABLE && !!this.sourceBlock_ && this.sourceBlock_.isEditable(); }; diff --git a/tests/jsunit/field_test.js b/tests/jsunit/field_test.js index 2af26d60d..6a0faebc8 100644 --- a/tests/jsunit/field_test.js +++ b/tests/jsunit/field_test.js @@ -24,54 +24,76 @@ */ 'use strict'; -function test_field_iseditable() { +function test_field_isEditable_simple() { var field = new Blockly.Field("Dummy text"); // EDITABLE is true by default, but without a source block a field can't be // edited. - assertFalse('Field without a block is not editable', field.isEditable()); + assertFalse('Field without a block is not editable', + field.isCurrentlyEditable()); +} +function test_field_isEditable_false() { // Setting EDITABLE to false doesn't matter. - field = new Blockly.Field("Dummy text"); + var field = new Blockly.Field("Dummy text"); field.EDITABLE = false; - assertFalse('Field without a block is not editable', field.isEditable()); + assertFalse('Field without a block is not editable', + field.isCurrentlyEditable()); +} - // Tests with an editable source block. +function test_field_isEditable_editableBlock() { var editableBlock = { isEditable: function() { return true; } }; - field = new Blockly.Field("Dummy text"); + var field = new Blockly.Field("Dummy text"); field.sourceBlock_ = editableBlock; assertTrue('Editable field with editable block is editable', - field.isEditable()); + field.isCurrentlyEditable()); +} - field = new Blockly.Field("Dummy text"); +function test_field_isEditable_editableBlock_false() { + var editableBlock = { + isEditable: function() { + return true; + } + }; + + var field = new Blockly.Field("Dummy text"); field.sourceBlock_ = editableBlock; field.EDITABLE = false; assertFalse('Non-editable field with editable block is not editable', - field.isEditable()); + field.isCurrentlyEditable()); +} - // Tests with a non-editable source block. +function test_field_isEditable_nonEditableBlock() { var nonEditableBlock = { isEditable: function() { return false; } }; - field = new Blockly.Field("Dummy text"); + var field = new Blockly.Field("Dummy text"); field.sourceBlock_ = nonEditableBlock; assertFalse('Editable field with non-editable block is not editable', - field.isEditable()); + field.isCurrentlyEditable()); +} - field = new Blockly.Field("Dummy text"); +function test_field_isEditable_nonEditableBlock_false() { + var nonEditableBlock = { + isEditable: function() { + return false; + } + }; + + var field = new Blockly.Field("Dummy text"); field.sourceBlock_ = nonEditableBlock; field.EDITABLE = false; assertFalse('Non-editable field with non-editable block is not editable', - field.isEditable()); + field.isCurrentlyEditable()); }