Skip to content

Commit bbca7b2

Browse files
committed
during recursion, shallow clone the config
instead of manually creating a new sub-config each time
1 parent 9a9c722 commit bbca7b2

File tree

8 files changed

+60
-77
lines changed

8 files changed

+60
-77
lines changed

lib/jayschema.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,14 @@ JaySchema.prototype._validateImpl = function(instance, schema, resolutionScope,
169169

170170
// run the tests
171171
var config = {
172+
clone: function() {
173+
var result = {};
174+
var keys = Object.keys(this);
175+
for (var index = 0, len = keys.length; index !== len; ++index) {
176+
result[keys[index]] = this[keys[index]];
177+
}
178+
return result;
179+
},
172180
inst: instance,
173181
schema: schema,
174182
resolutionScope: resolutionScope,

lib/suites/draft-04/keywords/_propertiesImpl.js

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -35,27 +35,25 @@ module.exports = function(config) {
3535
var applyAdditionalProperties = true;
3636

3737
if (Object.prototype.hasOwnProperty.call(p, m)) {
38-
subTestConfig = {
39-
inst: config.inst[m],
40-
schema: p[m],
41-
resolutionScope: config.resolutionScope + '/properties/' + m,
42-
instanceContext: context,
43-
schemaRegistry: config.schemaRegistry
44-
};
38+
subTestConfig = config.clone();
39+
subTestConfig.inst = config.inst[m];
40+
subTestConfig.schema = p[m];
41+
subTestConfig.resolutionScope =
42+
config.resolutionScope + '/properties/' + m;
43+
subTestConfig.instanceContext = context;
4544
errors = errors.concat(testRunner(subTestConfig));
4645
applyAdditionalProperties = false;
4746
}
4847

4948
for (var y = 0; y < pp.length; ++y) {
5049
var rx = pp[y][0];
5150
if (m.match(rx)) {
52-
subTestConfig = {
53-
inst: config.inst[m],
54-
schema: pp[y][1],
55-
resolutionScope: config.resolutionScope + '/patternProperties/' + m,
56-
instanceContext: context,
57-
schemaRegistry: config.schemaRegistry
58-
};
51+
subTestConfig = config.clone();
52+
subTestConfig.inst = config.inst[m];
53+
subTestConfig.schema = pp[y][1];
54+
subTestConfig.resolutionScope =
55+
config.resolutionScope + '/patternProperties/' + m;
56+
subTestConfig.instanceContext = context;
5957
errors = errors.concat(testRunner(subTestConfig));
6058
applyAdditionalProperties = false;
6159
}
@@ -68,13 +66,12 @@ module.exports = function(config) {
6866
errors.push(new Errors.ObjectValidationError(config.resolutionScope,
6967
config.instanceContext, 'additionalProperties', undefined, m, desc));
7068
} else if (additionalProperties !== true) {
71-
subTestConfig = {
72-
inst: config.inst[m],
73-
schema: additionalProperties,
74-
resolutionScope: config.resolutionScope + '/additionalProperties',
75-
instanceContext: context,
76-
schemaRegistry: config.schemaRegistry
77-
};
69+
subTestConfig = config.clone();
70+
subTestConfig.inst = config.inst[m];
71+
subTestConfig.schema = additionalProperties;
72+
subTestConfig.resolutionScope =
73+
config.resolutionScope + '/additionalProperties';
74+
subTestConfig.instanceContext = context;
7875
errors = errors.concat(testRunner(subTestConfig));
7976
}
8077
}

lib/suites/draft-04/keywords/allOf.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,9 @@ module.exports = function(config) {
1010
for (var index = 0; index < config.schema.allOf.length; ++index) {
1111
var schema = config.schema.allOf[index];
1212

13-
var subTestConfig = {
14-
inst: config.inst,
15-
schema: schema,
16-
resolutionScope: config.resolutionScope + '/allOf/' + index,
17-
instanceContext: config.instanceContext,
18-
schemaRegistry: config.schemaRegistry
19-
};
13+
var subTestConfig = config.clone();
14+
subTestConfig.schema = schema;
15+
subTestConfig.resolutionScope = config.resolutionScope + '/allOf/' + index;
2016

2117
errors = errors.concat(testRunner(subTestConfig));
2218
}

lib/suites/draft-04/keywords/anyOf.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,9 @@ module.exports = function(config) {
1313

1414
for (var index = 0, len = config.schema.anyOf.length; index !== len; ++index)
1515
{
16-
var subTestConfig = {
17-
inst: config.inst,
18-
schema: config.schema.anyOf[index],
19-
resolutionScope: config.resolutionScope + '/anyOf/' + index,
20-
instanceContext: config.instanceContext,
21-
schemaRegistry: config.schemaRegistry
22-
};
16+
var subTestConfig = config.clone();
17+
subTestConfig.schema = config.schema.anyOf[index];
18+
subTestConfig.resolutionScope = config.resolutionScope + '/anyOf/' + index;
2319

2420
var nestedErrors = testRunner(subTestConfig);
2521

lib/suites/draft-04/keywords/dependencies.js

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,11 @@ module.exports = function(config) {
4242
} else {
4343
// schema dependency: validates the *instance*, not the value
4444
// associated with the property name.
45-
var subTestConfig = {
46-
inst: config.inst,
47-
schema: dep,
48-
resolutionScope: config.resolutionScope + '/dependencies/' + index,
49-
instanceContext: config.instanceContext + '/' + key,
50-
schemaRegistry: config.schemaRegistry
51-
};
45+
var subTestConfig = config.clone();
46+
subTestConfig.schema = dep;
47+
subTestConfig.resolutionScope =
48+
config.resolutionScope + '/dependencies/' + index;
49+
subTestConfig.instanceContext = config.instanceContext + '/' + key;
5250
errors = errors.concat(testRunner(subTestConfig));
5351
}
5452
}

lib/suites/draft-04/keywords/items.js

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@ module.exports = function(config) {
1616
var item = config.inst[index];
1717
var itemSchema = config.schema.items[index];
1818

19-
subTestConfig = {
20-
inst: item,
21-
schema: itemSchema,
22-
resolutionScope: config.resolutionScope + '/items/' + index,
23-
instanceContext: config.instanceContext + '/' + index,
24-
schemaRegistry: config.schemaRegistry
25-
};
19+
subTestConfig = config.clone();
20+
subTestConfig.inst = item;
21+
subTestConfig.schema = itemSchema;
22+
subTestConfig.resolutionScope =
23+
config.resolutionScope + '/items/' + index;
24+
subTestConfig.instanceContext = config.instanceContext + '/' + index;
2625

2726
errors = errors.concat(testRunner(subTestConfig));
2827
}
@@ -39,13 +38,12 @@ module.exports = function(config) {
3938
index < config.inst.length;
4039
++index)
4140
{
42-
subTestConfig = {
43-
inst: config.inst[index],
44-
schema: config.schema.additionalItems,
45-
resolutionScope: config.resolutionScope + '/items/' + index,
46-
instanceContext: config.instanceContext + '/' + index,
47-
schemaRegistry: config.schemaRegistry
48-
};
41+
subTestConfig = config.clone();
42+
subTestConfig.inst = config.inst[index];
43+
subTestConfig.schema = config.schema.additionalItems;
44+
subTestConfig.resolutionScope =
45+
config.resolutionScope + '/items/' + index;
46+
subTestConfig.instanceContext = config.instanceContext + '/' + index;
4947

5048
errors = errors.concat(testRunner(subTestConfig));
5149
}
@@ -55,13 +53,11 @@ module.exports = function(config) {
5553
} else {
5654
// one schema for all items in the array
5755
for (index = 0; index < config.inst.length; ++index) {
58-
subTestConfig = {
59-
inst: config.inst[index],
60-
schema: config.schema.items,
61-
resolutionScope: config.resolutionScope + '/items',
62-
instanceContext: config.instanceContext + '/' + index,
63-
schemaRegistry: config.schemaRegistry
64-
};
56+
subTestConfig = config.clone();
57+
subTestConfig.inst = config.inst[index];
58+
subTestConfig.schema = config.schema.items;
59+
subTestConfig.resolutionScope = config.resolutionScope + '/items';
60+
subTestConfig.instanceContext = config.instanceContext + '/' + index;
6561

6662
errors = errors.concat(testRunner(subTestConfig));
6763
}

lib/suites/draft-04/keywords/not.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,9 @@ var Errors = require('../../../errors.js')
99
module.exports = function(config) {
1010
var errors = [];
1111

12-
var subTestConfig = {
13-
inst: config.inst,
14-
schema: config.schema.not,
15-
resolutionScope: config.resolutionScope + '/not',
16-
instanceContext: config.instanceContext,
17-
schemaRegistry: config.schemaRegistry
18-
};
12+
var subTestConfig = config.clone();
13+
subTestConfig.schema = config.schema.not;
14+
subTestConfig.resolutionScope = config.resolutionScope + '/not';
1915

2016
if (testRunner(subTestConfig).length === 0) {
2117
var desc = 'validates against this schema; must NOT validate against ' +

lib/suites/draft-04/keywords/oneOf.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,9 @@ module.exports = function(config) {
1212
var subSchemaErrors = {};
1313

1414
for (var index = 0; index < config.schema.oneOf.length; ++index) {
15-
var subTestConfig = {
16-
inst: config.inst,
17-
schema: config.schema.oneOf[index],
18-
resolutionScope: config.resolutionScope + '/oneOf/' + index,
19-
instanceContext: config.instanceContext,
20-
schemaRegistry: config.schemaRegistry
21-
};
15+
var subTestConfig = config.clone();
16+
subTestConfig.schema = config.schema.oneOf[index];
17+
subTestConfig.resolutionScope = config.resolutionScope + '/oneOf/' + index;
2218

2319
var nestedErrors = testRunner(subTestConfig);
2420
if (nestedErrors.length === 0) {

0 commit comments

Comments
 (0)