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