public void Can_load_really_big_schema() { var s = JSchema.Parse(File.ReadAllText(Path.Combine(Path.GetDirectoryName(typeof(JSchemaValidatorBuilderTests).Assembly.Location), "Validation", "ecourt_com_151.json"))); var o = JObject.Parse(File.ReadAllText(Path.Combine(Path.GetDirectoryName(typeof(JSchemaValidatorBuilderTests).Assembly.Location), "Validation", "efm.json"))); var v = JSchemaExpressionBuilder.CreateDefault().Build(s); var a = v.Compile(); a.Invoke(o); var sw = new Stopwatch(); var t = TimeSpan.Zero; for (var i = 0; i < 1000; i++) { sw.Start(); var r = a.Invoke(o); sw.Stop(); t += sw.Elapsed; sw.Reset(); } Console.WriteLine("Average on Fast Validator: " + new TimeSpan((long)(t.Ticks / 1000d))); t = TimeSpan.Zero; for (var i = 0; i < 1000; i++) { sw.Start(); var r = o.IsValid(s); sw.Stop(); t += sw.Elapsed; sw.Reset(); } Console.WriteLine("Average on Slow Validator: " + new TimeSpan((long)(t.Ticks / 1000d))); }
public override Expression Build(JSchemaExpressionBuilder builder, JSchema schema, Expression token) { if (schema.OneOf.Count == 0) { return(null); } return(OneOf(schema.OneOf.Select(i => builder.Eval(i, token)))); }
Expression BuildPatternProperty(JSchemaExpressionBuilder builder, string propertyPattern, JSchema propertySchema, Expression o) { if (o.Type != typeof(JObject)) { throw new ArgumentException(nameof(o)); } return(CallThis(nameof(PatternProperty), Expression.Constant(propertyPattern), EvalSchemaFunc(builder, propertySchema), o)); }
public void Should_fail_to_validate_const_integer() { var s = new JSchema() { Const = 1 }; var o = new JValue(2); var r = JSchemaExpressionBuilder.CreateDefault().Build(s).Compile().Invoke(o); r.Should().BeFalse(); }
public override Expression Build(JSchemaExpressionBuilder builder, JSchema schema, Expression token) { if (schema.Format == null) { return(null); } return(IfThenElseTrue( IsTokenType(token, JTokenType.String), ValidateFormat(schema.Format, Expression.Convert(token, typeof(string))))); }
public void Should_validate_recursive_ref() { var s = JSchema.Parse("{ 'properties': { 'Prop1': { '$ref': '#' }, 'Prop2': { 'const': 'value' } } }"); var o = new JObject() { ["Prop1"] = new JObject() { ["Prop1"] = null } }; var r = JSchemaExpressionBuilder.CreateDefault().Build(s).Compile().Invoke(o); r.Should().BeTrue(); }
public void Should_skip_validating_single_property_with_const() { var s = new JSchema() { Properties = { ["Prop1"] = new JSchema() { Const = 1 } } }; var o = new JObject() { ["Prop2"] = 2 }; var r = JSchemaExpressionBuilder.CreateDefault().Build(s).Compile().Invoke(o); r.Should().BeTrue(); }
IEnumerable <Expression> BuildPropertiesAll(JSchemaExpressionBuilder builder, JSchema schema, Expression o) { if (schema.Properties.Count > 0) { yield return(IfThenElseTrue( IsTokenType(o, JTokenType.Object), AllOf(schema.Properties.Select(i => BuildProperty(builder, i.Key, i.Value, Expression.Convert(o, typeof(JObject))))))); } if (schema.PatternProperties.Count > 0) { yield return(IfThenElseTrue( IsTokenType(o, JTokenType.Object), AllOf(schema.PatternProperties.Select(i => BuildPatternProperty(builder, i.Key, i.Value, Expression.Convert(o, typeof(JObject))))))); } if (schema.AllowAdditionalProperties == false) { yield return(IfThenElseTrue( IsTokenType(o, JTokenType.Object), CallThis( nameof(AllowAdditionalProperties), Expression.Constant(schema), Expression.Convert(o, typeof(JObject))))); } else if (schema.AdditionalProperties != null) { var p = Expression.Parameter(typeof(JToken)); yield return(IfThenElseTrue( IsTokenType(o, JTokenType.Object), CallThis( nameof(AdditionalProperties), Expression.Constant(schema), Expression.Convert(o, typeof(JObject)), EvalSchemaFunc(builder, schema.AdditionalProperties)))); } }
/// <summary> /// Returns an expression that returns a delegate to evaluate the schema. /// </summary> /// <param name="schema"></param> /// <returns></returns> protected Expression EvalSchemaFunc(JSchemaExpressionBuilder builder, JSchema schema) { var p = Expression.Parameter(typeof(JToken)); return(Expression.Lambda <Func <JToken, bool> >(builder.Eval(schema, p), p)); }
public abstract Expression Build(JSchemaExpressionBuilder builder, JSchema schema, Expression token);
Expression BuildProperties(JSchemaExpressionBuilder builder, JSchema schema, Expression o) { return(AllOf(BuildPropertiesAll(builder, schema, o).Where(i => i != null))); }
public override Expression Build(JSchemaExpressionBuilder builder, JSchema schema, Expression token) { return(BuildProperties(builder, schema, token)); }