From c1f30544ffc3e7b3f70e16c969b6b14a8b26309f Mon Sep 17 00:00:00 2001 From: Julien Castelain Date: Wed, 10 Jan 2018 16:19:36 +0100 Subject: [PATCH 1/2] Adds a range validator --- packages/metal-state/src/Config.js | 10 ++++++++++ packages/metal-state/src/validators.js | 24 ++++++++++++++++++++++++ packages/metal-state/test/Config.js | 8 ++++++++ packages/metal-state/test/validators.js | 18 ++++++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/packages/metal-state/src/Config.js b/packages/metal-state/src/Config.js index 0e24f3f8..bf4fd8af 100644 --- a/packages/metal-state/src/Config.js +++ b/packages/metal-state/src/Config.js @@ -107,6 +107,16 @@ const Config = { return this.validator(validators.oneOfType(validatorArray)); }, + /** + * Creates `State` configuration object with a `rangeOf` validator. + * @param {!Number} min The minimum value allowed. + * @param {!Number} max The maximum value allowed. + * @return {ConfigWithValidator} `State` configuration object. + */ + rangeOf(min, max) { + return this.validator(validators.rangeOf(min, max)); + }, + /** * Creates `State` configuration object with a `shapeOf` validator. * @param {!Object.} shapeObj Values being `State` configuration objects. diff --git a/packages/metal-state/src/validators.js b/packages/metal-state/src/validators.js index 790eb1be..4c9ffa80 100644 --- a/packages/metal-state/src/validators.js +++ b/packages/metal-state/src/validators.js @@ -127,6 +127,30 @@ const validators = { }); }, + /** + * Creates a validator that checks for a value within a range. + * @param {!Number} min The minimum value allowed. + * @param {!Number} max The maximum value allowed. + * @return {!function()} + */ + rangeOf: function(min, max) { + const minResult = validators.number(min); + const maxResult = validators.number(max); + if (isInvalid(minResult)) { + return minResult; + } + if (isInvalid(maxResult)) { + return maxResult; + } + return maybe(value => { + const valueResult = validators.number(value); + if (isInvalid(valueResult)) { + return valueResult; + } + return value >= min && value <= max; + }); + }, + /** * Creates a validator that checks if the received value is an object, and * that its contents match the given shape. diff --git a/packages/metal-state/test/Config.js b/packages/metal-state/test/Config.js index 67314d62..3abb806b 100644 --- a/packages/metal-state/test/Config.js +++ b/packages/metal-state/test/Config.js @@ -334,4 +334,12 @@ describe('Config', function() { assert.isUndefined(config.config.required); assert.isUndefined(config2.config.required); }); + + it('should validate ranges', function() { + const config = Config.rangeOf(0, 100); + assert.ok(core.isObject(config)); + assert.ok(config.config.validator(10)); + assert.isFalse(config.config.validator(101)); + assert.ok(config.config.validator('3') instanceof Error); + }); }); diff --git a/packages/metal-state/test/validators.js b/packages/metal-state/test/validators.js index 37e73138..df0f07ca 100644 --- a/packages/metal-state/test/validators.js +++ b/packages/metal-state/test/validators.js @@ -296,4 +296,22 @@ describe('validators', function() { assert.equal(resultError, ERROR_MESSAGE); }); + + it('should validate a range', function() { + const range1 = validators.rangeOf(0, 100); + assert.isTrue(range1(1)); + assert.isFalse(range1(-1)); + + const range2 = validators.rangeOf('foo', null); + assert.ok(range2 instanceof Error); + + const range3 = validators.rangeOf(1, 'bar'); + assert.ok(range3 instanceof Error); + + const range4 = validators.rangeOf(1, 10); + assert.isFalse(range4(-1)); + assert.isFalse(range4(11)); + assert.ok(range4('foo') instanceof Error); + assert.ok(range4({}) instanceof Error); + }); }); From 067ed25262e4f71dadbd13fb4d0be27f0948e255 Mon Sep 17 00:00:00 2001 From: Julien Castelain Date: Wed, 10 Jan 2018 16:42:47 +0100 Subject: [PATCH 2/2] Renames rangeOf to inRange --- packages/metal-state/src/Config.js | 20 +++++------ packages/metal-state/src/validators.js | 48 ++++++++++++------------- packages/metal-state/test/Config.js | 2 +- packages/metal-state/test/validators.js | 8 ++--- 4 files changed, 39 insertions(+), 39 deletions(-) diff --git a/packages/metal-state/src/Config.js b/packages/metal-state/src/Config.js index bf4fd8af..c6db63fb 100644 --- a/packages/metal-state/src/Config.js +++ b/packages/metal-state/src/Config.js @@ -62,6 +62,16 @@ const Config = { */ func: setPrimitiveValidators('func'), + /** + * Creates `State` configuration object with a `rangeOf` validator. + * @param {!Number} min The minimum value allowed. + * @param {!Number} max The maximum value allowed. + * @return {ConfigWithValidator} `State` configuration object. + */ + inRange(min, max) { + return this.validator(validators.inRange(min, max)); + }, + /** * Function that creates `State` object with an `instanceOf` validator. * @return {ConfigWithValidator} `State` configuration object. @@ -107,16 +117,6 @@ const Config = { return this.validator(validators.oneOfType(validatorArray)); }, - /** - * Creates `State` configuration object with a `rangeOf` validator. - * @param {!Number} min The minimum value allowed. - * @param {!Number} max The maximum value allowed. - * @return {ConfigWithValidator} `State` configuration object. - */ - rangeOf(min, max) { - return this.validator(validators.rangeOf(min, max)); - }, - /** * Creates `State` configuration object with a `shapeOf` validator. * @param {!Object.} shapeObj Values being `State` configuration objects. diff --git a/packages/metal-state/src/validators.js b/packages/metal-state/src/validators.js index 4c9ffa80..8bae4b6b 100644 --- a/packages/metal-state/src/validators.js +++ b/packages/metal-state/src/validators.js @@ -40,6 +40,30 @@ const validators = { }); }, + /** + * Creates a validator that checks for a value within a range. + * @param {!Number} min The minimum value allowed. + * @param {!Number} max The maximum value allowed. + * @return {!function()} + */ + inRange: function(min, max) { + const minResult = validators.number(min); + const maxResult = validators.number(max); + if (isInvalid(minResult)) { + return minResult; + } + if (isInvalid(maxResult)) { + return maxResult; + } + return maybe(value => { + const valueResult = validators.number(value); + if (isInvalid(valueResult)) { + return valueResult; + } + return value >= min && value <= max; + }); + }, + /** * Creates a validator that checks if a value is an instance of a given class. * @param {!function()} expectedClass Class to check value against. @@ -127,30 +151,6 @@ const validators = { }); }, - /** - * Creates a validator that checks for a value within a range. - * @param {!Number} min The minimum value allowed. - * @param {!Number} max The maximum value allowed. - * @return {!function()} - */ - rangeOf: function(min, max) { - const minResult = validators.number(min); - const maxResult = validators.number(max); - if (isInvalid(minResult)) { - return minResult; - } - if (isInvalid(maxResult)) { - return maxResult; - } - return maybe(value => { - const valueResult = validators.number(value); - if (isInvalid(valueResult)) { - return valueResult; - } - return value >= min && value <= max; - }); - }, - /** * Creates a validator that checks if the received value is an object, and * that its contents match the given shape. diff --git a/packages/metal-state/test/Config.js b/packages/metal-state/test/Config.js index 3abb806b..78d37d45 100644 --- a/packages/metal-state/test/Config.js +++ b/packages/metal-state/test/Config.js @@ -336,7 +336,7 @@ describe('Config', function() { }); it('should validate ranges', function() { - const config = Config.rangeOf(0, 100); + const config = Config.inRange(0, 100); assert.ok(core.isObject(config)); assert.ok(config.config.validator(10)); assert.isFalse(config.config.validator(101)); diff --git a/packages/metal-state/test/validators.js b/packages/metal-state/test/validators.js index df0f07ca..41d26bd9 100644 --- a/packages/metal-state/test/validators.js +++ b/packages/metal-state/test/validators.js @@ -298,17 +298,17 @@ describe('validators', function() { }); it('should validate a range', function() { - const range1 = validators.rangeOf(0, 100); + const range1 = validators.inRange(0, 100); assert.isTrue(range1(1)); assert.isFalse(range1(-1)); - const range2 = validators.rangeOf('foo', null); + const range2 = validators.inRange('foo', null); assert.ok(range2 instanceof Error); - const range3 = validators.rangeOf(1, 'bar'); + const range3 = validators.inRange(1, 'bar'); assert.ok(range3 instanceof Error); - const range4 = validators.rangeOf(1, 10); + const range4 = validators.inRange(1, 10); assert.isFalse(range4(-1)); assert.isFalse(range4(11)); assert.ok(range4('foo') instanceof Error);