public void ToSetValueByTwoLevelPathWithNullValueTest() { var model = new NiceAct4(); model.Name = "Alex"; model.Age = 23; model.AddressModel = null; var v = ObjectVisitor.Create(typeof(NiceAct4), model); v["Name"].ShouldBe("Alex"); v["Age"].ShouldBe(23); v["AddressModel"].ShouldBeNull(); v["Name"] = "Lewis"; v["Age"] = 24; v["AddressModel.Address", AccessMode.Structured] = "Moon"; v["Name"].ShouldBe("Lewis"); v["Age"].ShouldBe(24); v["AddressModel.Address", AccessMode.Structured].ShouldBe("Moon"); v.GetValue <NiceAct4B>("AddressModel").Address.ShouldBe("Moon"); v.GetValue <string>("AddressModel.Address").ShouldBeNull(); v.GetValue <string>("AddressModel.Address", AccessMode.Structured).ShouldBe("Moon"); }
public void ToGetValueByThreeLevelPathTest() { var model = new NiceAct4(); model.Name = "Alex"; model.Age = 23; model.AddressModel = new NiceAct4B() { Address = "Moon" }; model.AddressModel.Country = new NiceAct4C() { City = "Shanghai" }; var v = ObjectVisitor.Create(typeof(NiceAct4), model); v["Name"].ShouldBe("Alex"); v["Age"].ShouldBe(23); v.GetValue <NiceAct4B>("AddressModel").Address.ShouldBe("Moon"); v.GetValue("AddressModel.Address", AccessMode.Structured).ShouldBe("Moon"); v.GetValue <string>("AddressModel.Address", AccessMode.Structured).ShouldBe("Moon"); v.GetValue <NiceAct4C>("AddressModel.Country", AccessMode.Structured).City.ShouldBe("Shanghai"); v.GetValue("AddressModel.Country.City", AccessMode.Structured).ShouldBe("Shanghai"); v.GetValue <string>("AddressModel.Country.City", AccessMode.Structured).ShouldBe("Shanghai"); }
public void ToGetValueByThreeLevelPathWithNullValueTest() { var model = new NiceAct4(); model.Name = "Alex"; model.Age = 23; model.AddressModel = null; var v = ObjectVisitor.Create(typeof(NiceAct4), model); v["Name"].ShouldBe("Alex"); v["Age"].ShouldBe(23); v.GetValue <NiceAct4B>("AddressModel")?.Address.ShouldBeNull(); v.GetValue("AddressModel.Address", AccessMode.Structured).ShouldBeNull(); v.GetValue <string>("AddressModel.Address", AccessMode.Structured).ShouldBeNull(); v.GetValue <NiceAct4C>("AddressModel.Country", AccessMode.Structured).ShouldBeNull(); v.GetValue("AddressModel.Country", AccessMode.Structured).ShouldBeNull(); v.GetValue <string>("AddressModel.Country", AccessMode.Structured).ShouldBeNull(); v.GetValue <NiceAct4C>("AddressModel.Country", AccessMode.Structured)?.City.ShouldBeNull(); v.GetValue("AddressModel.Country.City", AccessMode.Structured).ShouldBeNull(); v.GetValue <string>("AddressModel.Country.City", AccessMode.Structured).ShouldBeNull(); }
public void Test(Operation operation, object objectToApplyTo) { if (operation == null) { throw new ArgumentNullException(nameof(operation)); } if (objectToApplyTo == null) { throw new ArgumentNullException(nameof(objectToApplyTo)); } var parsedPath = new ParsedPath(operation.path); var visitor = new ObjectVisitor(parsedPath, ContractResolver, AdapterFactory); var target = objectToApplyTo; if (!visitor.TryVisit(ref target, out var adapter, out var errorMessage)) { var error = CreatePathNotFoundError(objectToApplyTo, operation.path, operation, errorMessage); ErrorReporter(error); return; } if (!adapter.TryTest(target, parsedPath.LastSegment, ContractResolver, operation.value, out errorMessage)) { var error = CreateOperationFailedError(objectToApplyTo, operation.path, operation, errorMessage); ErrorReporter(error); return; } }
public void AnonymousTypeSettingTest() { var anonymousObj = new { Name = "Nu", Age = 12 }; var options = ObjectVisitorOptions.Default.With(x => x.SilenceIfNotWritable = false); var v = ObjectVisitor.Create(anonymousObj, options); Assert.Throws <InvalidOperationException>(() => v.SetValue("Name", "Da")); }
public void GetTypeNameConvertsGenericTypesToCsharpSyntax() { // Act string value = ObjectVisitor.GetTypeName(typeof(Func <Func <Func <int, int, object>, Action <int> > >)); // Assert Assert.Equal("Func<Func<Func<int, int, object>, Action<int>>>", value); }
public void NormalModelWithOrTest() { var v = ObjectVisitor.Create(Type, Data); v.VerifiableEntry.ForMember("Str", c => c.MaxLength(7).Or().MinLength(5)); var r = v.Verify(); Assert.True(r.IsValid); }
public void DirectInstanceWithValueApiValidTest() { var act = new NiceAct() { Name = "Hu", Age = 22, Country = Country.China, Birthday = DateTime.Today }; var type = typeof(NiceAct); var v = ObjectVisitor.Create(type, act); var context = v.VerifiableEntry; Assert.NotNull(context); context.ForMember("Name", c => c.NotEmpty().MinLength(4).MaxLength(15)); var r1 = v.Verify(); Assert.False(r1.IsValid); Assert.Single(r1.Errors); Assert.Single(r1.Errors[0].Details); v["Name"] = "Hulu"; //4 var r2 = v.Verify(); Assert.True(r2.IsValid); v["Name"] = "HuluWayaJavaPojoNovaLomo"; //16,greater than 15 var r3 = v.Verify(); Assert.False(r3.IsValid); Assert.Single(r3.Errors); Assert.Single(r3.Errors[0].Details); v["Name"] = ""; //0 var r4 = v.Verify(); Assert.False(r4.IsValid); Assert.Single(r4.Errors); Assert.Equal(2, r4.Errors[0].Details.Count); v["Name"] = null; //nil var r5 = v.Verify(); Assert.False(r5.IsValid); Assert.Single(r5.Errors); Assert.Equal(2, r5.Errors[0].Details.Count); }
public void DirectInstanceWithStrategyValidTest() { var act = new NiceAct() { Name = "Hu", //2 Age = 22, Country = Country.China, Birthday = DateTime.Today }; var type = typeof(NiceAct); var v = ObjectVisitor.Create(type, act); var context = v.VerifiableEntry; Assert.NotNull(context); context.SetStrategy <NormalNiceActValidationStrategy>(); var r1 = v.Verify(); Assert.False(r1.IsValid); Assert.Single(r1.Errors); Assert.Single(r1.Errors[0].Details); v["Name"] = "Hulu"; //4 var r2 = v.Verify(); Assert.True(r2.IsValid); v["Name"] = "HuluWayaJavaPojoNovaLomo"; //16,greater than 15 var r3 = v.Verify(); Assert.False(r3.IsValid); Assert.Single(r3.Errors); Assert.Single(r3.Errors[0].Details); v["Name"] = ""; //0 var r4 = v.Verify(); Assert.False(r4.IsValid); Assert.Single(r4.Errors); Assert.Equal(2, r4.Errors[0].Details.Count); v["Name"] = null; //nil var r5 = v.Verify(); Assert.False(r5.IsValid); Assert.Single(r5.Errors); Assert.Equal(2, r5.Errors[0].Details.Count); }
public void AnonymousTypeGettingTest() { var anonymousObj = new { Name = "Nu", Age = 12 }; var v = ObjectVisitor.Create(anonymousObj); Assert.Equal("Nu", v.GetValue <string>("Name")); Assert.Equal("Nu", v.GetValue("Name")); Assert.Equal(12, v.GetValue <int>("Age")); Assert.Equal(12, v.GetValue("Age")); }
public void DirectTypeExpandoObjectTest() { dynamic sampleObject = new ExpandoObject(); sampleObject.Name = "Nu"; sampleObject.Age = 12; var v = ObjectVisitor.Create(typeof(ExpandoObject), (object)sampleObject); Assert.Equal("Nu", v.GetValue <string>("Name")); Assert.Equal(12, v.GetValue <int>("Age")); }
public void ToSetValueIntoStructWithoutSilenceModeTest() { var options = ObjectVisitorOptions.Default.With(x => x.SilenceIfNotWritable = false); var model = new NiceStruct("Alex", 23, DateTime.Today, Country.China, true); var v = ObjectVisitor.Create(model, options); v.ShouldNotBeNull(); v["Name"].ShouldBe("Alex"); Assert.Throws <InvalidOperationException>(() => v["Name"] = "Lewis"); }
public void GenericTypeDynamicObjectTest() { dynamic sampleObject = new DynamicModel(); sampleObject.Name = "Nu"; sampleObject.Age = 12; var v = ObjectVisitor.Create((DynamicModel)sampleObject); Assert.Equal("Nu", v.GetValue <string>("Name")); Assert.Equal(12, v.GetValue <int>("Age")); }
public void ToGetValueFromStructTest() { var model = new NiceStruct("Alex", 23, DateTime.Today, Country.China, true); var v = ObjectVisitor.Create(model); v.ShouldNotBeNull(); v["Name"].ShouldBe("Alex"); v["Age"].ShouldBe(23); v["Birthday"].ShouldBe(DateTime.Today); v["Country"].ShouldBe(Country.China); }
public void UpdateValueOutOfVisitorByThreeLevelPathTest() { var model = new NiceAct4(); model.Name = "Alex"; model.Age = 23; model.AddressModel = new NiceAct4B() { Address = "Moon" }; model.AddressModel.Country = new NiceAct4C() { City = "Shanghai" }; var v = ObjectVisitor.Create(typeof(NiceAct4), model); v["Name"].ShouldBe("Alex"); v["Age"].ShouldBe(23); v["AddressModel.Address", AccessMode.Structured].ShouldBe("Moon"); v["AddressModel.Country.City", AccessMode.Structured].ShouldBe("Shanghai"); model.Name = "Daniel"; model.Age = 21; model.AddressModel = new NiceAct4B() { Address = "Earth" }; model.AddressModel.Country = new NiceAct4C { City = "Beijing" }; v["Name"].ShouldBe("Daniel"); v["Age"].ShouldBe(21); v["AddressModel.Address", AccessMode.Structured].ShouldBe("Earth"); v["AddressModel.Country.City", AccessMode.Structured].ShouldBe("Beijing"); model.Name = "Riku"; model.Age = 20; model.AddressModel.Country = new NiceAct4C { City = "Nanjing" }; model.AddressModel = new NiceAct4B() { Address = "Mars" }; v["Name"].ShouldBe("Riku"); v["Age"].ShouldBe(20); v["AddressModel.Address", AccessMode.Structured].ShouldBe("Mars"); v["AddressModel.Country.City", AccessMode.Structured].ShouldBe(null); }
public void DirectInstanceSelectTest() { var act = new NiceAct() { Name = "Hu", Age = 22, Country = Country.China, Birthday = DateTime.Today }; var type = typeof(NiceAct); var v = ObjectVisitor.Create(type, act); var z0 = v.Select((s, o) => s); var z1 = v.Select((s, o, m) => s); var z2 = v.Select(c => c.Name); var z3 = v.Select <(string, int)>(c => (c.Name, c.Index)); var z4 = v.Select(c => new { c.Name, c.Value, c.Index }); Assert.NotNull(z0); Assert.NotNull(z1); Assert.NotNull(z2); Assert.NotNull(z3); Assert.NotNull(z4); var l0 = z0.FireAndReturn(); var l1 = z1.FireAndReturn(); var l2 = z2.FireAndReturn(); var l3 = z3.FireAndReturn(); var l4 = z4.FireAndReturn(); Assert.Equal(5, l0.Count()); Assert.Equal(5, l1.Count()); Assert.Equal(5, l2.Count()); Assert.Equal(5, l3.Count()); Assert.Equal(5, l4.Count()); var f0 = l0.First(); var f1 = l1.First(); var f2 = l2.First(); var f3 = l3.First(); var f4 = l4.First(); Assert.Equal("Name", f0); Assert.Equal("Name", f1); Assert.Equal("Name", f2); Assert.Equal("Name", f3.Item1); Assert.Equal(0, f3.Item2); Assert.Equal("Name", f4.Name); Assert.Equal("Hu", f4.Value); Assert.Equal(0, f4.Index); }
public void GenericNormalTupleTest() { var model = new Tuple <int>(1); var v = ObjectVisitor.Create(model); v.ShouldNotBeNull(); v["Item1"].ShouldBe(1); v["Item1"] = 100; v["Item1"].ShouldBe(1); }
public void ToSetValueIntoStructWithSilenceModeTest() { var model = new NiceStruct("Alex", 23, DateTime.Today, Country.China, true); var v = ObjectVisitor.Create(model); v.ShouldNotBeNull(); v["Name"].ShouldBe("Alex"); v["Name"] = "Lewis"; v["Name"].ShouldBe("Alex"); // struct is readonly }
public void Visit_ValidPathToArray_ReturnsListAdapter(object targetObject, string path, object expectedTargetObject) { // Arrange var visitor = new ObjectVisitor(new ParsedPath(path), new DefaultContractResolver()); // Act var visitStatus = visitor.TryVisit(ref targetObject, out var adapter, out var message); // Assert Assert.True(visitStatus); Assert.True(string.IsNullOrEmpty(message), "Expected no error message"); Assert.Same(expectedTargetObject, targetObject); Assert.IsType <ListAdapter>(adapter); }
public void Visit_NullTarget_ReturnsNullAdapter() { // Arrange var visitor = new ObjectVisitor(new ParsedPath("test"), new DefaultContractResolver()); // Act object target = null; var visitStatus = visitor.TryVisit(ref target, out var adapter, out var message); // Assert Assert.False(visitStatus); Assert.Null(adapter); Assert.Null(message); }
public void Visit_InvalidIndexFormatToArray_Fails(string position) { // Arrange var visitor = new ObjectVisitor(new ParsedPath($"/Customers/{position}/States/-"), new DefaultContractResolver()); var automobileDepartment = new Class1Nested(); object targetObject = automobileDepartment; // Act var visitStatus = visitor.TryVisit(ref targetObject, out var adapter, out var message); // Assert Assert.False(visitStatus); Assert.Equal($"The path segment '{position}' is invalid for an array index.", message); }
public void Visit_ValidPathToDictionary_ReturnsDictionaryAdapter(object targetObject, string path, object expectedTargetObject) { // Arrange var visitor = new ObjectVisitor(new ParsedPath(path), new DefaultContractResolver()); // Act var visitStatus = visitor.TryVisit(ref targetObject, out var adapter, out var message); // Assert Assert.True(visitStatus); Assert.True(string.IsNullOrEmpty(message), "Expected no error message"); Assert.Same(expectedTargetObject, targetObject); Assert.Equal(typeof(DictionaryAdapter <string, string>), adapter.GetType()); }
public void DirectFutureSelectTest() { var type = typeof(NiceAct); var v = ObjectVisitor.Create(type); v.SetValue("Name", "Du"); v.SetValue("Age", 55); v.SetValue("Country", Country.USA); v.SetValue("Birthday", DateTime.Today.AddDays(-1)); v.SetValue("IsValid", true); var z0 = v.Select((s, o) => s); var z1 = v.Select((s, o, m) => s); var z2 = v.Select(c => c.Name); var z3 = v.Select <(string, int)>(c => (c.Name, c.Index)); var z4 = v.Select(c => new { c.Name, c.Value, c.Index }); Assert.NotNull(z0); Assert.NotNull(z1); Assert.NotNull(z2); Assert.NotNull(z3); Assert.NotNull(z4); var l0 = z0.FireAndReturn(); var l1 = z1.FireAndReturn(); var l2 = z2.FireAndReturn(); var l3 = z3.FireAndReturn(); var l4 = z4.FireAndReturn(); Assert.Equal(5, l0.Count()); Assert.Equal(5, l1.Count()); Assert.Equal(5, l2.Count()); Assert.Equal(5, l3.Count()); Assert.Equal(5, l4.Count()); var f0 = l0.First(); var f1 = l1.First(); var f2 = l2.First(); var f3 = l3.First(); var f4 = l4.First(); Assert.Equal("Name", f0); Assert.Equal("Name", f1); Assert.Equal("Name", f2); Assert.Equal("Name", f3.Item1); Assert.Equal(0, f3.Item2); Assert.Equal("Name", f4.Name); Assert.Equal("Du", f4.Value); Assert.Equal(0, f4.Index); }
public void Visit_ValidPathToArray_ReturnsListAdapter(object targetObject, string path, object expectedTargetObject) { // Arrange var targetType = targetObject.GetType(); var visitor = new ObjectVisitor(new ParsedPath(path), new JsonSerializerOptions()); // Act var visitStatus = visitor.TryVisit(ref targetObject, ref targetType, out var adapter, out var message); // Assert Assert.True(visitStatus); Assert.True(string.IsNullOrEmpty(message), "Expected no error message"); Assert.Same(expectedTargetObject, targetObject); Assert.IsType <ListAdapter>(adapter); }
public void Visit_InvalidIndexFormatToArray_Fails(string position) { // Arrange var visitor = new ObjectVisitor(new ParsedPath($"/Customers/{position}/States/-"), new JsonSerializerOptions()); var automobileDepartment = new Class1Nested(); object targetObject = automobileDepartment; var targetType = targetObject.GetType(); // Act var visitStatus = visitor.TryVisit(ref targetObject, ref targetType, out _, out var message); // Assert Assert.False(visitStatus); Assert.Equal($"The path segment '{position}' is invalid for an array index.", message); }
public void Visit_InvalidIndexToArray_Fails(string position) { // Arrange var visitor = new ObjectVisitor(new ParsedPath($"/Customers/{position}/States/-"), new JsonSerializerOptions()); var automobileDepartment = new Class1Nested(); object targetObject = automobileDepartment; var targetType = typeof(Class1Nested); // Act var visitStatus = visitor.TryVisit(ref targetObject, ref targetType, out _, out var message); // Assert Assert.False(visitStatus); Assert.Equal($"The index value provided by path segment '{position}' is out of bounds of the array size.", message); }
public void Visit_DoesNotValidate_FinalPathSegment() { // Arrange var visitor = new ObjectVisitor(new ParsedPath($"/NonExisting"), new DefaultContractResolver()); var model = new Class1(); object targetObject = model; // Act var visitStatus = visitor.TryVisit(ref targetObject, out var adapter, out var message); // Assert Assert.True(visitStatus); Assert.True(string.IsNullOrEmpty(message), "Expected no error message"); Assert.IsType <PocoAdapter>(adapter); }
public void Visit_NullTarget_ReturnsNullAdapter() { // Arrange var visitor = new ObjectVisitor(new ParsedPath("test"), new JsonSerializerOptions()); object target = null; Type targetType = null; // Act var visitStatus = visitor.TryVisit(ref target, ref targetType, out var adapter, out var message); // Assert Assert.False(visitStatus); Assert.Null(adapter); Assert.Null(message); }
public void Visit_DoesNotValidate_FinalPathSegment() { // Arrange var visitor = new ObjectVisitor(new ParsedPath("/NonExisting"), new JsonSerializerOptions()); var model = new Class1(); object targetObject = model; var targetType = targetObject.GetType(); // Act var visitStatus = visitor.TryVisit(ref targetObject, ref targetType, out var adapter, out var message); // Assert Assert.True(visitStatus); Assert.True(string.IsNullOrEmpty(message), "Expected no error message"); Assert.IsType <PocoAdapter>(adapter); }
public void GenericValueTupleWithNameTest() { (int Num1, int Num2)model = (1, 1); var v = ObjectVisitor.Create(model); v.ShouldNotBeNull(); v["Item1"].ShouldBe(1); v["Item2"].ShouldBe(1); v["Item1"] = 100; v["Item2"] = 200; v["Item1"].ShouldBe(1); v["Item2"].ShouldBe(1); }
public virtual void Visit(ObjectVisitor visitor) { if (o == null || o.GetType().Equals(typeof (object))) return; Markable markable = o as Markable; if (markable != null && markable.IsProcessed) return; if (markable != null) markable.IsProcessed = true; @class.EachField(delegate(FieldInfo fieldInfo) { var reflectedObject = new ReflectedObject(fieldInfo.GetValue(o), leafRegister); if (TreatAsPrimitive(fieldInfo.FieldType) || leafRegister.IsIgnored(fieldInfo.FieldType)) visitor.Accept(reflectedObject); else reflectedObject.Visit(visitor); }); visitor.Accept(this); }