Fix handling of schema scope (based on 'id' attribute) and enable refRemote tests

This commit is contained in:
Tristan Penman 2016-02-14 11:26:25 -08:00
parent a5649408a0
commit c81403df80
3 changed files with 38 additions and 19 deletions

View File

@ -41,11 +41,10 @@ namespace json_reference {
*
* @param jsonRef JSON Reference to extract from
*
* @return string containing JSON Pointer
*
* @throw std::runtime_error if the string does not contain a JSON Pointer
* @return Optional string containing JSON Pointer
*/
inline std::string getJsonReferencePointer(const std::string &jsonRef)
inline boost::optional<std::string> getJsonReferencePointer(
const std::string &jsonRef)
{
// Attempt to extract JSON Pointer if '#' character is present. Note
// that a valid pointer would contain at least a leading forward
@ -55,10 +54,10 @@ namespace json_reference {
return jsonRef.substr(ptrPos + 1);
}
throw std::runtime_error(
"JSON Reference value does not contain a valid JSON Pointer");
return boost::none;
}
} // namespace json_reference
} // namespace internal
} // namespace valijson

View File

@ -551,16 +551,26 @@ private:
const typename AdapterType::Object object = node.asObject();
typename AdapterType::Object::const_iterator itr(object.end());
if ((itr = object.find("id")) != object.end()) {
if (itr->second.maybeString()) {
rootSchema.setSubschemaId(&subschema, itr->second.asString());
// Check for 'id' attribute and update current scope
boost::optional<std::string> updatedScope;
if ((itr = object.find("id")) != object.end() &&
itr->second.maybeString()) {
const std::string id = itr->second.asString();
rootSchema.setSubschemaId(&subschema, itr->second.asString());
if (!currentScope || internal::uri::isUriAbsolute(id)) {
updatedScope = id;
} else {
updatedScope = internal::uri::resolveRelativeUri(
*currentScope, id);
}
} else {
updatedScope = currentScope;
}
if ((itr = object.find("allOf")) != object.end()) {
rootSchema.addConstraintToSubschema(
makeAllOfConstraint(rootSchema, rootNode, itr->second,
currentScope, nodePath + "/allOf", fetchDoc,
updatedScope, nodePath + "/allOf", fetchDoc,
docCache, schemaCache),
&subschema);
}
@ -568,7 +578,7 @@ private:
if ((itr = object.find("anyOf")) != object.end()) {
rootSchema.addConstraintToSubschema(
makeAnyOfConstraint(rootSchema, rootNode, itr->second,
currentScope, nodePath + "/anyOf", fetchDoc,
updatedScope, nodePath + "/anyOf", fetchDoc,
docCache, schemaCache),
&subschema);
}
@ -576,7 +586,7 @@ private:
if ((itr = object.find("dependencies")) != object.end()) {
rootSchema.addConstraintToSubschema(
makeDependenciesConstraint(rootSchema, rootNode,
itr->second, currentScope,
itr->second, updatedScope,
nodePath + "/dependencies", fetchDoc, docCache,
schemaCache),
&subschema);
@ -625,7 +635,7 @@ private:
if (!itemsItr->second.isArray()) {
rootSchema.addConstraintToSubschema(
makeSingularItemsConstraint(rootSchema, rootNode,
itemsItr->second, currentScope,
itemsItr->second, updatedScope,
nodePath + "/items", fetchDoc, docCache,
schemaCache),
&subschema);
@ -639,7 +649,7 @@ private:
&itemsItr->second : NULL,
additionalItemsItr != object.end() ?
&additionalItemsItr->second : NULL,
currentScope, nodePath + "/items",
updatedScope, nodePath + "/items",
nodePath + "/additionalItems", fetchDoc,
docCache, schemaCache),
&subschema);
@ -734,7 +744,7 @@ private:
if ((itr = object.find("not")) != object.end()) {
rootSchema.addConstraintToSubschema(
makeNotConstraint(rootSchema, rootNode, itr->second,
currentScope, nodePath + "/not", fetchDoc, docCache,
updatedScope, nodePath + "/not", fetchDoc, docCache,
schemaCache),
&subschema);
}
@ -742,7 +752,7 @@ private:
if ((itr = object.find("oneOf")) != object.end()) {
rootSchema.addConstraintToSubschema(
makeOneOfConstraint(rootSchema, rootNode, itr->second,
currentScope, nodePath + "/oneOf", fetchDoc,
updatedScope, nodePath + "/oneOf", fetchDoc,
docCache, schemaCache),
&subschema);
}
@ -770,7 +780,7 @@ private:
&patternPropertiesItr->second : NULL,
additionalPropertiesItr != object.end() ?
&additionalPropertiesItr->second : NULL,
currentScope, nodePath + "/properties",
updatedScope, nodePath + "/properties",
nodePath + "/patternProperties",
nodePath + "/additionalProperties",
fetchDoc, &subschema, docCache, schemaCache),
@ -810,7 +820,7 @@ private:
if ((itr = object.find("type")) != object.end()) {
rootSchema.addConstraintToSubschema(
makeTypeConstraint(rootSchema, rootNode, itr->second,
currentScope, nodePath + "/type", fetchDoc,
updatedScope, nodePath + "/type", fetchDoc,
docCache, schemaCache),
&subschema);
}

View File

@ -263,7 +263,12 @@ TEST_F(TestValidator, Draft3_Properties)
TEST_F(TestValidator, Draft3_Ref)
{
processDraft3TestFile(TEST_SUITE_DIR "draft3/ref.json");
processDraft3TestFile(TEST_SUITE_DIR "draft3/ref.json");
}
TEST_F(TestValidator, Draft3_RefRemote)
{
processDraft3TestFile(TEST_SUITE_DIR "draft3/refRemote.json");
}
TEST_F(TestValidator, Draft3_Required)
@ -391,6 +396,11 @@ TEST_F(TestValidator, Draft4_Ref)
processDraft4TestFile(TEST_SUITE_DIR "draft4/ref.json");
}
TEST_F(TestValidator, Draft4_RefRemote)
{
processDraft4TestFile(TEST_SUITE_DIR "draft4/refRemote.json");
}
TEST_F(TestValidator, Draft4_Required)
{
processDraft4TestFile(TEST_SUITE_DIR "draft4/required.json");