OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 var AssertTrue = requireNative('assert').AssertTrue; | |
6 var JSONSchemaValidator = require('json_schema').JSONSchemaValidator; | |
7 var LOG = requireNative('logging').LOG; | |
8 | |
9 function assertValid(type, instance, schema, types) { | |
10 var validator = new JSONSchemaValidator(); | |
11 if (types) | |
12 validator.addTypes(types); | |
13 validator["validate" + type](instance, schema, ""); | |
14 var success = true; | |
15 if (validator.errors.length != 0) { | |
16 LOG("Got unexpected errors"); | |
17 for (var i = 0; i < validator.errors.length; i++) { | |
18 LOG(validator.errors[i].message + " path: " + validator.errors[i].path); | |
19 } | |
20 success = false; | |
21 } | |
22 AssertTrue(success); | |
23 } | |
24 | |
25 function assertNotValid(type, instance, schema, errors, types) { | |
26 var validator = new JSONSchemaValidator(); | |
27 if (types) | |
28 validator.addTypes(types); | |
29 validator["validate" + type](instance, schema, ""); | |
30 AssertTrue(validator.errors.length === errors.length); | |
31 var success = true; | |
32 for (var i = 0; i < errors.length; i++) { | |
33 if (validator.errors[i].message == errors[i]) { | |
34 LOG("Got expected error: " + validator.errors[i].message + | |
35 " for path: " + validator.errors[i].path); | |
36 } else { | |
37 LOG("Missed expected error: " + errors[i] + ". Got: " + | |
38 validator.errors[i].message + " instead."); | |
39 success = false; | |
40 } | |
41 } | |
42 AssertTrue(success); | |
43 } | |
44 | |
45 function assertListConsistsOfElements(list, elements) { | |
46 var success = true; | |
47 for (var li = 0; li < list.length; li++) { | |
48 for (var ei = 0; ei < elements.length && list[li] != elements[ei]; ei++) { } | |
49 if (ei == elements.length) { | |
50 LOG("Expected type not found: " + list[li]); | |
51 success = false; | |
52 } | |
53 } | |
54 AssertTrue(success); | |
55 } | |
56 | |
57 function assertEqualSets(set1, set2) { | |
58 assertListConsistsOfElements(set1, set2); | |
59 assertListConsistsOfElements(set2, set1); | |
60 } | |
61 | |
62 function formatError(key, replacements) { | |
63 return JSONSchemaValidator.formatError(key, replacements); | |
64 } | |
65 | |
66 function testFormatError() { | |
67 AssertTrue(formatError("propertyRequired") == "Property is required."); | |
68 AssertTrue(formatError("invalidEnum", ["foo, bar"]) == | |
69 "Value must be one of: [foo, bar]."); | |
70 AssertTrue(formatError("invalidType", ["foo", "bar"]) == | |
71 "Expected 'foo' but got 'bar'."); | |
72 } | |
73 | |
74 function testComplex() { | |
75 var schema = { | |
76 type: "array", | |
77 items: [ | |
78 { | |
79 type: "object", | |
80 properties: { | |
81 id: { | |
82 type: "integer", | |
83 minimum: 1 | |
84 }, | |
85 url: { | |
86 type: "string", | |
87 pattern: /^https?\:/, | |
88 optional: true | |
89 }, | |
90 index: { | |
91 type: "integer", | |
92 minimum: 0, | |
93 optional: true | |
94 }, | |
95 selected: { | |
96 type: "boolean", | |
97 optional: true | |
98 } | |
99 } | |
100 }, | |
101 { type: "function", optional: true }, | |
102 { type: "function", optional: true } | |
103 ] | |
104 }; | |
105 | |
106 var instance = [ | |
107 { | |
108 id: 42, | |
109 url: "http://www.google.com/", | |
110 index: 2, | |
111 selected: true | |
112 }, | |
113 function(){}, | |
114 function(){} | |
115 ]; | |
116 | |
117 assertValid("", instance, schema); | |
118 instance.length = 2; | |
119 assertValid("", instance, schema); | |
120 instance.length = 1; | |
121 instance.push({}); | |
122 assertNotValid("", instance, schema, | |
123 [formatError("invalidType", ["function", "object"])]); | |
124 instance[1] = function(){}; | |
125 | |
126 instance[0].url = "foo"; | |
127 assertNotValid("", instance, schema, | |
128 [formatError("stringPattern", | |
129 [schema.items[0].properties.url.pattern])]); | |
130 delete instance[0].url; | |
131 assertValid("", instance, schema); | |
132 | |
133 instance[0].id = 0; | |
134 assertNotValid("", instance, schema, | |
135 [formatError("numberMinValue", | |
136 [schema.items[0].properties.id.minimum])]); | |
137 } | |
138 | |
139 function testEnum() { | |
140 var schema = { | |
141 enum: ["foo", 42, false] | |
142 }; | |
143 | |
144 assertValid("", "foo", schema); | |
145 assertValid("", 42, schema); | |
146 assertValid("", false, schema); | |
147 assertNotValid("", "42", schema, [formatError("invalidEnum", | |
148 [schema.enum.join(", ")])]); | |
149 assertNotValid("", null, schema, [formatError("invalidEnum", | |
150 [schema.enum.join(", ")])]); | |
151 } | |
152 | |
153 function testChoices() { | |
154 var schema = { | |
155 choices: [ | |
156 { type: "null" }, | |
157 { type: "undefined" }, | |
158 { type: "integer", minimum:42, maximum:42 }, | |
159 { type: "object", properties: { foo: { type: "string" } } } | |
160 ] | |
161 } | |
162 assertValid("", null, schema); | |
163 assertValid("", undefined, schema); | |
164 assertValid("", 42, schema); | |
165 assertValid("", {foo: "bar"}, schema); | |
166 | |
167 assertNotValid("", "foo", schema, [formatError("invalidChoice", [])]); | |
168 assertNotValid("", [], schema, [formatError("invalidChoice", [])]); | |
169 assertNotValid("", {foo: 42}, schema, [formatError("invalidChoice", [])]); | |
170 } | |
171 | |
172 function testExtends() { | |
173 var parent = { | |
174 type: "number" | |
175 } | |
176 var schema = { | |
177 extends: parent | |
178 }; | |
179 | |
180 assertValid("", 42, schema); | |
181 assertNotValid("", "42", schema, | |
182 [formatError("invalidType", ["number", "string"])]); | |
183 | |
184 // Make the derived schema more restrictive | |
185 parent.minimum = 43; | |
186 assertNotValid("", 42, schema, [formatError("numberMinValue", [43])]); | |
187 assertValid("", 43, schema); | |
188 } | |
189 | |
190 function testObject() { | |
191 var schema = { | |
192 properties: { | |
193 "foo": { | |
194 type: "string" | |
195 }, | |
196 "bar": { | |
197 type: "integer" | |
198 } | |
199 } | |
200 }; | |
201 | |
202 assertValid("Object", {foo:"foo", bar:42}, schema); | |
203 assertNotValid("Object", {foo:"foo", bar:42,"extra":true}, schema, | |
204 [formatError("unexpectedProperty")]); | |
205 assertNotValid("Object", {foo:"foo"}, schema, | |
206 [formatError("propertyRequired")]); | |
207 assertNotValid("Object", {foo:"foo", bar:"42"}, schema, | |
208 [formatError("invalidType", ["integer", "string"])]); | |
209 | |
210 schema.additionalProperties = { type: "any" }; | |
211 assertValid("Object", {foo:"foo", bar:42, "extra":true}, schema); | |
212 assertValid("Object", {foo:"foo", bar:42, "extra":"foo"}, schema); | |
213 | |
214 schema.additionalProperties = { type: "boolean" }; | |
215 assertValid("Object", {foo:"foo", bar:42, "extra":true}, schema); | |
216 assertNotValid("Object", {foo:"foo", bar:42, "extra":"foo"}, schema, | |
217 [formatError("invalidType", ["boolean", "string"])]); | |
218 | |
219 schema.properties.bar.optional = true; | |
220 assertValid("Object", {foo:"foo", bar:42}, schema); | |
221 assertValid("Object", {foo:"foo"}, schema); | |
222 assertValid("Object", {foo:"foo", bar:null}, schema); | |
223 assertValid("Object", {foo:"foo", bar:undefined}, schema); | |
224 assertNotValid("Object", {foo:"foo", bar:"42"}, schema, | |
225 [formatError("invalidType", ["integer", "string"])]); | |
226 } | |
227 | |
228 function testTypeReference() { | |
229 var referencedTypes = [ | |
230 { | |
231 id: "MinLengthString", | |
232 type: "string", | |
233 minLength: 2 | |
234 }, | |
235 { | |
236 id: "Max10Int", | |
237 type: "integer", | |
238 maximum: 10 | |
239 } | |
240 ]; | |
241 | |
242 var schema = { | |
243 type: "object", | |
244 properties: { | |
245 "foo": { | |
246 type: "string" | |
247 }, | |
248 "bar": { | |
249 $ref: "Max10Int" | |
250 }, | |
251 "baz": { | |
252 $ref: "MinLengthString" | |
253 } | |
254 } | |
255 }; | |
256 | |
257 var schemaInlineReference = { | |
258 type: "object", | |
259 properties: { | |
260 "foo": { | |
261 type: "string" | |
262 }, | |
263 "bar": { | |
264 id: "NegativeInt", | |
265 type: "integer", | |
266 maximum: 0 | |
267 }, | |
268 "baz": { | |
269 $ref: "NegativeInt" | |
270 } | |
271 } | |
272 } | |
273 | |
274 // Valid type references externally added. | |
275 assertValid("", {foo:"foo",bar:4,baz:"ab"}, schema, referencedTypes); | |
276 | |
277 // Valida type references internally defined. | |
278 assertValid("", {foo:"foo",bar:-4,baz:-2}, schemaInlineReference); | |
279 | |
280 // Failures in validation, but succesful schema reference. | |
281 assertNotValid("", {foo:"foo",bar:4,baz:"a"}, schema, | |
282 [formatError("stringMinLength", [2])], referencedTypes); | |
283 assertNotValid("", {foo:"foo",bar:20,baz:"abc"}, schema, | |
284 [formatError("numberMaxValue", [10])], referencedTypes); | |
285 | |
286 // Remove MinLengthString type. | |
287 referencedTypes.shift(); | |
288 assertNotValid("", {foo:"foo",bar:4,baz:"ab"}, schema, | |
289 [formatError("unknownSchemaReference", ["MinLengthString"])], | |
290 referencedTypes); | |
291 | |
292 // Remove internal type "NegativeInt" | |
293 delete schemaInlineReference.properties.bar; | |
294 assertNotValid("", {foo:"foo",baz:-2}, schemaInlineReference, | |
295 [formatError("unknownSchemaReference", ["NegativeInt"])]); | |
296 } | |
297 | |
298 function testArrayTuple() { | |
299 var schema = { | |
300 items: [ | |
301 { | |
302 type: "string" | |
303 }, | |
304 { | |
305 type: "integer" | |
306 } | |
307 ] | |
308 }; | |
309 | |
310 assertValid("Array", ["42", 42], schema); | |
311 assertNotValid("Array", ["42", 42, "anything"], schema, | |
312 [formatError("arrayMaxItems", [schema.items.length])]); | |
313 assertNotValid("Array", ["42"], schema, [formatError("itemRequired")]); | |
314 assertNotValid("Array", [42, 42], schema, | |
315 [formatError("invalidType", ["string", "integer"])]); | |
316 | |
317 schema.additionalProperties = { type: "any" }; | |
318 assertValid("Array", ["42", 42, "anything"], schema); | |
319 assertValid("Array", ["42", 42, []], schema); | |
320 | |
321 schema.additionalProperties = { type: "boolean" }; | |
322 assertNotValid("Array", ["42", 42, "anything"], schema, | |
323 [formatError("invalidType", ["boolean", "string"])]); | |
324 assertValid("Array", ["42", 42, false], schema); | |
325 | |
326 schema.items[0].optional = true; | |
327 assertValid("Array", ["42", 42], schema); | |
328 assertValid("Array", [, 42], schema); | |
329 assertValid("Array", [null, 42], schema); | |
330 assertValid("Array", [undefined, 42], schema); | |
331 assertNotValid("Array", [42, 42], schema, | |
332 [formatError("invalidType", ["string", "integer"])]); | |
333 } | |
334 | |
335 function testArrayNonTuple() { | |
336 var schema = { | |
337 items: { | |
338 type: "string" | |
339 }, | |
340 minItems: 2, | |
341 maxItems: 3 | |
342 }; | |
343 | |
344 assertValid("Array", ["x", "x"], schema); | |
345 assertValid("Array", ["x", "x", "x"], schema); | |
346 | |
347 assertNotValid("Array", ["x"], schema, | |
348 [formatError("arrayMinItems", [schema.minItems])]); | |
349 assertNotValid("Array", ["x", "x", "x", "x"], schema, | |
350 [formatError("arrayMaxItems", [schema.maxItems])]); | |
351 assertNotValid("Array", [42], schema, | |
352 [formatError("arrayMinItems", [schema.minItems]), | |
353 formatError("invalidType", ["string", "integer"])]); | |
354 } | |
355 | |
356 function testString() { | |
357 var schema = { | |
358 minLength: 1, | |
359 maxLength: 10, | |
360 pattern: /^x/ | |
361 }; | |
362 | |
363 assertValid("String", "x", schema); | |
364 assertValid("String", "xxxxxxxxxx", schema); | |
365 | |
366 assertNotValid("String", "y", schema, | |
367 [formatError("stringPattern", [schema.pattern])]); | |
368 assertNotValid("String", "xxxxxxxxxxx", schema, | |
369 [formatError("stringMaxLength", [schema.maxLength])]); | |
370 assertNotValid("String", "", schema, | |
371 [formatError("stringMinLength", [schema.minLength]), | |
372 formatError("stringPattern", [schema.pattern])]); | |
373 } | |
374 | |
375 function testNumber() { | |
376 var schema = { | |
377 minimum: 1, | |
378 maximum: 100, | |
379 maxDecimal: 2 | |
380 }; | |
381 | |
382 assertValid("Number", 1, schema); | |
383 assertValid("Number", 50, schema); | |
384 assertValid("Number", 100, schema); | |
385 assertValid("Number", 88.88, schema); | |
386 | |
387 assertNotValid("Number", 0.5, schema, | |
388 [formatError("numberMinValue", [schema.minimum])]); | |
389 assertNotValid("Number", 100.1, schema, | |
390 [formatError("numberMaxValue", [schema.maximum])]); | |
391 assertNotValid("Number", 100.111, schema, | |
392 [formatError("numberMaxValue", [schema.maximum]), | |
393 formatError("numberMaxDecimal", [schema.maxDecimal])]); | |
394 | |
395 var nan = 0/0; | |
396 AssertTrue(isNaN(nan)); | |
397 assertNotValid("Number", nan, schema, | |
398 [formatError("numberFiniteNotNan", ["NaN"])]); | |
399 | |
400 assertNotValid("Number", Number.POSITIVE_INFINITY, schema, | |
401 [formatError("numberFiniteNotNan", ["Infinity"]), | |
402 formatError("numberMaxValue", [schema.maximum]) | |
403 ]); | |
404 | |
405 assertNotValid("Number", Number.NEGATIVE_INFINITY, schema, | |
406 [formatError("numberFiniteNotNan", ["-Infinity"]), | |
407 formatError("numberMinValue", [schema.minimum]) | |
408 ]); | |
409 } | |
410 | |
411 function testIntegerBounds() { | |
412 assertValid("Number", 0, {type:"integer"}); | |
413 assertValid("Number", -1, {type:"integer"}); | |
414 assertValid("Number", 2147483647, {type:"integer"}); | |
415 assertValid("Number", -2147483648, {type:"integer"}); | |
416 assertNotValid("Number", 0.5, {type:"integer"}, | |
417 [formatError("numberIntValue", [])]); | |
418 assertNotValid("Number", 10000000000, {type:"integer"}, | |
419 [formatError("numberIntValue", [])]); | |
420 assertNotValid("Number", 2147483647.5, {type:"integer"}, | |
421 [formatError("numberIntValue", [])]); | |
422 assertNotValid("Number", 2147483648, {type:"integer"}, | |
423 [formatError("numberIntValue", [])]); | |
424 assertNotValid("Number", 2147483649, {type:"integer"}, | |
425 [formatError("numberIntValue", [])]); | |
426 assertNotValid("Number", -2147483649, {type:"integer"}, | |
427 [formatError("numberIntValue", [])]); | |
428 } | |
429 | |
430 function testType() { | |
431 // valid | |
432 assertValid("Type", {}, {type:"object"}); | |
433 assertValid("Type", [], {type:"array"}); | |
434 assertValid("Type", function(){}, {type:"function"}); | |
435 assertValid("Type", "foobar", {type:"string"}); | |
436 assertValid("Type", "", {type:"string"}); | |
437 assertValid("Type", 88.8, {type:"number"}); | |
438 assertValid("Type", 42, {type:"number"}); | |
439 assertValid("Type", 0, {type:"number"}); | |
440 assertValid("Type", 42, {type:"integer"}); | |
441 assertValid("Type", 0, {type:"integer"}); | |
442 assertValid("Type", true, {type:"boolean"}); | |
443 assertValid("Type", false, {type:"boolean"}); | |
444 assertValid("Type", null, {type:"null"}); | |
445 assertValid("Type", undefined, {type:"undefined"}); | |
446 | |
447 // not valid | |
448 assertNotValid("Type", [], {type: "object"}, | |
449 [formatError("invalidType", ["object", "array"])]); | |
450 assertNotValid("Type", null, {type: "object"}, | |
451 [formatError("invalidType", ["object", "null"])]); | |
452 assertNotValid("Type", function(){}, {type: "object"}, | |
453 [formatError("invalidType", ["object", "function"])]); | |
454 assertNotValid("Type", 42, {type: "array"}, | |
455 [formatError("invalidType", ["array", "integer"])]); | |
456 assertNotValid("Type", 42, {type: "string"}, | |
457 [formatError("invalidType", ["string", "integer"])]); | |
458 assertNotValid("Type", "42", {type: "number"}, | |
459 [formatError("invalidType", ["number", "string"])]); | |
460 assertNotValid("Type", 88.8, {type: "integer"}, | |
461 [formatError("invalidTypeIntegerNumber")]); | |
462 assertNotValid("Type", 1, {type: "boolean"}, | |
463 [formatError("invalidType", ["boolean", "integer"])]); | |
464 assertNotValid("Type", false, {type: "null"}, | |
465 [formatError("invalidType", ["null", "boolean"])]); | |
466 assertNotValid("Type", undefined, {type: "null"}, | |
467 [formatError("invalidType", ["null", "undefined"])]); | |
468 assertNotValid("Type", {}, {type: "function"}, | |
469 [formatError("invalidType", ["function", "object"])]); | |
470 } | |
471 | |
472 function testGetAllTypesForSchema() { | |
473 var referencedTypes = [ | |
474 { | |
475 id: "ChoicesRef", | |
476 choices: [ | |
477 { type: "integer" }, | |
478 { type: "string" } | |
479 ] | |
480 }, | |
481 { | |
482 id: "ObjectRef", | |
483 type: "object", | |
484 } | |
485 ]; | |
486 | |
487 var arraySchema = { | |
488 type: "array" | |
489 }; | |
490 | |
491 var choicesSchema = { | |
492 choices: [ | |
493 { type: "object" }, | |
494 { type: "function" } | |
495 ] | |
496 }; | |
497 | |
498 var objectRefSchema = { | |
499 $ref: "ObjectRef" | |
500 }; | |
501 | |
502 var complexSchema = { | |
503 choices: [ | |
504 { $ref: "ChoicesRef" }, | |
505 { type: "function" }, | |
506 { $ref: "ObjectRef" } | |
507 ] | |
508 }; | |
509 | |
510 var validator = new JSONSchemaValidator(); | |
511 validator.addTypes(referencedTypes); | |
512 | |
513 var arraySchemaTypes = validator.getAllTypesForSchema(arraySchema); | |
514 assertEqualSets(arraySchemaTypes, ["array"]); | |
515 | |
516 var choicesSchemaTypes = validator.getAllTypesForSchema(choicesSchema); | |
517 assertEqualSets(choicesSchemaTypes, ["object", "function"]); | |
518 | |
519 var objectRefSchemaTypes = validator.getAllTypesForSchema(objectRefSchema); | |
520 assertEqualSets(objectRefSchemaTypes, ["object"]); | |
521 | |
522 var complexSchemaTypes = validator.getAllTypesForSchema(complexSchema); | |
523 assertEqualSets(complexSchemaTypes, | |
524 ["integer", "string", "function", "object"]); | |
525 } | |
526 | |
527 function testIsValidSchemaType() { | |
528 var referencedTypes = [ | |
529 { | |
530 id: "ChoicesRef", | |
531 choices: [ | |
532 { type: "integer" }, | |
533 { type: "string" } | |
534 ] | |
535 } | |
536 ]; | |
537 | |
538 var objectSchema = { | |
539 type: "object", | |
540 optional: true | |
541 }; | |
542 | |
543 var complexSchema = { | |
544 choices: [ | |
545 { $ref: "ChoicesRef" }, | |
546 { type: "function" }, | |
547 ] | |
548 }; | |
549 | |
550 var validator = new JSONSchemaValidator(); | |
551 validator.addTypes(referencedTypes); | |
552 | |
553 AssertTrue(validator.isValidSchemaType("object", objectSchema)); | |
554 AssertTrue(!validator.isValidSchemaType("integer", objectSchema)); | |
555 AssertTrue(!validator.isValidSchemaType("array", objectSchema)); | |
556 AssertTrue(validator.isValidSchemaType("null", objectSchema)); | |
557 AssertTrue(validator.isValidSchemaType("undefined", objectSchema)); | |
558 | |
559 AssertTrue(validator.isValidSchemaType("integer", complexSchema)); | |
560 AssertTrue(validator.isValidSchemaType("function", complexSchema)); | |
561 AssertTrue(validator.isValidSchemaType("string", complexSchema)); | |
562 AssertTrue(!validator.isValidSchemaType("object", complexSchema)); | |
563 AssertTrue(!validator.isValidSchemaType("null", complexSchema)); | |
564 AssertTrue(!validator.isValidSchemaType("undefined", complexSchema)); | |
565 } | |
566 | |
567 function testCheckSchemaOverlap() { | |
568 var referencedTypes = [ | |
569 { | |
570 id: "ChoicesRef", | |
571 choices: [ | |
572 { type: "integer" }, | |
573 { type: "string" } | |
574 ] | |
575 }, | |
576 { | |
577 id: "ObjectRef", | |
578 type: "object", | |
579 } | |
580 ]; | |
581 | |
582 var arraySchema = { | |
583 type: "array" | |
584 }; | |
585 | |
586 var choicesSchema = { | |
587 choices: [ | |
588 { type: "object" }, | |
589 { type: "function" } | |
590 ] | |
591 }; | |
592 | |
593 var objectRefSchema = { | |
594 $ref: "ObjectRef" | |
595 }; | |
596 | |
597 var complexSchema = { | |
598 choices: [ | |
599 { $ref: "ChoicesRef" }, | |
600 { type: "function" }, | |
601 { $ref: "ObjectRef" } | |
602 ] | |
603 }; | |
604 | |
605 var validator = new JSONSchemaValidator(); | |
606 validator.addTypes(referencedTypes); | |
607 | |
608 AssertTrue(!validator.checkSchemaOverlap(arraySchema, choicesSchema)); | |
609 AssertTrue(!validator.checkSchemaOverlap(arraySchema, objectRefSchema)); | |
610 AssertTrue(!validator.checkSchemaOverlap(arraySchema, complexSchema)); | |
611 AssertTrue(validator.checkSchemaOverlap(choicesSchema, objectRefSchema)); | |
612 AssertTrue(validator.checkSchemaOverlap(choicesSchema, complexSchema)); | |
613 AssertTrue(validator.checkSchemaOverlap(objectRefSchema, complexSchema)); | |
614 } | |
615 | |
616 function testInstanceOf() { | |
617 function Animal() {}; | |
618 function Cat() {}; | |
619 function Dog() {}; | |
620 Cat.prototype = new Animal; | |
621 Cat.prototype.constructor = Cat; | |
622 Dog.prototype = new Animal; | |
623 Dog.prototype.constructor = Dog; | |
624 var cat = new Cat(); | |
625 var dog = new Dog(); | |
626 var num = new Number(1); | |
627 | |
628 // instanceOf should check type by walking up prototype chain. | |
629 assertValid("", cat, {type:"object", isInstanceOf:"Cat"}); | |
630 assertValid("", cat, {type:"object", isInstanceOf:"Animal"}); | |
631 assertValid("", cat, {type:"object", isInstanceOf:"Object"}); | |
632 assertValid("", dog, {type:"object", isInstanceOf:"Dog"}); | |
633 assertValid("", dog, {type:"object", isInstanceOf:"Animal"}); | |
634 assertValid("", dog, {type:"object", isInstanceOf:"Object"}); | |
635 assertValid("", num, {type:"object", isInstanceOf:"Number"}); | |
636 assertValid("", num, {type:"object", isInstanceOf:"Object"}); | |
637 | |
638 assertNotValid("", cat, {type:"object", isInstanceOf:"Dog"}, | |
639 [formatError("notInstance", ["Dog"])]); | |
640 assertNotValid("", dog, {type:"object", isInstanceOf:"Cat"}, | |
641 [formatError("notInstance", ["Cat"])]); | |
642 assertNotValid("", cat, {type:"object", isInstanceOf:"String"}, | |
643 [formatError("notInstance", ["String"])]); | |
644 assertNotValid("", dog, {type:"object", isInstanceOf:"String"}, | |
645 [formatError("notInstance", ["String"])]); | |
646 assertNotValid("", num, {type:"object", isInstanceOf:"Array"}, | |
647 [formatError("notInstance", ["Array"])]); | |
648 assertNotValid("", num, {type:"object", isInstanceOf:"String"}, | |
649 [formatError("notInstance", ["String"])]); | |
650 } | |
651 | |
652 // Tests exposed to schema_unittest.cc. | |
653 exports.testFormatError = testFormatError; | |
654 exports.testComplex = testComplex; | |
655 exports.testEnum = testEnum; | |
656 exports.testExtends = testExtends; | |
657 exports.testObject = testObject; | |
658 exports.testArrayTuple = testArrayTuple; | |
659 exports.testArrayNonTuple = testArrayNonTuple; | |
660 exports.testString = testString; | |
661 exports.testNumber = testNumber; | |
662 exports.testIntegerBounds = testIntegerBounds; | |
663 exports.testType = testType; | |
664 exports.testTypeReference = testTypeReference; | |
665 exports.testGetAllTypesForSchema = testGetAllTypesForSchema; | |
666 exports.testIsValidSchemaType = testIsValidSchemaType; | |
667 exports.testCheckSchemaOverlap = testCheckSchemaOverlap; | |
668 exports.testInstanceOf = testInstanceOf; | |
OLD | NEW |