Sun calculation js library which is fully based on formula from http://aa.quae.nl/en/reken/zonpositie.html
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
5.6 KiB
167 lines
5.6 KiB
var tape = require('tape')
|
|
var validator = require('../')
|
|
var get = require('jsonpointer').get;
|
|
|
|
function toPointer( path ) {
|
|
if ( ! ( path && path.length && path.join ) ){
|
|
return '';
|
|
}
|
|
return '/' + path.join('/');
|
|
}
|
|
|
|
function lookup(schema, err){
|
|
return get(schema, toPointer(err.schemaPath));
|
|
}
|
|
|
|
tape('schemaPath', function(t) {
|
|
var schema = {
|
|
type: 'object',
|
|
target: 'top level',
|
|
properties: {
|
|
target: 'inside properties',
|
|
hello: {
|
|
target: 'inside hello',
|
|
type:'string'
|
|
},
|
|
someItems: {
|
|
target: 'in someItems',
|
|
type: 'array',
|
|
items: [
|
|
{
|
|
type: 'string'
|
|
},
|
|
{
|
|
type: 'array'
|
|
},
|
|
],
|
|
additionalItems: {
|
|
target: 'inside additionalItems',
|
|
type: 'boolean',
|
|
}
|
|
},
|
|
nestedOuter: {
|
|
type: 'object',
|
|
target: 'in nestedOuter',
|
|
properties: {
|
|
nestedInner: {
|
|
type: 'object',
|
|
target: 'in nestedInner',
|
|
properties: {
|
|
deeplyNestedProperty: {
|
|
target: 'in deeplyNestedProperty',
|
|
type: "boolean"
|
|
}
|
|
}
|
|
},
|
|
},
|
|
required: ['nestedInner']
|
|
},
|
|
aggregate: {
|
|
allOf: [
|
|
{ pattern: 'z$' },
|
|
{ pattern: '^a' },
|
|
{ pattern: '-' },
|
|
{ pattern: '^...$' }
|
|
]
|
|
},
|
|
negate: {
|
|
target: "in negate",
|
|
not: {
|
|
type: "boolean"
|
|
}
|
|
},
|
|
selection: {
|
|
target: 'in selection',
|
|
anyOf: [
|
|
{ 'pattern': '^[a-z]{3}$' },
|
|
{ 'pattern': '^[0-9]$' }
|
|
],
|
|
},
|
|
exclusiveSelection: {
|
|
target: 'There can be only one',
|
|
oneOf: [
|
|
{ pattern: 'a' },
|
|
{ pattern: 'e' },
|
|
{ pattern: 'i' },
|
|
{ pattern: 'o' },
|
|
{ pattern: 'u' }
|
|
]
|
|
}
|
|
},
|
|
patternProperties: {
|
|
".*String": { type: 'string' },
|
|
'^[01]+$': { type: 'number' }
|
|
},
|
|
additionalProperties: false
|
|
}
|
|
var validate = validator(schema, { verbose: true, greedy: true } );
|
|
|
|
function notOkAt(data, path, message) {
|
|
if(validate(data)) {
|
|
return t.fail('should have failed: ' + message)
|
|
}
|
|
t.deepEqual(validate.errors[0].schemaPath, path, message)
|
|
}
|
|
|
|
function notOkWithTarget(data, target, message) {
|
|
if(validate(data)) {
|
|
return t.fail('should have failed: ' + message)
|
|
}
|
|
t.deepEqual(lookup(schema, validate.errors[0]).target, target, message)
|
|
}
|
|
|
|
// Top level errors
|
|
notOkAt(null, [], 'should target parent of failed type error')
|
|
notOkAt(undefined, [], 'should target parent of failed type error')
|
|
notOkWithTarget({invalidAdditionalProp: '*whistles innocently*'}, 'top level', 'additionalProperties should be associated with containing schema')
|
|
|
|
// Errors in properties
|
|
notOkAt({hello: 42}, ['properties', 'hello'], 'should target property with type error')
|
|
notOkAt({someItems: [42]}, ['properties','someItems','0'], 'should target specific someItems rule(0)')
|
|
notOkAt({someItems: ['astring', 42]}, ['properties','someItems','1'], 'should target specific someItems rule(1)')
|
|
notOkAt({someItems: ['astring', 42, 'not a boolean']}, ['properties','someItems', 'additionalItems'], 'should target additionalItems')
|
|
notOkWithTarget({someItems: ['astring', 42, true, false, 42]}, 'inside additionalItems', 'should sitll target additionalProperties after valid additional items')
|
|
|
|
notOkWithTarget({nestedOuter: {}}, 'in nestedOuter', 'should target container of missing required property')
|
|
notOkWithTarget({nestedOuter: {nestedInner: 'not an object'}}, 'in nestedInner', 'should target property with type error (inner)')
|
|
notOkWithTarget({nestedOuter: {nestedInner: {deeplyNestedProperty: 'not a boolean'}}}, 'in deeplyNestedProperty', 'should target property with type error (deep)')
|
|
|
|
notOkAt({aggregate: 'a-a'}, ['properties', 'aggregate', 'allOf', 0], 'should target specific rule in allOf (0)')
|
|
notOkAt({aggregate: 'z-z'}, ['properties', 'aggregate', 'allOf', 1], 'should target specific rule in allOf (1)')
|
|
notOkAt({aggregate: 'a:z'}, ['properties', 'aggregate', 'allOf', 2], 'should target specific rule in allOf (2)')
|
|
notOkAt({aggregate: 'a--z'}, ['properties', 'aggregate', 'allOf', 3], 'should target specific rule in allOf (3)')
|
|
|
|
notOkAt({'notAString': 42}, ['patternProperties', '.*String'], 'should target the specific pattern in patternProperties (wildcards)')
|
|
notOkAt({
|
|
'I am a String': 'I really am',
|
|
'001100111011000111100': "Don't stand around jabbering when you're in mortal danger"
|
|
}, ['patternProperties', '^[01]+$'], 'should target the specific pattern in patternProperties ("binary" keys)')
|
|
|
|
notOkWithTarget({negate: false}, 'in negate', 'should target container of not')
|
|
|
|
notOkWithTarget(({selection: 'grit'}), 'in selection', 'should target container for anyOf (no matches)');
|
|
notOkWithTarget(({exclusiveSelection: 'fly'}), 'There can be only one', 'should target container for oneOf (no match)');
|
|
notOkWithTarget(({exclusiveSelection: 'ice'}), 'There can be only one', 'should target container for oneOf (multiple matches)');
|
|
|
|
t.end()
|
|
})
|
|
|
|
tape('schemaPath - nested selectors', function(t) {
|
|
var schema = {
|
|
anyOf: [
|
|
{ oneOf:[
|
|
{ allOf: [
|
|
{
|
|
properties: {
|
|
nestedSelectors: {type: "integer"}
|
|
}
|
|
}
|
|
]}
|
|
]}
|
|
]
|
|
}
|
|
var validate = validator(schema, { verbose: true, greedy: true } );
|
|
t.notOk(validate({nestedSelectors: "nope"}), 'should not crash on visit inside *Of');
|
|
|
|
t.end()
|
|
})
|
|
|