Skip to content

Commit 57c314b

Browse files
dye784ngokevin
authored andcommitted
Validate schema's default values (#2511)
* commented out * completed isValidDefaultCoordinates and isValidSchema functions * added console log test cases * added a checker for type * refactored to be drier * added warning and fixed check to consider 0 as a coordinate * removed change in index.html * changed opacity default from a string of 1.0 to the number * removed forward slashes from description and deleted new lines * made param for isValidaDefaultCoordinate more descriptive * removed accidental file commit * changed name from validate.js to validate-schema.js * adjusted the file path to correct file name * added curly brackets to isValidDefaultValue, moved validation methods into schema, reversed conditional statement for validation warning * null is valid default value for coordinates, refactored conditionals to be cleaner * added unit tests for isValidDefaultCoordinate * completed tests for isValidDefaultValue, almost modified isValidDefaultCoordinate tests to have a test for null
1 parent 811850b commit 57c314b

File tree

3 files changed

+147
-3
lines changed

3 files changed

+147
-3
lines changed

‎src/components/text.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ module.exports.Component = registerComponent('text', {
6161
letterSpacing: {type: 'number', default: 0},
6262
// `lineHeight` defaults to font's `lineHeight` value.
6363
lineHeight: {type: 'number'},
64-
opacity: {type: 'number', default: '1.0'},
64+
opacity: {type: 'number', default: 1.0},
6565
shader: {default: 'sdf', oneOf: shaders},
6666
side: {default: 'front', oneOf: ['front', 'back', 'double']},
6767
tabSize: {default: 4},

‎src/core/schema.js‎

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,14 @@ function processPropertyDefinition (propDefinition) {
7272
// Fill in type name.
7373
propDefinition.type = typeName;
7474

75-
// Fill in default value.
76-
if (!('default' in propDefinition)) {
75+
// Check if default value exists.
76+
if ('default' in propDefinition) {
77+
// Check if default values are valid
78+
if (!isValidDefaultValue(typeName, defaultVal)) {
79+
warn('The default value: ' + '"' + defaultVal + '"' + ' does not match the type: ' + typeName);
80+
}
81+
} else {
82+
// Fill in default value.
7783
propDefinition.default = propType.default;
7884
}
7985

@@ -160,3 +166,59 @@ function stringifyProperty (value, propDefinition) {
160166
return propDefinition.stringify(value);
161167
}
162168
module.exports.stringifyProperty = stringifyProperty;
169+
170+
/**
171+
* Checks if Valid default coordinates
172+
* @param {unknown} possibleCoordinates
173+
* @param {number} dimensions - 2 for 2D Vector or 3 for 3D vector
174+
* @returns {boolean} A boolean determining if coordinates are parsed correctly.
175+
*/
176+
function isValidDefaultCoordinate (possibleCoordinates, dimensions) {
177+
if (possibleCoordinates === null) { return true; }
178+
if (typeof possibleCoordinates !== 'object') { return false; }
179+
180+
if (Object.keys(possibleCoordinates).length !== dimensions) {
181+
return false;
182+
} else {
183+
var x = possibleCoordinates.x;
184+
var y = possibleCoordinates.y;
185+
var z = possibleCoordinates.z;
186+
var w = possibleCoordinates.w;
187+
188+
if (typeof x !== 'number' || typeof y !== 'number') { return false; }
189+
if (dimensions > 2 && typeof z !== 'number') { return false; }
190+
if (dimensions > 3 && typeof w !== 'number') { return false; }
191+
}
192+
193+
return true;
194+
}
195+
module.exports.isValidDefaultCoordinate = isValidDefaultCoordinate;
196+
197+
/**
198+
* Validates the default values in a schema
199+
* @param {string} type - type in a prop
200+
* @param {unknown} defaultVal - default in a prop
201+
* @returns {boolean} A boolean determining if defaults are valid.
202+
*/
203+
function isValidDefaultValue (type, defaultVal) {
204+
if (type === 'audio' && typeof defaultVal !== 'string') { return false; }
205+
if (type === 'array' && !Array.isArray(defaultVal)) { return false; }
206+
if (type === 'asset' && typeof defaultVal !== 'string') { return false; }
207+
if (type === 'boolean' && typeof defaultVal !== 'boolean') { return false; }
208+
if (type === 'color' && typeof defaultVal !== 'string') { return false; }
209+
if (type === 'int' && typeof defaultVal !== 'number') { return false; }
210+
if (type === 'number' && typeof defaultVal !== 'number') { return false; }
211+
if (type === 'map' && typeof defaultVal !== 'string') { return false; }
212+
if (type === 'model' && typeof defaultVal !== 'string') { return false; }
213+
if (type === 'selector' && typeof defaultVal !== 'string') { return false; }
214+
if (type === 'selectorAll' && typeof defaultVal !== 'string') { return false; }
215+
if (type === 'src' && typeof defaultVal !== 'string') { return false; }
216+
if (type === 'string' && typeof defaultVal !== 'string') { return false; }
217+
if (type === 'time' && typeof defaultVal !== 'number') { return false; }
218+
if (type === 'vec2') { return isValidDefaultCoordinate(defaultVal, 2); }
219+
if (type === 'vec3') { return isValidDefaultCoordinate(defaultVal, 3); }
220+
if (type === 'vec4') { return isValidDefaultCoordinate(defaultVal, 4); }
221+
222+
return true;
223+
}
224+
module.exports.isValidDefaultValue = isValidDefaultValue;

‎tests/core/schema.test.js‎

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ var parseProperties = Schema.parseProperties;
77
var parseProperty = Schema.parseProperty;
88
var processSchema = Schema.process;
99
var stringifyProperty = Schema.stringifyProperty;
10+
var isValidDefaultCoordinate = Schema.isValidDefaultCoordinate;
11+
var isValidDefaultValue = Schema.isValidDefaultValue;
1012

1113
suite('schema', function () {
1214
suite('isSingleProperty', function () {
@@ -205,4 +207,84 @@ suite('schema', function () {
205207
assert.equal(parsedValue, 'null');
206208
});
207209
});
210+
211+
suite('isValidDefaultCoordinate', function () {
212+
test('is true for null', function () {
213+
assert.equal(isValidDefaultCoordinate(null, 2), true);
214+
});
215+
test('is true for vec2 if { x: num, y:num }', function () {
216+
var validCoordinates = { x: 1, y: 2 };
217+
assert.equal(isValidDefaultCoordinate(validCoordinates, 2), true);
218+
});
219+
220+
test('is true for vec3 if { x: num, y:num z: num }', function () {
221+
var validCoordinates = { x: 1, y: 2, z: 3 };
222+
assert.equal(isValidDefaultCoordinate(validCoordinates, 3), true);
223+
});
224+
225+
test('is true for vec4 if { x: num, y:num z: num w: num }', function () {
226+
var validCoordinates = { x: 1, y: 2, z: 3, w: 4 };
227+
assert.equal(isValidDefaultCoordinate(validCoordinates, 4), true);
228+
});
229+
230+
test('is false for everything else', function () {
231+
var invalidCoordinates1 = { notX: 1 };
232+
var invalidCoordinates2 = { x: '' };
233+
var invalidCoordinates3 = { x: 0, z: 5 };
234+
var invalidCoordinates4 = { x: 5, y: {} };
235+
var invalidCoordinates5 = { x: 1, y: [] };
236+
var invalidCoordinates6 = { notX: 'not coordinates at all' };
237+
var invalidCoordinates7 = { x: 5, y: 1, z: 2 }; // Invalid for vec4
238+
assert.equal(isValidDefaultCoordinate(invalidCoordinates1, 2), false);
239+
assert.equal(isValidDefaultCoordinate(invalidCoordinates2, 2), false);
240+
assert.equal(isValidDefaultCoordinate(invalidCoordinates3, 2), false);
241+
assert.equal(isValidDefaultCoordinate(invalidCoordinates4, 3), false);
242+
assert.equal(isValidDefaultCoordinate(invalidCoordinates5, 4), false);
243+
assert.equal(isValidDefaultCoordinate(invalidCoordinates6, 4), false);
244+
assert.equal(isValidDefaultCoordinate(invalidCoordinates7, 4), false);
245+
});
246+
});
247+
248+
suite('isValidDefaultValue', function () {
249+
test('is true when type and typeof default value matches', function () {
250+
assert.equal(isValidDefaultValue('audio', 'string'), true);
251+
assert.equal(isValidDefaultValue('array', []), true);
252+
assert.equal(isValidDefaultValue('asset', 'string'), true);
253+
assert.equal(isValidDefaultValue('boolean', true), true);
254+
assert.equal(isValidDefaultValue('color', '#FFF'), true);
255+
assert.equal(isValidDefaultValue('int', 9000), true);
256+
assert.equal(isValidDefaultValue('number', 42), true);
257+
assert.equal(isValidDefaultValue('map', 'string'), true);
258+
assert.equal(isValidDefaultValue('model', 'string'), true);
259+
assert.equal(isValidDefaultValue('selector', 'string'), true);
260+
assert.equal(isValidDefaultValue('selectorAll', 'string'), true);
261+
assert.equal(isValidDefaultValue('src', 'string'), true);
262+
assert.equal(isValidDefaultValue('string', 'string'), true);
263+
assert.equal(isValidDefaultValue('time', 24), true);
264+
assert.equal(isValidDefaultValue('vec2', { x: 1, y: 1 }), true);
265+
assert.equal(isValidDefaultValue('vec3', { x: 0, y: 9, z: 0 }), true);
266+
assert.equal(isValidDefaultValue('vec4', { x: 9, y: 9, z: 9, w: 9 }), true);
267+
assert.equal(isValidDefaultValue('vec4', null), true);
268+
});
269+
270+
test('is false for everything else', function () {
271+
assert.equal(isValidDefaultValue('audio', 1), false);
272+
assert.equal(isValidDefaultValue('array', {}), false);
273+
assert.equal(isValidDefaultValue('asset', 2), false);
274+
assert.equal(isValidDefaultValue('boolean', { not: 'a boolean' }), false);
275+
assert.equal(isValidDefaultValue('color', 123456), false);
276+
assert.equal(isValidDefaultValue('int', 'not a number'), false);
277+
assert.equal(isValidDefaultValue('number', ['something else']), false);
278+
assert.equal(isValidDefaultValue('map', 3), false);
279+
assert.equal(isValidDefaultValue('model', 4), false);
280+
assert.equal(isValidDefaultValue('selector', 5), false);
281+
assert.equal(isValidDefaultValue('selectorAll', 6), false);
282+
assert.equal(isValidDefaultValue('src', 7), false);
283+
assert.equal(isValidDefaultValue('string', 8), false);
284+
assert.equal(isValidDefaultValue('time', 'string'), false);
285+
assert.equal(isValidDefaultValue('vec2', [1, 2, 3]), false);
286+
assert.equal(isValidDefaultValue('vec3', undefined), false);
287+
assert.equal(isValidDefaultValue('vec4', false), false);
288+
});
289+
});
208290
});

0 commit comments

Comments
 (0)