diff --git a/README.md b/README.md index 2875cb0..e44f60f 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ An implementation of JSON Schema, based on IETF's draft v4 - Go language Working, but not all keyword are yet implemented. -What is missing : definitions, dependencies, additionalProperties, full coverage of items, additionalItems +What is missing : definitions, dependencies, full coverage of items, additionalItems -Testing / debugging / improvements in progress ( 69% of Json Schema Test Suite ) +Testing / debugging / improvements in progress ( 71% of Json Schema Test Suite ) ## Usage diff --git a/schema_test.go b/schema_test.go index a4458d2..bbd7d58 100644 --- a/schema_test.go +++ b/schema_test.go @@ -236,10 +236,10 @@ func TestJsonSchemaTestSuite(t *testing.T) { map[string]string{"phase": "additionalProperties being false does not allow other properties", "test": "no additional properties is valid", "schema": "additionalProperties/schema_0.json", "data": "additionalProperties/data_00.json", "valid": "true"}, map[string]string{"phase": "additionalProperties being false does not allow other properties", "test": "an additional property is invalid", "schema": "additionalProperties/schema_0.json", "data": "additionalProperties/data_01.json", "valid": "false"}, map[string]string{"phase": "additionalProperties being false does not allow other properties", "test": "ignores non-objects", "schema": "additionalProperties/schema_0.json", "data": "additionalProperties/data_02.json", "valid": "true"}, - //map[string]string{"phase": "additionalProperties allows a schema which should validate", "test": "no additional properties is valid", "schema": "additionalProperties/schema_1.json", "data": "additionalProperties/data_10.json", "valid": "true"}, - //map[string]string{"phase": "additionalProperties allows a schema which should validate", "test": "an additional valid property is valid", "schema": "additionalProperties/schema_1.json", "data": "additionalProperties/data_11.json", "valid": "true"}, - //map[string]string{"phase": "additionalProperties allows a schema which should validate", "test": "an additional invalid property is invalid", "schema": "additionalProperties/schema_1.json", "data": "additionalProperties/data_12.json", "valid": "false"}, - //map[string]string{"phase": "additionalProperties are allowed by default", "test": "additional properties are allowed", "schema": "additionalProperties/schema_2.json", "data": "additionalProperties/data_20.json", "valid": "true"}, + map[string]string{"phase": "additionalProperties allows a schema which should validate", "test": "no additional properties is valid", "schema": "additionalProperties/schema_1.json", "data": "additionalProperties/data_10.json", "valid": "true"}, + map[string]string{"phase": "additionalProperties allows a schema which should validate", "test": "an additional valid property is valid", "schema": "additionalProperties/schema_1.json", "data": "additionalProperties/data_11.json", "valid": "true"}, + map[string]string{"phase": "additionalProperties allows a schema which should validate", "test": "an additional invalid property is invalid", "schema": "additionalProperties/schema_1.json", "data": "additionalProperties/data_12.json", "valid": "false"}, + map[string]string{"phase": "additionalProperties are allowed by default", "test": "additional properties are allowed", "schema": "additionalProperties/schema_2.json", "data": "additionalProperties/data_20.json", "valid": "true"}, map[string]string{"phase": "dependencies", "test": "neither", "schema": "dependencies/schema_0.json", "data": "dependencies/data_00.json", "valid": "true"}, map[string]string{"phase": "dependencies", "test": "nondependant", "schema": "dependencies/schema_0.json", "data": "dependencies/data_01.json", "valid": "true"}, map[string]string{"phase": "dependencies", "test": "with dependency", "schema": "dependencies/schema_0.json", "data": "dependencies/data_02.json", "valid": "true"}, diff --git a/validation.go b/validation.go index 60ff52e..2b5a22d 100644 --- a/validation.go +++ b/validation.go @@ -45,6 +45,9 @@ func (v *ValidationResult) GetErrorMessages() []string { func (v *ValidationResult) CopyErrorMessages(others []string) { v.errorMessages = append(v.errorMessages, others...) + if len(others) > 0 { + v.valid = false + } } func (v *ValidationResult) addErrorMessage(message string) { @@ -332,8 +335,23 @@ func (v *jsonSchema) validateObject(currentSchema *jsonSchema, value map[string] } } - case map[string]interface{}: - fmt.Printf("map %v %v\n", value, currentSchema) + case *jsonSchema: + additionalPropertiesSchema := currentSchema.additionalProperties.(*jsonSchema) + for pk := range value { + found := false + for _, spValue := range currentSchema.propertiesChildren { + if pk == spValue.property { + found = true + } + } + if !found { + validationResult := additionalPropertiesSchema.Validate(value[pk]) + if !validationResult.IsValid() { + result.CopyErrorMessages(validationResult.GetErrorMessages()) + } + } + } + } }