public void When_format_date_time_correct_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.String;
            schema.Format = JsonFormatStrings.DateTime;

            var token = new JValue("2014-12-01 11:00:01");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
        public static Tuple <ValidationResult, Dictionary <int, string> > Validate(JsonSchema4 schema, string jsonToValidate)
        {
            // Find errors.
            ValidationResult         result = ValidationResult.Valid;
            Dictionary <int, string> errors = new Dictionary <int, string>();

            try
            {
                if (schema == null)
                {
                    // No schema. Just make sure the JSON is valid.
                    JToken.Parse(jsonToValidate);
                }
                else
                {
                    // Validate based on the schema.
                    var rawErrors = schema.Validate(jsonToValidate);
                    if (rawErrors.Count > 0)
                    {
                        result = ValidationResult.DoesNotSatisfySchema;
                        foreach (var rawError in schema.Validate(jsonToValidate))
                        {
                            foreach (var error in GenerateErrorMessages(rawError))
                            {
                                if (error.LineNumber <= 0)
                                {
                                    continue;
                                }

                                var zeroBasedLine = error.LineNumber - 1;
                                if (errors.ContainsKey(zeroBasedLine))
                                {
                                    errors[zeroBasedLine] = error.Message + '\n' + errors[zeroBasedLine];
                                }
                                else
                                {
                                    errors[zeroBasedLine] = error.Message;
                                }
                            }
                        }
                    }
                }
            }
            catch (JsonReaderException exception)
            {
                result = ValidationResult.InvalidJson;
                errors[exception.LineNumber - 1] = exception.Message;
            }

            return(new Tuple <ValidationResult, Dictionary <int, string> >(result, errors));
        }
Esempio n. 3
0
        private bool TryParseMarketPlaceError(string jsonResponse, out MarketPlaceError error)
        {
            // Check expected error keywords presence :
            if (!jsonResponse.Contains("error") ||
                !jsonResponse.Contains("message") ||
                !jsonResponse.Contains("code"))
            {
                error = null;
                return(false);
            }

            ICollection <ValidationError> errors = _schema.Validate(jsonResponse);

            if (errors.Count > 0)
            {
                error = null;
                return(false);
            }

            // Try to deserialize :
            try
            {
                error = JsonConvert.DeserializeObject <MarketPlaceError>(jsonResponse);
                return(true);
            }
            catch
            {
                error = null;
                return(false);
            }
        }
Esempio n. 4
0
        public void When_is_not_any_of_then_it_should_fail()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.AnyOf.Add(new JsonSchema4
            {
                Type = JsonObjectType.String
            });
            schema.AnyOf.Add(new JsonSchema4
            {
                Type = JsonObjectType.Integer
            });

            var token = new JValue(1.5);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            var error = (ChildSchemaValidationError)errors.First();

            Assert.AreEqual(ValidationErrorKind.NotAnyOf, error.Kind);
            Assert.AreSame(schema, error.Schema);
            Assert.AreEqual(ValidationErrorKind.StringExpected, error.Errors.First().Value.First().Kind);
            Assert.AreSame(schema.AnyOf.First(), error.Errors.First().Value.First().Schema);
        }
Esempio n. 5
0
        public void When_one_of_matches_multiple_then_it_should_fail()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.OneOf.Add(new JsonSchema4
            {
                Type = JsonObjectType.String
            });
            schema.OneOf.Add(new JsonSchema4
            {
                Type = JsonObjectType.Integer
            });
            schema.OneOf.Add(new JsonSchema4
            {
                Type = JsonObjectType.Integer
            });

            var token = new JValue(5);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.NotOneOf, errors.First().Kind);
            Assert.AreSame(schema, errors.First().Schema);
        }
        public void When_second_item_validation_fails_then_path_should_be_correct()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type      = JsonObjectType.Array;
            schema.Item      = new JsonSchema4();
            schema.Item.Type = JsonObjectType.String;

            var token = new JArray();

            token.Add(new JValue("Foo"));
            token.Add(new JValue(10));

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(1, errors.Count());
            Assert.AreEqual(ValidationErrorKind.ArrayItemNotValid, errors.First().Kind);

            var firstItemError = ((ChildSchemaValidationError)errors.First()).Errors.First().Value.First();

            Assert.AreEqual(ValidationErrorKind.StringExpected, firstItemError.Kind);
            Assert.AreEqual("[1]", errors.First().Property);
            Assert.AreEqual("#/[1]", errors.First().Path);
            Assert.AreSame(schema.Item, errors.First().Schema);
        }
