Blame view

node_modules/json-schema/test/tests.js 3.12 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
  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);