示例#1
0
        public void When_getting_properties_of_known_instance_but_unknown_property_type()
        {
            var instance = new Person();

            instance.Name.ShouldBeNull();

            instance.Name = "Foo";

            instance.Name.ShouldBe("Foo");

            var nameGetter = AccessorBuilder.BuildGetter <Person>("Name");

            nameGetter(instance).ShouldBe("Foo");

            instance.Name.ShouldBe("Foo");

            instance.GetJob().ShouldBeNull();

            var jobSetter = AccessorBuilder.BuildSetter <Person>("Job", true);

            jobSetter(instance, "Baz");
            instance.GetJob().ShouldBe("Baz");

            var jobGetter = AccessorBuilder.BuildGetter <Person>("Job", true);

            jobGetter(instance).ShouldBe("Baz");
        }
示例#2
0
        public void When_getting_properties_of_unknown_instance_and_property_type()
        {
            var instance = new Person();

            instance.Name.ShouldBeNull();

            instance.Name = "Foo";

            instance.Name.ShouldBe("Foo");

            PropertyInfo nameProp;

            typeof(Person).TryGetInstanceProperty("Name", out nameProp).ShouldBeTrue();

            var nameGetter = AccessorBuilder.BuildGetter(nameProp);

            nameGetter(instance).ShouldBe("Foo");

            instance.Name.ShouldBe("Foo");

            instance.GetJob().ShouldBeNull();

            PropertyInfo jobProp;

            typeof(Person).TryGetInstanceProperty("Job", out jobProp).ShouldBeTrue();
            var jobSetter = AccessorBuilder.BuildSetter(jobProp, true);

            jobSetter(instance, "Baz");
            instance.GetJob().ShouldBe("Baz");

            var jobGetter = AccessorBuilder.BuildGetter(jobProp, true);

            jobGetter(instance).ShouldBe("Baz");
        }
示例#3
0
        public void When_checking_invalid_input()
        {
            string       nullStr      = null;
            PropertyInfo nullPropInfo = null;

            Should.Throw <ArgumentException>(() => AccessorBuilder.BuildSetter <Person, string>(nullStr))
            .Message.ShouldBe("String must not be null, empty or whitespace.");

            Should.Throw <ArgumentException>(() => AccessorBuilder.BuildSetter <Person, string>(nullPropInfo))
            .Message.ShouldBe("Value cannot be null.\r\nParameter name: propertyInfo");

            Should.Throw <ArgumentException>(() => AccessorBuilder.BuildGetter <Person, string>(nullStr))
            .Message.ShouldBe("String must not be null, empty or whitespace.");

            Should.Throw <ArgumentException>(() => AccessorBuilder.BuildGetter <Person, string>(nullPropInfo))
            .Message.ShouldBe("Value cannot be null.\r\nParameter name: propertyInfo");

            Should.Throw <ArgumentException>(() => AccessorBuilder.BuildSetter <Person>(nullStr))
            .Message.ShouldBe("String must not be null, empty or whitespace.");

            Should.Throw <ArgumentException>(() => AccessorBuilder.BuildSetter <Person>(nullPropInfo))
            .Message.ShouldBe("Value cannot be null.\r\nParameter name: propertyInfo");

            Should.Throw <ArgumentException>(() => AccessorBuilder.BuildGetter <Person>(nullStr))
            .Message.ShouldBe("String must not be null, empty or whitespace.");

            Should.Throw <ArgumentException>(() => AccessorBuilder.BuildGetter <Person>(nullPropInfo))
            .Message.ShouldBe("Value cannot be null.\r\nParameter name: propertyInfo");

            Should.Throw <ArgumentException>(() => AccessorBuilder.BuildSetter(nullPropInfo))
            .Message.ShouldBe("Value cannot be null.\r\nParameter name: propertyInfo");

            Should.Throw <ArgumentException>(() => AccessorBuilder.BuildGetter(nullPropInfo))
            .Message.ShouldBe("Value cannot be null.\r\nParameter name: propertyInfo");
        }
示例#4
0
        public void When_getting_getters_class()
        {
            var nameGetterOne = AccessorBuilder.BuildGetter <Person, string>("Name");
            var nameGetterTwo = AccessorBuilder.BuildGetter <Person, string>("Name");

            nameGetterOne.ShouldNotBeSameAs(nameGetterTwo);

            var jobGetter = AccessorBuilder.BuildGetter <Person, string>("Job", true);

            jobGetter.ShouldNotBe(nameGetterOne);
            jobGetter.ShouldNotBe(nameGetterTwo);
        }
示例#5
0
        public void When_getting_properties_of_known_instance_but_unkonnown_property_type_of_a_struct()
        {
            var instance = new Struct();

            instance.SomeString.ShouldBeNull();

            instance.SomeString = "Foo";

            instance.SomeString.ShouldBe("Foo");

            var propGetter = AccessorBuilder.BuildGetter <Struct>("SomeString");

            propGetter(instance).ShouldBe("Foo");
            instance.SomeString.ShouldBe("Foo");
        }
示例#6
0
        public void When_getting_properties_of_unknown_instance_and_property_type_of_a_struct()
        {
            var instance = new Struct();

            instance.SomeString.ShouldBeNull();

            instance.SomeString = "Foo";

            instance.SomeString.ShouldBe("Foo");

            PropertyInfo nameProp;

            typeof(Struct).TryGetInstanceProperty("SomeString", out nameProp).ShouldBeTrue();

            var nameGetter = AccessorBuilder.BuildGetter(nameProp);

            nameGetter(instance).ShouldBe("Foo");
            instance.SomeString.ShouldBe("Foo");
        }
示例#7
0
        /// <summary>
        /// Compares the values of all the properties for the given
        /// <paramref name="left"/> and <paramref name="right"/> and returns the variance.
        /// </summary>
        public bool Compare <T>(T left, T right, bool inherit, bool includePrivate,
                                out IEasyDictionary <PropertyInfo, Variance> variances)
        {
            var type = typeof(T);
            var key  = new CacheKey(type, inherit, includePrivate);

            var cache = _cache.GetOrAdd(key, () =>
            {
                return(type.GetInstanceProperties(inherit, includePrivate)
                       .Select(p => new KeyValuePair <PropertyInfo, object>(p, AccessorBuilder.BuildGetter <T>(p, includePrivate))));
            });

            var bothMatch = true;
            var result    = new EasyDictionary <PropertyInfo, Variance>(variance => variance.Property);

            foreach (var pair in cache)
            {
                var p      = pair.Key;
                var getter = (Func <T, object>)pair.Value;

                var leftVal  = getter(left);
                var rightVal = getter(right);

                var variance = new Variance(p, leftVal, rightVal);

                result.Add(variance);

                if (!bothMatch)
                {
                    continue;
                }
                if (variance.Varies)
                {
                    bothMatch = false;
                }
            }

            variances = result;
            return(bothMatch);
        }