Esempio n. 7
0
        public void When_there_are_no_properties_matching_pattern_then_validation_fails()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type = JsonObjectType.Object;
            schema.AllowAdditionalProperties = false;
            schema.PatternProperties.Add("^[a-z]+$", new JsonProperty()
            {
                Type = JsonObjectType.Object
            });

            var token = new JObject();

            token.Add("123", new JObject());
            token.Add("qwe123", new JObject());

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.Equal(2, errors.Count());
            foreach (var validationError in errors)
            {
                Assert.Equal(ValidationErrorKind.NoAdditionalPropertiesAllowed, validationError.Kind);
            }
        }
        public void When_tuple_too_large_then_it_should_fail()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type = JsonObjectType.Array;
            schema.Items.Add(new JsonSchema4 {
                Type = JsonObjectType.String
            });
            schema.Items.Add(new JsonSchema4 {
                Type = JsonObjectType.Integer
            });
            schema.AllowAdditionalItems = false;

            var token = new JArray();

            token.Add(new JValue("Foo"));
            token.Add(new JValue(5));
            token.Add(new JValue(5));

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(1, errors.Count());
            Assert.AreEqual(ValidationErrorKind.TooManyItemsInTuple, errors.First().Kind);
            Assert.AreSame(schema, errors.First().Schema);
        }
        private bool TryParseErrorResponse(string jsonResponse, out ErrorResponse error)
        {
            if (!jsonResponse.Contains("code") ||
                !jsonResponse.Contains("message"))
            {
                error = null;
                return(false);
            }

            ICollection <ValidationError> errors = _schema.Validate(jsonResponse);

            if (errors.Count > 0)
            {
                error = null;
                return(false);
            }

            try
            {
                error = JsonConvert.DeserializeObject <ErrorResponse>(jsonResponse);
                return(true);
            }
            catch
            {
                error = null;
                return(false);
            }
        }
Esempio n. 10
0
        /// <summary>
        /// Validates the json of current <see cref="HttpContext"/>.
        /// </summary>
        /// <param name="context">Current context.</param>
        /// <returns>The <see cref="Task{ValidationResult}"/> that represents the asynchronous validation process.</returns>
        public override async Task <ValidationResult> ValidateAsync(HttpContext context)
        {
            var errors = _jsonSchema.Validate(await StreamToString(context.Request.Body));

            if (errors.Any())
            {
                return(ValidationResult.Failed());
            }

            return(ValidationResult.Success);
        }
Esempio n. 11
0
        private static float ScoreSchemaMatch(JsonSchema4 schema, JToken contextObject, string activeProperty)
        {
            if (contextObject is JObject && (schema.Type == JsonObjectType.Object || schema.Type == JsonObjectType.None))
            {
                var errors = schema.Validate(contextObject);
                var score  = 100.0f - ScoreErrors(errors.ToList());
                if (activeProperty != null && schema.ActualProperties.ContainsKey(activeProperty))
                {
                    score += 5;
                }

                return(score);
            }
            else if (schema.Type == JsonObjectType.Array && (contextObject is JArray))
            {
                return(100.0f - ScoreErrors(schema.Validate(contextObject)));
            }
            else
            {
                return(0.0f);  // Non-objects can't match.
            }
        }
        public void When_boolean_required_and_boolean_provided_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.Boolean;

            var token = new JValue(true);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
        public void When_boolean_required_but_string_provided_then_validation_fails()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.Boolean;

            var token = new JValue("foo");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.BooleanExpected, errors.First().Kind);
        }
        public void When_format_hostname_is_ip_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.String;
            schema.Format = JsonFormatStrings.Hostname;

            var token = new JValue("rsuter.com");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
        public void When_format_hostname_incorrect_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.String;
            schema.Format = JsonFormatStrings.Hostname;

            var token = new JValue("foo:bar");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.HostnameExpected, errors.First().Kind);
        }
        public void When_boolean_required_but_string_provided_then_validation_fails()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type = JsonObjectType.Boolean;

            var token = new JValue("foo");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.BooleanExpected, errors.First().Kind);
        }
