Update FieldDropdown to use dev-tools helpers (#4316)

This commit is contained in:
Monica Kozbial
2020-10-02 14:15:20 -07:00
committed by GitHub
parent ba9ea757b6
commit e67e49ad9b

View File

@@ -7,159 +7,110 @@
suite('Dropdown Fields', function() {
setup(function() {
sharedTestSetup.call(this);
// Invalid value test are expected to log errors.
const nativeConsoleError = console.error;
this.nativeConsoleError = nativeConsoleError;
console.error = function(msg) {
if (!msg.includes('Each FieldDropdown option')) {
nativeConsoleError.call(this, ...arguments);
}
};
});
teardown(function() {
console.error = this.nativeConsoleError;
sharedTestTeardown.call(this);
});
function assertValue(dropdownField, expectedValue, expectedText) {
var actualValue = dropdownField.getValue();
var actualText = dropdownField.getText();
chai.assert.equal(actualValue, expectedValue);
chai.assert.equal(actualText, expectedText);
}
suite('Constructor', function() {
test('Empty', function() {
chai.assert.throws(function() {
new Blockly.FieldDropdown();
});
});
test('Undefined', function() {
chai.assert.throws(function() {
new Blockly.FieldDropdown(undefined);
});
});
test('Array Items not Arrays', function() {
var stub = sinon.stub(console, 'error');
chai.assert.throws(function() {
new Blockly.FieldDropdown([1, 2, 3]);
});
sinon.assert.calledThrice(stub);
stub.restore();
});
test('Array Items with Invalid IDs', function() {
var stub = sinon.stub(console, 'error');
chai.assert.throws(function() {
new Blockly.FieldDropdown([['1', 1], ['2', 2], ['3', 3]]);
});
sinon.assert.calledThrice(stub);
stub.restore();
});
test('Array Items with Invalid Content', function() {
var stub = sinon.stub(console, 'error');
chai.assert.throws(function() {
new Blockly.FieldDropdown([[1, '1'], [2, '2'], [3, '3']]);
});
sinon.assert.calledThrice(stub);
stub.restore();
});
test('Text Dropdown', function() {
var dropdownField = new Blockly.FieldDropdown(
[['a', 'A'], ['b', 'B'], ['c', 'C']]);
assertValue(dropdownField, 'A', 'a');
});
test('Image Dropdown', function() {
var dropdownField = new Blockly.FieldDropdown([
/**
* Configuration for field tests with invalid values.
* @type {!Array<!FieldCreationTestCase>}
*/
var invalidValueCreationTestCases = [
{title: 'Undefined', args: [undefined]},
{title: 'Array Items not Arrays', args: [undefined]},
{title: 'Array Items with Invalid IDs',
args: [[['1', 1], ['2', 2], ['3', 3]]]},
{title: 'Array Items with Invalid Content',
args: [[[1, '1'], [2, '2'], [3, '3']]]},
];
/**
* Configuration for field tests with valid values.
* @type {!Array<!FieldCreationTestCase>}
*/
var validValueCreationTestCases = [
{title: 'Text Dropdown', value: 'A', expectedValue: 'A', expectedText: 'a',
args: [[['a', 'A'], ['b', 'B'], ['c', 'C']]]},
{title: 'Image Dropdown', value: 'A', expectedValue: 'A', expectedText: 'a',
args: [[
[{ src:'scrA', alt:'a' }, 'A'],
[{ src:'scrB', alt:'b' }, 'B'],
[{ src:'scrC', alt:'c' }, 'C']]);
assertValue(dropdownField, 'A', 'a');
});
test('Dynamic Dropdown Text', function() {
var dynamicDropdownFunc = function() {
[{ src:'scrC', alt:'c' }, 'C']]]},
{title: 'Dynamic Text Dropdown', value: 'A', expectedValue: 'A', expectedText: 'a',
args: [() => {
return [['a', 'A'], ['b', 'B'], ['c', 'C']];
};
var dropdownField = new Blockly.FieldDropdown(dynamicDropdownFunc);
assertValue(dropdownField, 'A', 'a');
});
test('Dynamic Dropdown Image', function() {
var dynamicDropdownFunc = function() {
}]},
{title: 'Dynamic Image Dropdown', value: 'A', expectedValue: 'A', expectedText: 'a',
args: [() => {
return [
[{ src:'scrA', alt:'a' }, 'A'],
[{ src:'scrB', alt:'b' }, 'B'],
[{ src:'scrC', alt:'c' }, 'C']
];
};
var dropdownField = new Blockly.FieldDropdown(dynamicDropdownFunc);
assertValue(dropdownField, 'A', 'a');
});
});
suite('fromJson', function() {
test('Empty', function() {
chai.assert.throws(function() {
Blockly.FieldDropdown.fromJson({});
});
});
test('Undefined', function() {
chai.assert.throws(function() {
Blockly.FieldDropdown.fromJson({ options: undefined });
});
});
test('Array Items not Arrays', function() {
var stub = sinon.stub(console, 'error');
chai.assert.throws(function() {
Blockly.FieldDropdown.fromJson({ options: [1, 2, 3] });
});
sinon.assert.calledThrice(stub);
stub.restore();
});
test('Array Items with Invalid IDs', function() {
var stub = sinon.stub(console, 'error');
chai.assert.throws(function() {
Blockly.FieldDropdown.fromJson(
{ options:[['1', 1], ['2', 2], ['3', 3]] });
});
sinon.assert.calledThrice(stub);
stub.restore();
});
test('Array Items with Invalid Content', function() {
var stub = sinon.stub(console, 'error');
chai.assert.throws(function() {
Blockly.FieldDropdown.fromJson(
{ options:[[1, '1'], [2, '2'], [3, '3']] });
});
sinon.assert.calledThrice(stub);
stub.restore();
});
test('Text Dropdown', function() {
var dropdownField = Blockly.FieldDropdown.fromJson(
{ options:[['a', 'A'], ['b', 'B'], ['c', 'C']] });
assertValue(dropdownField, 'A', 'a');
});
test('Image Dropdown', function() {
var dropdownField = Blockly.FieldDropdown.fromJson({ options:[
[{ src:'scrA', alt:'a' }, 'A'],
[{ src:'scrB', alt:'b' }, 'B'],
[{ src:'scrC', alt:'c' }, 'C']] });
assertValue(dropdownField, 'A', 'a');
});
});
[{ src:'scrC', alt:'c' }, 'C']];
}]},
];
var addJson = function(testCase) {
testCase.json = {'options': testCase.args[0]};
};
invalidValueCreationTestCases.forEach(addJson);
validValueCreationTestCases.forEach(addJson);
/**
* Asserts that the field properties are correct based on the test case.
* @param {!Blockly.FieldNumber} field The field to check.
* @param {!FieldValueTestCase} testCase The test case.
*/
var validTestCaseAssertField = function(field, testCase) {
testHelpers.assertFieldValue(field, testCase.expectedValue, testCase.expectedText);
};
testHelpers.runConstructorSuiteTests(
Blockly.FieldDropdown, validValueCreationTestCases,
invalidValueCreationTestCases, validTestCaseAssertField);
testHelpers.runFromJsonSuiteTests(
Blockly.FieldDropdown, validValueCreationTestCases,
invalidValueCreationTestCases, validTestCaseAssertField);
/**
* Configuration for field tests with invalid values.
* @type {!Array<!FieldCreationTestCase>}
*/
var invalidValueSetValueTestCases = [
{title: 'Null', value: null},
{title: 'Undefined', value: undefined},
{title: 'Invalid ID', value: 'bad'},
];
/**
* Configuration for field tests with valid values.
* @type {!Array<!FieldValueTestCase>}
*/
var validValueSetValueTestCases = [
{title: 'Valid ID', value: 'B', expectedValue: 'B', expectedText: 'b'},
];
suite('setValue', function() {
setup(function() {
this.dropdownField = new Blockly.FieldDropdown(
this.field = new Blockly.FieldDropdown(
[['a', 'A'], ['b', 'B'], ['c', 'C']]);
});
test('Null', function() {
this.dropdownField.setValue(null);
assertValue(this.dropdownField, 'A', 'a');
});
test('Undefined', function() {
this.dropdownField.setValue(undefined);
assertValue(this.dropdownField, 'A', 'a');
});
test('Invalid ID', function() {
this.dropdownField.setValue('bad');
assertValue(this.dropdownField, 'A', 'a');
});
test('Valid ID', function() {
this.dropdownField.setValue('B');
assertValue(this.dropdownField, 'B', 'b');
});
testHelpers.runSetValueTests(
validValueSetValueTestCases, invalidValueSetValueTestCases, 'A', 'a');
test('With source block', function() {
this.dropdownField.setSourceBlock(createTestBlock());
this.dropdownField.setValue('B');
assertValue(this.dropdownField, 'B', 'b');
this.field.setSourceBlock(createTestBlock());
this.field.setValue('B');
testHelpers.assertFieldValue(this.field, 'B', 'b');
});
});
suite('Validators', function() {
setup(function() {
this.dropdownField = new Blockly.FieldDropdown([
@@ -177,7 +128,7 @@ suite('Dropdown Fields', function() {
});
test('New Value', function() {
this.dropdownField.setValue('1B');
assertValue(this.dropdownField, '1A', '1a');
testHelpers.assertFieldValue(this.dropdownField, '1A', '1a');
});
});
suite('Force 1s Validator', function() {
@@ -188,7 +139,7 @@ suite('Dropdown Fields', function() {
});
test('New Value', function() {
this.dropdownField.setValue('2B');
assertValue(this.dropdownField, '1B', '1b');
testHelpers.assertFieldValue(this.dropdownField, '1B', '1b');
});
});
suite('Returns Undefined Validator', function() {
@@ -197,7 +148,7 @@ suite('Dropdown Fields', function() {
});
test('New Value', function() {
this.dropdownField.setValue('1B');
assertValue(this.dropdownField, '1B', '1b');
testHelpers.assertFieldValue(this.dropdownField, '1B', '1b');
});
});
});