Example #1
0
        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");
        }
Example #2
0
        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");
        }
Example #3
0
        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();
        }
Example #4
0
        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;
            }
        }
Example #5
0
        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"));
        }
Example #6
0
        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);
        }
Example #7
0
        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);
        }
Example #8
0
        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);
        }
Example #9
0
        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);
        }
Example #10
0
        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"));
        }
Example #11
0
        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"));
        }
Example #12
0
        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");
        }
Example #13
0
        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"));
        }
Example #14
0
        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);
        }
Example #16
0
        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);
        }
Example #18
0
        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
        }
Example #19
0
    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);
    }
Example #20
0
    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);
    }
Example #21
0
    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);
    }
Example #22
0
    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());
    }
Example #23
0
        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);
        }
Example #24
0
        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);
        }
Example #25
0
        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);
        }
Example #26
0
        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);
        }
Example #27
0
    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);
    }
Example #28
0
        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);
        }
Example #29
0
        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);
        }
Example #31
0
        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);
        }