Esempio n. 17
0
        public void When_boolean_required_and_boolean_provided_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type = JsonObjectType.Boolean;

            var token = new JValue(true);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
Esempio n. 18
0
        public void When_token_is_not_array_then_validation_should_fail()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type = JsonObjectType.Array;

            var token = new JValue(10);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.ArrayExpected, errors.First().Kind);
        }
Esempio n. 19
0
        public void When_format_ipv6_correct_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.String;
            schema.Format = JsonFormatStrings.IpV6;

            var token = new JValue("::1");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
Esempio n. 20
0
        public void When_string_required_and_string_provided_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type = JsonObjectType.String;

            var token = new JValue("test");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.Empty(errors);
        }
Esempio n. 21
0
        public void When_integer_required_and_integer_provided_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type = JsonObjectType.Integer;

            var token = new JValue(10);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.Empty(errors);
        }
Esempio n. 22
0
        public void When_format_ipv6_incorrect_then_validation_fails()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.String;
            schema.Format = JsonFormatStrings.IpV6;

            var token = new JValue("test");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.IpV6Expected, errors.First().Kind);
        }
Esempio n. 23
0
        public void When_number_required_and_integer_provided_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type = JsonObjectType.Number;

            var token = new JValue(10);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
        public void When_integer_minimum_does_not_match_then_it_should_fail()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.Integer;
            schema.Minimum = 2;

            var token = new JValue(1);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.NumberTooSmall, errors.First().Kind);
        }
Esempio n. 25
0
        public void When_format_date_time_then_validation_fails()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type   = JsonObjectType.String;
            schema.Format = JsonFormatStrings.Date;

            var token = new JValue("2014-12-01 11:54");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.Equal(ValidationErrorKind.DateExpected, errors.First().Kind);
        }
Esempio n. 26
0
        public void When_format_uri_incorrect_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type   = JsonObjectType.String;
            schema.Format = JsonFormatStrings.Uri;

            var token = new JValue("test");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.Equal(ValidationErrorKind.UriExpected, errors.First().Kind);
        }
Esempio n. 27
0
        public void When_format_uri_correct_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type   = JsonObjectType.String;
            schema.Format = JsonFormatStrings.Uri;

            var token = new JValue("http://rsuter.com");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.Empty(errors);
        }
Esempio n. 28
0
        public void When_format_guid_correct_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.String;
            schema.Format = JsonFormatStrings.Guid;

            var guid = Guid.NewGuid().ToString();
            var token = new JValue(guid);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
        public void When_format_hostname_is_ip_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type   = JsonObjectType.String;
            schema.Format = JsonFormatStrings.Hostname;

            var token = new JValue("rsuter.com");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.Empty(errors);
        }
Esempio n. 30
0
        public void When_format_date_time_correct_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type   = JsonObjectType.String;
            schema.Format = JsonFormatStrings.DateTime;

            var token = new JValue("2014-12-01 11:00:01");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.Empty(errors);
        }
        public void When_number_maximum_does_not_match_then_it_should_fail()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type    = JsonObjectType.Number;
            schema.Maximum = 1.5;

            var token = new JValue(1.6);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.NumberTooBig, errors.First().Kind);
        }
Esempio n. 32
0
        public void When_format_date_time_with_iso8601_with_timezone_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type   = JsonObjectType.String;
            schema.Format = JsonFormatStrings.DateTime;

            var token = new JValue("2015-01-25T15:43:30+10:00");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.Empty(errors);
        }
Esempio n. 33
0
        public void When_format_date_time_with_non_iso8601_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type   = JsonObjectType.String;
            schema.Format = JsonFormatStrings.DateTime;

            var token = new JValue("25/01/2015");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.Equal(ValidationErrorKind.DateTimeExpected, errors.First().Kind);
        }
        public void When_format_email_correct_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type   = JsonObjectType.String;
            schema.Format = JsonFormatStrings.Email;

            var token = new JValue("*****@*****.**");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
Esempio n. 35
0
        public void When_format_ipv4_correct_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type   = JsonObjectType.String;
            schema.Format = JsonFormatStrings.IpV4;

            var token = new JValue("192.168.0.1");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
