Example #1
0
        private static IJsonSchema _GetSchemaSlow(TypeInfo typeInfo)
        {
            var attribute = typeInfo.GetCustomAttribute <SchemaAttribute>();

            if (attribute == null)
            {
                return(null);
            }

            Exception   exception = null;
            IJsonSchema schema    = null;

            try
            {
                schema = _GetPropertySchema(typeInfo, attribute) ?? _GetFileSchema(attribute);
            }
            catch (FileNotFoundException e)
            {
                exception = e;
            }
            catch (UriFormatException e)
            {
                exception = e;
            }

            if (schema == null)
            {
                throw new JsonSerializationException($"The value '{attribute.Source}' could not be translated into a valid schema. " +
                                                     $"This value should represent either a public static property on the {typeInfo.Name} type " +
                                                     $"or a file with this name should exist at the execution path.", exception);
            }

            return(schema);
        }
Example #2
0
        public SchemaValidationResults Validate(IJsonSchema schema, JsonValue json, JsonValue root)
        {
            var typed = (JsonSchema04)schema;

            if (typed.ExclusiveMinimum ?? false)
            {
                if (json.Number <= typed.Minimum)
                {
                    var message = SchemaErrorMessages.ExclusiveMinimum.ResolveTokens(new Dictionary <string, object>
                    {
                        ["expected"] = typed.Minimum,
                        ["value"]    = json
                    });
                    return(new SchemaValidationResults(string.Empty, message));
                }
            }
            else
            {
                if (json.Number < typed.Minimum)
                {
                    var message = SchemaErrorMessages.Minimum.ResolveTokens(new Dictionary <string, object>
                    {
                        ["expected"] = typed.Minimum,
                        ["value"]    = json
                    });
                    return(new SchemaValidationResults(string.Empty, message));
                }
            }
            return(new SchemaValidationResults());
        }
            public SchemaValidationResults Validate(IJsonSchema schema, JsonValue json, JsonValue root)
            {
                var typed = (QuasiSchema7)schema;

                if (typed.If == null)
                {
                    return(new SchemaValidationResults());
                }

                var ifResults = _ValidateSubSchema(typed.If, json, root);

                if (ifResults.Valid)
                {
                    var thenResults = _ValidateSubSchema(typed.Then, json, root);
                    if (thenResults.Valid)
                    {
                        return(new SchemaValidationResults());
                    }

                    return(new SchemaValidationResults(schema, string.Empty, "Validation of `if` succeeded, but validation of `then` failed.",
                                                       validationKeyword: "then",
                                                       innerErrors: thenResults.Errors));
                }

                var elseResults = _ValidateSubSchema(typed.Else, json, root);

                if (elseResults.Valid)
                {
                    return(new SchemaValidationResults());
                }

                return(new SchemaValidationResults(schema, string.Empty, "Validation of `if` failed, but validation of `else` also failed.",
                                                   validationKeyword: "else",
                                                   innerErrors: elseResults.Errors));
            }
Example #4
0
        public SchemaValidationResults Validate(IJsonSchema schema, JsonValue json, JsonValue root)
        {
            var typed = (JsonSchema07)schema;

            if (typed.If == null)
            {
                return(new SchemaValidationResults());
            }

            var ifResults = _ValidateSubSchema(typed.If, json, root);

            if (ifResults.Valid)
            {
                var thenResults = _ValidateSubSchema(typed.Then, json, root);
                if (thenResults.Valid)
                {
                    return(new SchemaValidationResults());
                }

                return(new SchemaValidationResults("then", "Validation of `if` succeeded, but validation of `then` failed."));
            }

            var elseResults = _ValidateSubSchema(typed.Else, json, root);

            if (elseResults.Valid)
            {
                return(new SchemaValidationResults());
            }

            return(new SchemaValidationResults("else", "Validation of `if` failed, but validation of `else` also failed."));
        }
        public void Online(IJsonSchema schema)
        {
            try
            {
                // TODO: Catch web exceptions and assert inconclusive.
                var localSchemaJson = schema.ToJson(null);

                var onlineSchemaText = JsonSchemaOptions.Download(schema.Id);
                var onlineSchemaJson = JsonValue.Parse(onlineSchemaText);
                var onlineSchema     = JsonSchemaFactory.FromJson(onlineSchemaJson);

                var localValidation  = schema.Validate(onlineSchemaJson);
                var onlineValidation = onlineSchema.Validate(localSchemaJson);

                Assert.AreEqual(onlineSchema, schema);

                onlineValidation.AssertValid();
                localValidation.AssertValid();

                Assert.AreEqual(onlineSchemaJson, localSchemaJson);
            }
            catch (WebException)
            {
                Assert.Inconclusive();
            }
            catch (AggregateException e)
            {
                if (e.InnerExceptions.OfType <WebException>().Any())
                {
                    Assert.Inconclusive();
                }
                throw;
            }
        }
        /// <summary>
        /// Indicates whether the current object is equal to another object of the same type.
        /// </summary>
        /// <returns>
        /// true if the current object is equal to the <paramref name="other"/> parameter; otherwise, false.
        /// </returns>
        /// <param name="other">An object to compare with this object.</param>
        public bool Equals(IJsonSchema other)
        {
            var schema = other as JsonSchemaReference;

            return(schema != null && schema.Reference == Reference &&
                   Equals(Base, schema.Base));
        }
        public void Hardcoded(IJsonSchema schema)
        {
            var json       = schema.ToJson(null);
            var validation = schema.Validate(json);

            validation.AssertValid();
        }
