public void ReturnCorrectPropertyValue()
        {
            var obj = new TestPropertyClass {
                Property = 42
            };
            var wrapper = new ImplBaseTester(obj);

            Assert.AreEqual(42, wrapper.GetProperty <int>(nameof(obj.Property)));
        }
        public void ThrowExceptionIfPropertyDoesNotExist()
        {
            var obj     = new TestPropertyClass();
            var wrapper = new ImplBaseTester(obj);

            var ex = Assert.Throws <ArgumentOutOfRangeException>(() => wrapper.GetProperty <int>("invalid"));

            Assert.IsNotNull(ex);
            ex.Message.Should().Be($"Property does not exist!{Environment.NewLine}Parameter name: propertyName");
        }
        public void ThrowExceptionIfPropertyAccessMethodDoesNotExist()
        {
            var obj     = new TestPropertyClass();
            var wrapper = new ImplBaseTester(obj);

            var ex = Assert.Throws <ArgumentOutOfRangeException>(() => wrapper.GetProperty <int>(nameof(obj.WriteOnlyProperty)));

            Assert.IsNotNull(ex);
            ex.Message.Should().Be($"Specified argument was out of the range of valid values.{Environment.NewLine}Parameter name: Property get does not exist for WriteOnlyProperty!");
        }
        public void ThrowExceptionIfPropertyNameIsNull()
        {
            var obj     = new TestPropertyClass();
            var wrapper = new ImplBaseTester(obj);

            var ex = Assert.Throws <ArgumentNullException>(() => wrapper.GetProperty <int>(null));

            Assert.IsNotNull(ex);
            ex.ParamName.Should().Be("propertyName");
        }