Esempio n. 36
0
        public void When_format_time_span_correct_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type   = JsonObjectType.String;
            schema.Format = JsonFormatStrings.TimeSpan;

            var token = new JValue("1:30:45");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
Esempio n. 37
0
        public void When_integer_required_but_string_provided_then_validation_fails()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type = JsonObjectType.Integer;

            var token = new JValue("foo");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.Equal(ValidationErrorKind.IntegerExpected, errors.First().Kind);
            Assert.Same(schema, errors.First().Schema);
        }
Esempio n. 38
0
        public void When_format_time_span_incorrect_then_validation_fails()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type   = JsonObjectType.String;
            schema.Format = JsonFormatStrings.TimeSpan;

            var token = new JValue("test");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.TimeSpanExpected, errors.First().Kind);
        }
        public void When_format_hostname_incorrect_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();

            schema.Type   = JsonObjectType.String;
            schema.Format = JsonFormatStrings.Hostname;

            var token = new JValue("foo:bar");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.HostnameExpected, errors.First().Kind);
        }
Esempio n. 40
0
        public void Numeric_type_should_not_trigger_validation_if_has_byte_format()
        {
            //// Arrange
            var numericSchema = new JsonSchema4
                                {
                                    Type = JsonObjectType.Integer,
                                    Format = JsonFormatStrings.Byte
                                };

            var token = new JValue(1);

            //// Act
            var numericErrors = numericSchema.Validate(token);

            //// Assert
            Assert.AreEqual(0, numericErrors.Count);
        }
        public void When_optional_property_is_missing_then_it_should_succeed()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.Object;
            schema.Properties["Foo"] = new JsonProperty
            {
                IsRequired = false,
            };

            var token = new JObject();

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
Esempio n. 42
0
        public void Validation_should_fail_if_string_is_not_byte_formatted()
        {
            //// Arrange
            var schema = new JsonSchema4
                         {
                             Type = JsonObjectType.String,
                             Format = JsonFormatStrings.Byte
                         };

            var token = new JValue("invalid");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(1, errors.Count);
            Assert.AreEqual(ValidationErrorKind.Base64Expected, errors.Single().Kind);
        }
        public void When_array_item_are_valid_then_it_should_succeed()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.Array;
            schema.Item = new JsonSchema4();
            schema.Item.Type = JsonObjectType.String;

            var token = new JArray();
            token.Add(new JValue("Foo"));
            token.Add(new JValue("Bar"));

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
        public void When_min_items_does_not_match_then_it_should_fail()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.Array;
            schema.MinItems = 2;
            schema.Item = new JsonSchema4();
            schema.Item.Type = JsonObjectType.String;

            var token = new JArray();
            token.Add(new JValue("Foo"));

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(1, errors.Count());
            Assert.AreEqual(ValidationErrorKind.TooFewItems, errors.First().Kind);
        }
        public void When_property_matches_one_of_the_types_then_it_should_succeed()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.Object;
            schema.Properties["Foo"] = new JsonProperty
            {
                Type = JsonObjectType.Number | JsonObjectType.Null
            };

            var token = new JObject();
            token["Foo"] = new JValue(5);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
        public void When_string_property_is_available_then_it_should_succeed()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.Object;
            schema.Properties["Foo"] = new JsonProperty
            {
                IsRequired = true,
                Type = JsonObjectType.String
            };

            var token = new JObject();
            token["Foo"] = new JValue("Bar");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
        public void When_required_property_is_missing_then_it_should_be_in_error_list()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.Object;
            schema.Properties["Foo"] = new JsonProperty
            {
                IsRequired = true,
            };

            var token = new JObject();

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(1, errors.Count());
            Assert.AreEqual("Foo", errors.First().Property);
            Assert.AreEqual("Foo", errors.First().Path);
            Assert.AreEqual(ValidationErrorKind.PropertyRequired, errors.First().Kind);
        }
Esempio n. 48
0
        public void When_is_not_all_of_then_it_should_fail()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.AllOf.Add(new JsonSchema4
            {
                Type = JsonObjectType.String
            });
            schema.AllOf.Add(new JsonSchema4
            {
                Type = JsonObjectType.Integer
            });

            var token = new JValue(5);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.NotAllOf, errors.First().Kind);
        }