Example #8
0
        public void ValidateReturnsErrorOnNonInteger(IJsonSchema schema)
        {
            var json = (JsonValue)1.2;

            var results = schema.Validate(json);

            results.AssertInvalid();
        }
Example #9
0
        public void ValidateReturnsValidOnMultipleOf_Zero(IJsonSchema schema)
        {
            var json = (JsonValue)0;

            var results = schema.Validate(json);

            results.AssertValid();
        }
Example #10
0
        public SchemaValidationResults Validate(IJsonSchema schema, JsonValue json, JsonValue root)
        {
            var maxProperties = GetMaxProperties((T)schema);

            return(json.Object.Count > maxProperties
                                           ? new SchemaValidationResults(string.Empty, $"Expected: <= {maxProperties} properties; Actual: {json.Object.Count} properties.")
                                       : new SchemaValidationResults());
        }
Example #11
0
        public void ValidateReturnsValidOnLessThanMaximum(IJsonSchema schema)
        {
            var json = (JsonValue)3;

            var results = schema.Validate(json);

            results.AssertValid();
        }
        public SchemaValidationResults Validate(IJsonSchema schema, JsonValue json, JsonValue root)
        {
            var errors = GetEnum((T)schema).Select(d => d.Validate(json)).ToList();

            return(errors.Any(r => r.Valid)
                ? new SchemaValidationResults()
                : new SchemaValidationResults(schema, string.Empty, string.Empty, validationKeyword: "enum"));
        }
Example #13
0
        public void ValidateReturnsValidOnBoolean(IJsonSchema schema)
        {
            var json = (JsonValue)false;

            var results = schema.Validate(json);

            results.AssertValid();
        }
Example #14
0
        public SchemaValidationResults Validate(IJsonSchema schema, JsonValue json, JsonValue root)
        {
            var minProperties = GetMinProperties((T)schema);

            return(json.Object.Count < minProperties
                                       ? new SchemaValidationResults(string.Empty, $"Expected: >= {minProperties} items; Actual: {json.Object.Count} items.")
                                       : new SchemaValidationResults());
        }
Example #15
0
        public SchemaValidationResults Validate(IJsonSchema schema, JsonValue json, JsonValue root)
        {
            var results = GetNot((T)schema).Validate(json, root);

            return(results.Valid
                                       ? new SchemaValidationResults(string.Empty, "Expected schema to be invalid, but was valid.")
                                       : new SchemaValidationResults());
        }
Example #16
0
        public void ValidateReturnsValidOnValueInRange(IJsonSchema schema)
        {
            var json = (JsonValue)"test1";

            var results = schema.Validate(json);

            results.AssertValid();
        }
Example #17
0
        public void ValidateReturnsErrorOnValueOutOfRange(IJsonSchema schema)
        {
            var json = (JsonValue)"string";

            var results = schema.Validate(json);

            results.AssertInvalid();
        }
        public SchemaValidationResults Validate(IJsonSchema schema, JsonValue json, JsonValue root)
        {
            var pattern = GetPattern((T)schema);

            return(Regex.IsMatch(json.String, pattern)
                                       ? new SchemaValidationResults()
                                       : new SchemaValidationResults(string.Empty, $"Value [{json.String}] does not match required Regex pattern [{pattern}]."));
        }
Example #19
0
        public void ValidateReturnsErrorOnLessThanMinimum(IJsonSchema schema)
        {
            var json = (JsonValue)4;

            var results = schema.Validate(json);

            results.AssertInvalid();
        }
Example #20
0
        public void ValidateReturnsValidOnMoreThanMinimum(IJsonSchema schema)
        {
            var json = (JsonValue)10;

            var results = schema.Validate(json);

            results.AssertValid();
        }
