diff --git a/component.json b/component.json index da1f1ee..e510f08 100644 --- a/component.json +++ b/component.json @@ -21,10 +21,12 @@ "index.js", "validate.js", "context.js", + "deepequal.js", "type/object.js", "type/array.js", "type/string.js", - "type/numeric.js" + "type/numeric.js", + "type/enum.js" ] } diff --git a/deepequal.js b/deepequal.js new file mode 100644 index 0000000..64965f6 --- /dev/null +++ b/deepequal.js @@ -0,0 +1,88 @@ + +/* + * Copied from sinon.js, minus the Element equality checking not needed here. + * http://github.com/cjohansen/Sinon.JS + * (BSD License -- see below) + * + */ +module.exports = function deepEqual(a, b) { + + if (typeof a != "object" || typeof b != "object") { + return a === b; + } + + if (a === b) { + return true; + } + + if ((a === null && b !== null) || (a !== null && b === null)) { + return false; + } + + var aString = Object.prototype.toString.call(a); + if (aString != Object.prototype.toString.call(b)) { + return false; + } + + if (aString == "[object Array]") { + if (a.length !== b.length) { + return false; + } + + for (var i = 0, l = a.length; i < l; i += 1) { + if (!deepEqual(a[i], b[i])) { + return false; + } + } + + return true; + } + + var prop, aLength = 0, bLength = 0; + + for (prop in a) { + aLength += 1; + + if (!deepEqual(a[prop], b[prop])) { + return false; + } + } + + for (prop in b) { + bLength += 1; + } + + return aLength == bLength; +} + +/* + +(The BSD License) + +Copyright (c) 2010-2013, Christian Johansen, christian@cjohansen.no +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of Christian Johansen nor the names of his contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ diff --git a/index.js b/index.js index 29e66d9..e99eb22 100644 --- a/index.js +++ b/index.js @@ -10,23 +10,13 @@ var validateObject = require('./type/object') , validateArray = require('./type/array') , validateString = require('./type/string') , validateNumeric = require('./type/numeric') + , validateEnum = require('./type/enum') /* - -var validateArray = require('./type/array') - , validateBoolean = require('./type/boolean') - , validateNumber = require('./type/number') - , validateString = require('./type/string') - , validateAllOf = require('./type/allof') - , validateAnyOf = require('./type/anyof') - , validateOneOf = require('./type/oneof') - , validateNot = require('./type/not') - var formatDate = require('./format/date') , formatTime = require('./format/time') , formatUTC = require('./format/utc') , formatRegex = require('./format/regex') - */ @@ -51,6 +41,7 @@ function plugin(target){ plugin.addType('array',validateArray); plugin.addType('string',validateString); plugin.addType('numeric',validateNumeric); + plugin.addType('enum',validateEnum); Context.emitter(plugin._listener); diff --git a/test/index.html b/test/index.html index 3ef7f9f..c8a39df 100644 --- a/test/index.html +++ b/test/index.html @@ -31,7 +31,7 @@ - + @@ -44,7 +44,7 @@ - + diff --git a/type/array.js b/type/array.js index b3a8e16..f1cd25b 100644 --- a/type/array.js +++ b/type/array.js @@ -1,6 +1,7 @@ 'use strict'; var type = require('type') + , deepEqual = require('../deepequal') module.exports = validateArray; @@ -88,90 +89,4 @@ function validateArrayItems(){ } -/* - * Copied from sinon.js, minus the Element equality checking not needed here. - * http://github.com/cjohansen/Sinon.JS - * (BSD License -- see below) - * - */ -function deepEqual(a, b) { - if (typeof a != "object" || typeof b != "object") { - return a === b; - } - - if (a === b) { - return true; - } - - if ((a === null && b !== null) || (a !== null && b === null)) { - return false; - } - - var aString = Object.prototype.toString.call(a); - if (aString != Object.prototype.toString.call(b)) { - return false; - } - - if (aString == "[object Array]") { - if (a.length !== b.length) { - return false; - } - - for (var i = 0, l = a.length; i < l; i += 1) { - if (!deepEqual(a[i], b[i])) { - return false; - } - } - - return true; - } - - var prop, aLength = 0, bLength = 0; - - for (prop in a) { - aLength += 1; - - if (!deepEqual(a[prop], b[prop])) { - return false; - } - } - - for (prop in b) { - bLength += 1; - } - - return aLength == bLength; -} - -/* - -(The BSD License) - -Copyright (c) 2010-2013, Christian Johansen, christian@cjohansen.no -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of Christian Johansen nor the names of his contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ diff --git a/type/enum.js b/type/enum.js new file mode 100644 index 0000000..9715eb7 --- /dev/null +++ b/type/enum.js @@ -0,0 +1,26 @@ +'use strict'; +var deepEqual = require('../deepequal') + +module.exports = validateEnum; + +function validateEnum(){ + var values = this.property('enum') + , instance = this.instance() + , valid = true + + if (!values) return (valid); + valid = this.assert(type(values)=='array', + "specified enum is not an array", + "enum" + ) && valid + + if (!valid) return (valid); + + var found = false; + for (var i=0;i