Esempio n. 49
0
        public void When_is_any_of_then_it_should_succeed()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.AnyOf.Add(new JsonSchema4
            {
                Type = JsonObjectType.String
            });
            schema.AnyOf.Add(new JsonSchema4
            {
                Type = JsonObjectType.Integer
            });

            var token = new JValue(10);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count);
        }
        public void When_tuple_too_large_then_it_should_fail()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.Array;
            schema.Items.Add(new JsonSchema4 { Type = JsonObjectType.String });
            schema.Items.Add(new JsonSchema4 { Type = JsonObjectType.Integer });
            schema.AllowAdditionalItems = false;

            var token = new JArray();
            token.Add(new JValue("Foo"));
            token.Add(new JValue(5));
            token.Add(new JValue(5));

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(1, errors.Count());
            Assert.AreEqual(ValidationErrorKind.TooManyItemsInTuple, errors.First().Kind);
        }
        public void When_second_item_validation_fails_then_path_should_be_correct()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.Array;
            schema.Item = new JsonSchema4();
            schema.Item.Type = JsonObjectType.String;

            var token = new JArray();
            token.Add(new JValue("Foo"));
            token.Add(new JValue(10));

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(1, errors.Count());
            Assert.AreEqual(ValidationErrorKind.ArrayItemNotValid, errors.First().Kind);

            var firstItemError = ((ChildSchemaValidationError) errors.First()).Errors.First().Value.First();
            Assert.AreEqual(ValidationErrorKind.StringExpected, firstItemError.Kind);
            Assert.AreEqual("[1]", errors.First().Property);
            Assert.AreEqual("[1]", errors.First().Path);
        }
        public void When_token_is_not_object_then_validation_should_fail()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.Object;
            schema.Properties["Foo"] = new JsonProperty();

            var token = new JValue(10);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.ObjectExpected, errors.First().Kind);
        }
        public void When_string_property_required_but_integer_provided_then_it_should_fail()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.Object;
            schema.Properties["Foo"] = new JsonProperty
            {
                IsRequired = true,
                Type = JsonObjectType.String
            };

            var token = new JObject();
            token["Foo"] = new JValue(10);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.StringExpected, errors.First().Kind);
            Assert.AreEqual("Foo", errors.First().Property);
            Assert.AreEqual("Foo", errors.First().Path);
        }
        public void When_tuple_correct_then_it_should_pass()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.Array;
            schema.Items.Add(new JsonSchema4 { Type = JsonObjectType.String });
            schema.Items.Add(new JsonSchema4 { Type = JsonObjectType.Integer });

            var token = new JArray();
            token.Add(new JValue("Foo"));
            token.Add(new JValue(5));

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
        public void When_number_required_and_integer_provided_then_validation_succeeds()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.Number;

            var token = new JValue(10);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count());
        }
        public void When_string_min_length_does_not_match_then_it_should_fail()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.String;
            schema.MinLength = 2;

            var token = new JValue("a");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.StringTooShort, errors.First().Kind);
        }
        public void When_string_pattern_does_not_match_then_it_should_fail()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.String;
            schema.Pattern = "aa(.*)aa";

            var token = new JValue("aaccbb");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.PatternMismatch, errors.First().Kind);
        }
        public void When_value_in_enumeration_then_it_should_succeed()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.String;
            schema.Enumeration.Add("Red");
            schema.Enumeration.Add("Green");
            schema.Enumeration.Add("Blue");

            var token = new JValue("Red");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(0, errors.Count);
        }
        public void When_value_not_in_enumeration_then_it_should_fail()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.String;
            schema.Enumeration.Add("Red");
            schema.Enumeration.Add("Green");
            schema.Enumeration.Add("Blue");

            var token = new JValue("Yellow");

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(ValidationErrorKind.NotInEnumeration, errors.First().Kind);
        }
        public void When_value_is_wrong_type_in_enumeration_then_it_should_fail()
        {
            //// Arrange
            var schema = new JsonSchema4();
            schema.Type = JsonObjectType.String;
            schema.Enumeration.Add("1");
            schema.Enumeration.Add("2");
            schema.Enumeration.Add("3");

            var token = new JValue(3);

            //// Act
            var errors = schema.Validate(token);

            //// Assert
            Assert.AreEqual(1, errors.Count); // wrong type
        }