Example #21
0
        public void ValidateReturnsValidOnNull(IJsonSchema schema)
        {
            var json = JsonValue.Null;

            var results = schema.Validate(json);

            results.AssertValid();
        }
        public SchemaValidationResults Validate(IJsonSchema schema, JsonValue json, JsonValue root)
        {
            var multipleOf = GetMultipleOf((T)schema);

            return((decimal)json.Number % (decimal?)multipleOf != 0
                                       ? new SchemaValidationResults(string.Empty, $"Expected: {json.Number}%{multipleOf}=0; Actual: {json.Number % multipleOf}.")
                                       : new SchemaValidationResults());
        }
Example #23
0
        public void ValidateReturnsErrorOnMoreThanMaximum(IJsonSchema schema)
        {
            var json = (JsonValue)10;

            var results = schema.Validate(json);

            results.AssertInvalid();
        }
Example #24
0
 public virtual bool Applies(IJsonSchema schema, JsonValue json)
 {
     return(schema is T typed &&
            (GetProperties(typed) != null ||
             GetAdditionalProperties(typed) != null ||
             GetPatternProperties(typed) != null) &&
            json.Type == JsonValueType.Object);
 }
Example #25
0
        public void ValidateReturnsErrorOnString(IJsonSchema schema)
        {
            JsonValue json = "string";

            var results = schema.Validate(json);

            results.AssertInvalid();
        }
        public SchemaValidationResults Validate(IJsonSchema schema, JsonValue json, JsonValue root)
        {
            var errors = GetAnyOf((T)schema).Select(s => s.Validate(json, root)).ToList();

            return(errors.Any(r => r.Valid)
                                       ? new SchemaValidationResults()
                                       : new SchemaValidationResults(errors));
        }
Example #27
0
        public void ValidateReturnsValidOnMultipleOf_Negative(IJsonSchema schema)
        {
            var json = (JsonValue)(-15);

            var results = schema.Validate(json);

            results.AssertValid();
        }
Example #28
0
        public void ValidateReturnsErrorOnNoneValid(IJsonSchema schema)
        {
            var json = new JsonObject();

            var results = schema.Validate(json);

            results.AssertInvalid();
        }
        public SchemaValidationResults Validate(IJsonSchema schema, JsonValue json, JsonValue root)
        {
            var errors = GetDependencies((T)schema).SelectMany(d => d.Validate(json, root).Errors).ToArray();

            return(errors.Any()
                ? new SchemaValidationResults(schema, string.Empty, string.Empty, validationKeyword: "dependencies")
                : new SchemaValidationResults());
        }
Example #30
0
        public void ValidateReturnsValidOnSingleValid(IJsonSchema schema)
        {
            var json = (JsonValue)25;

            var results = schema.Validate(json);

            results.AssertValid();
        }
Example #31
0
        private static string JsonSchemaToDotNetType(string parentName, string nodeName, IJsonSchema schema)
        {
            if (IsJsonSchemaEnum(schema))
            {
                return parentName + nodeName;
            }

            if (schema.Type.Equals("array", StringComparison.OrdinalIgnoreCase))
            {
                var schemaAsProperty = schema as Property;
                if (schemaAsProperty != null)
                {
                    return JsonSchemaToDotNetType(schemaAsProperty.ArrayItemType, null) + "[]";
                }

                return "object[]";
            }

            return JsonSchemaToDotNetType(schema.Type, schema.Format);
        }
Example #32
0
 private static bool IsJsonSchemaEnum(IJsonSchema schema) => schema.Type.ToUpperInvariant().Equals("STRING") && schema.Enum != null && schema.Enum.Length > 0;
Example #33
0
 private static void ParseJsonSchema(IJsonSchema item, JToken node)
 {
     item.Format = node["format"]?.Value<string>();
     item.CollectionFormat = node["collectionFormat"]?.Value<string>();
     item.Default = node["default"]?.Value<string>();
     item.Maximum = node["maximum"]?.Value<double>();
     item.ExclusiveMaximum = node["exclusiveMaximum"]?.Value<bool>() ?? false;
     item.Minimum = node["minimum"]?.Value<double>();
     item.ExclusiveMinimum = node["exclusiveMinimum"]?.Value<bool>() ?? false;
     item.MaxLength = node["maxLength"]?.Value<int>();
     item.MinLength = node["minLength"]?.Value<int>();
     item.Pattern = node["pattern"]?.Value<string>();
     item.MaxItems = node["maxItems"]?.Value<int>();
     item.MinItems = node["minItems"]?.Value<int>();
     item.UniqueItems = node["uniqueItems"]?.Value<bool>() ?? false;
     item.Enum = node["enum"]?.Values<string>().ToArray();
     item.MultipleOf = node["multipleOf"]?.Value<double>();
 }