| var assert = require('assert'); |
| var vows = require('vows'); |
| var path = require('path'); |
| var fs = require('fs'); |
| |
| var validate = require('../lib/validate').validate; |
| |
| |
| var revision = 'draft-03'; |
| var schemaRoot = path.join(__dirname, '..', revision); |
| var schemaNames = ['schema', 'hyper-schema', 'links', 'json-ref' ]; |
| var schemas = {}; |
| |
| schemaNames.forEach(function(name) { |
| var file = path.join(schemaRoot, name); |
| schemas[name] = loadSchema(file); |
| }); |
| |
| schemaNames.forEach(function(name) { |
| var s, n = name+'-nsd', f = path.join(schemaRoot, name); |
| schemas[n] = loadSchema(f); |
| s = schemas[n]; |
| delete s['$schema']; |
| }); |
| |
| function loadSchema(path) { |
| var data = fs.readFileSync(path, 'utf-8'); |
| var schema = JSON.parse(data); |
| return schema; |
| } |
| |
| function resultIsValid() { |
| return function(result) { |
| assert.isObject(result); |
| //assert.isBoolean(result.valid); |
| assert.equal(typeof(result.valid), 'boolean'); |
| assert.isArray(result.errors); |
| for (var i = 0; i < result.errors.length; i++) { |
| assert.notEqual(result.errors[i], null, 'errors['+i+'] is null'); |
| } |
| } |
| } |
| |
| function assertValidates(doc, schema) { |
| var context = {}; |
| |
| context[': validate('+doc+', '+schema+')'] = { |
| topic: validate(schemas[doc], schemas[schema]), |
| 'returns valid result': resultIsValid(), |
| 'with valid=true': function(result) { assert.equal(result.valid, true); }, |
| 'and no errors': function(result) { |
| // XXX work-around for bug in vows: [null] chokes it |
| if (result.errors[0] == null) assert.fail('(errors contains null)'); |
| assert.length(result.errors, 0); |
| } |
| }; |
| |
| return context; |
| } |
| |
| function assertSelfValidates(doc) { |
| var context = {}; |
| |
| context[': validate('+doc+')'] = { |
| topic: validate(schemas[doc]), |
| 'returns valid result': resultIsValid(), |
| 'with valid=true': function(result) { assert.equal(result.valid, true); }, |
| 'and no errors': function(result) { assert.length(result.errors, 0); } |
| }; |
| |
| return context; |
| } |
| |
| var suite = vows.describe('JSON Schema').addBatch({ |
| 'Core-NSD self-validates': assertSelfValidates('schema-nsd'), |
| 'Core-NSD/Core-NSD': assertValidates('schema-nsd', 'schema-nsd'), |
| 'Core-NSD/Core': assertValidates('schema-nsd', 'schema'), |
| |
| 'Core self-validates': assertSelfValidates('schema'), |
| 'Core/Core': assertValidates('schema', 'schema'), |
| |
| 'Hyper-NSD self-validates': assertSelfValidates('hyper-schema-nsd'), |
| 'Hyper self-validates': assertSelfValidates('hyper-schema'), |
| 'Hyper/Hyper': assertValidates('hyper-schema', 'hyper-schema'), |
| 'Hyper/Core': assertValidates('hyper-schema', 'schema'), |
| |
| 'Links-NSD self-validates': assertSelfValidates('links-nsd'), |
| 'Links self-validates': assertSelfValidates('links'), |
| 'Links/Hyper': assertValidates('links', 'hyper-schema'), |
| 'Links/Core': assertValidates('links', 'schema'), |
| |
| 'Json-Ref self-validates': assertSelfValidates('json-ref'), |
| 'Json-Ref/Hyper': assertValidates('json-ref', 'hyper-schema'), |
| 'Json-Ref/Core': assertValidates('json-ref', 'schema') |
| }).export(module); |