public void ObjectWrapperSetPropertyValue_NoSetter()
        {
            var testObject    = new PublicValueTypeTestClass();
            var objectWrapper = new ObjectWrapper(testObject);

            Assert.Throws <ArgumentException>(() => objectWrapper.SetPropertyValue(nameof(PublicValueTypeTestClass.PublicPropertyGet), 51));
        }
        public void ObjectWrapperSetPropertyValue_Class()
        {
            var testObject = new PublicValueTypeTestClass();

            var objectWrapper = new ObjectWrapper(testObject);

            objectWrapper.SetPropertyValue(nameof(PublicValueTypeTestClass.PublicPropertyGetSet), 12);
            Assert.AreEqual(12, testObject.PublicPropertyGetSet);

            objectWrapper.SetPropertyValue(nameof(PublicValueTypeTestClass.PublicVirtualPropertyGetSet), 24);
            Assert.AreEqual(24, testObject.PublicVirtualPropertyGetSet);

            objectWrapper.SetPropertyValue(nameof(PublicValueTypeTestClass.PublicPropertyGetPrivateSet), 48);
            Assert.AreEqual(48, testObject.PublicPropertyGetPrivateSet);

            objectWrapper.SetPropertyValue(nameof(PublicValueTypeTestClass.PublicPropertyPrivateGetSet), 96);
            Assert.AreEqual(96, testObject._publicField);   // => Setter set the public field value (for check)

            objectWrapper.SetPropertyValue(nameof(PublicValueTypeTestClass.PublicPropertySet), 192);
            Assert.AreEqual(192, testObject._publicField);   // => Setter set the public field value (for check)

            // Object wrapper does not provide access to not public members
            objectWrapper.SetPropertyValue(nameof(PublicValueTypeTestClass.InternalPropertyGetSet), 384);
            Assert.AreEqual(0, testObject._internalField);

            objectWrapper.SetPropertyValue("ProtectedPropertyGetSet", 728);
            Assert.AreEqual(0, testObject.GetProtectedFieldValue());

            objectWrapper.SetPropertyValue("PrivatePropertyGetSet", 1536);
            Assert.AreEqual(0, testObject.GetPrivateFieldValue());
        }
        public void ObjectWrapperGetMembers()
        {
            var testObject = new PublicValueTypeTestClass();
            TypeClassifiedMembers classifiedMembers = TypeClassifiedMembers.GetForPublicValueTypeTestObject();

            var objectWrapper = new ObjectWrapper(testObject);

            CollectionAssert.AreEquivalent(
                classifiedMembers.AllPublicMembers,
                SelectAllMemberInfos(objectWrapper.Members));
            CollectionAssert.AreEquivalent(
                classifiedMembers.AllPublicMembers,
                SelectAllMemberInfos(objectWrapper.GetMembers()));

            #region Local function

            IEnumerable <MemberInfo> SelectAllMemberInfos(IEnumerable <ImmediateMember> members)
            {
                return(members.Select <ImmediateMember, MemberInfo>(member =>
                {
                    if (member is ImmediateField field)
                    {
                        return field.FieldInfo;
                    }
                    if (member is ImmediateProperty property)
                    {
                        return property.PropertyInfo;
                    }

                    throw new InvalidOperationException("Members contain an unexpected value");
                }));
            }

            #endregion
        }
        public void ObjectWrapperGetPropertyValue_NoGetter()
        {
            var testObject    = new PublicValueTypeTestClass();
            var objectWrapper = new ObjectWrapper(testObject);

            // ReSharper disable once ReturnValueOfPureMethodIsNotUsed
            Assert.Throws <ArgumentException>(() => objectWrapper.GetPropertyValue(nameof(PublicValueTypeTestClass.PublicPropertySet)));
        }
        public void ObjectWrapperGetPropertyValue_NotExists()
        {
            var testObject = new PublicValueTypeTestClass();

            var objectWrapper = new ObjectWrapper(testObject);

            Assert.IsNull(objectWrapper.GetPropertyValue("NotExists"));
        }
        public void ObjectWrapperSetPropertyValue_NotExists()
        {
            var testObject = new PublicValueTypeTestClass();

            var objectWrapper = new ObjectWrapper(testObject);

            // Nothing set but not throw
            Assert.DoesNotThrow(() => objectWrapper.SetPropertyValue("NotExists", 12));
        }
        public void ObjectWrapperGetPropertyValue_Static()
        {
            var testObject = new PublicValueTypeTestClass();

            PublicValueTypeTestClass.PublicStaticPropertyGetSet = 66;
            var objectWrapper = new ObjectWrapper(testObject);

            Assert.AreEqual(66, objectWrapper.GetPropertyValue(nameof(PublicValueTypeTestClass.PublicStaticPropertyGetSet)));
        }
        public void ObjectWrapperSetFieldValue_Static()
        {
            var testObject = new PublicValueTypeTestClass();

            var objectWrapper = new ObjectWrapper(testObject);

            objectWrapper.SetFieldValue(nameof(PublicValueTypeTestClass._publicStaticField), 36);
            Assert.AreEqual(36, PublicValueTypeTestClass._publicStaticField);
        }
        public void ObjectWrapperSetPropertyValue_Static()
        {
            var testObject = new PublicValueTypeTestClass();

            var objectWrapper = new ObjectWrapper(testObject);

            objectWrapper.SetPropertyValue(nameof(PublicValueTypeTestClass.PublicStaticPropertyGetSet), 77);
            Assert.AreEqual(77, PublicValueTypeTestClass.PublicStaticPropertyGetSet);
        }
        public void ObjectWrapperGetFieldValue_Static()
        {
            var testObject = new PublicValueTypeTestClass();

            PublicValueTypeTestClass._publicStaticField = 12;
            var objectWrapper = new ObjectWrapper(testObject);

            Assert.AreEqual(12, objectWrapper.GetFieldValue(nameof(PublicValueTypeTestClass._publicStaticField)));
        }
        public void ObjectWrapperGetProperties()
        {
            var testObject1 = new PublicValueTypeTestClass();
            var testObject2 = new PublicReferenceTypeTestClass();

            var objectWrapper1 = new ObjectWrapper(testObject1);

            CollectionAssert.AreEquivalent(objectWrapper1.Properties, objectWrapper1.GetProperties());

            var objectWrapper2 = new ObjectWrapper(testObject2);

            CollectionAssert.AreNotEquivalent(objectWrapper1.GetProperties(), objectWrapper2.GetProperties());
        }
        public void ObjectWrapperToString()
        {
            var testObject  = new PublicValueTypeTestClass();
            var testObject2 = new InternalValueTypeTestClass();

            var objectWrapper1 = new ObjectWrapper(testObject);

            Assert.AreEqual(testObject.ToString(), objectWrapper1.ToString());

            var objectWrapper2 = new ObjectWrapper(testObject2);

            Assert.AreNotEqual(objectWrapper1.ToString(), objectWrapper2.ToString());
        }
        public void ObjectWrapperGetField()
        {
            var    testObject    = new PublicValueTypeTestClass();
            var    objectWrapper = new ObjectWrapper(testObject);
            string fieldName     = nameof(PublicValueTypeTestClass._publicField);

            Assert.AreEqual(objectWrapper.Fields[fieldName], objectWrapper.GetField(fieldName));

            fieldName = "NotExists";
            Assert.IsNull(objectWrapper.GetField(fieldName));

            // ReSharper disable once AssignNullToNotNullAttribute
            // ReSharper disable once ReturnValueOfPureMethodIsNotUsed
            Assert.Throws <ArgumentNullException>(() => objectWrapper.GetField(null));
        }
        public void ObjectWrapperGetProperty()
        {
            var    testObject    = new PublicValueTypeTestClass();
            var    objectWrapper = new ObjectWrapper(testObject);
            string propertyName  = nameof(PublicValueTypeTestClass.PublicPropertyGetSet);

            Assert.AreEqual(objectWrapper.Properties[propertyName], objectWrapper.GetProperty(propertyName));

            propertyName = "NotExists";
            Assert.IsNull(objectWrapper.GetProperty(propertyName));

            // ReSharper disable once AssignNullToNotNullAttribute
            // ReSharper disable once ReturnValueOfPureMethodIsNotUsed
            Assert.Throws <ArgumentNullException>(() => objectWrapper.GetProperty(null));
        }
        public void ImmediateFieldSetValue_Constant()
        {
            var testObject = new PublicValueTypeTestClass();

            // Static readonly
            var immediateField = new ImmediateField(PublicValueTypeStaticReadonlyPublicFieldFieldsInfo);

            Assert.Throws <FieldAccessException>(() => immediateField.SetValue(testObject, 123456));
            Assert.Throws <FieldAccessException>(() => immediateField.SetValue(null, 123456));

            // Constant
            immediateField = new ImmediateField(PublicValueTypeConstPublicFieldFieldsInfo);
            Assert.Throws <FieldAccessException>(() => immediateField.SetValue(testObject, 123456));
            Assert.Throws <FieldAccessException>(() => immediateField.SetValue(null, 123456));
        }
        public void ImmediateFieldGetValue_Constant()
        {
            var testObject = new PublicValueTypeTestClass();

            // Static readonly
            var immediateField = new ImmediateField(PublicValueTypeStaticReadonlyPublicFieldFieldsInfo);

            Assert.AreEqual(112, immediateField.GetValue(testObject));
            Assert.AreEqual(112, immediateField.GetValue(null));

            // Constant
            immediateField = new ImmediateField(PublicValueTypeConstPublicFieldFieldsInfo);
            Assert.AreEqual(221, immediateField.GetValue(testObject));
            Assert.AreEqual(221, immediateField.GetValue(null));
        }
        public void ObjectWrapperGetFieldValue_NonPublic()
        {
            var publicTestObject = new PublicValueTypeTestClass();

            var objectWrapper = new ObjectWrapper(publicTestObject);

            Assert.IsNull(objectWrapper.GetFieldValue(nameof(PublicValueTypeTestClass._internalField)));
            Assert.IsNull(objectWrapper.GetFieldValue("_protectedField"));
            Assert.IsNull(objectWrapper.GetFieldValue("_privateField"));

            var internalTestObject = new InternalValueTypeTestClass();

            objectWrapper = new ObjectWrapper(internalTestObject);
            Assert.IsNull(objectWrapper.GetFieldValue(nameof(InternalValueTypeTestClass._internalField)));
            Assert.IsNull(objectWrapper.GetFieldValue("_protectedField"));
            Assert.IsNull(objectWrapper.GetFieldValue("_privateField"));
        }
        public void ObjectWrapperEquality()
        {
            var testObject  = new PublicValueTypeTestClass();
            var testObject2 = new PublicValueTypeTestClass();

            var objectWrapper1 = new ObjectWrapper(testObject);
            var objectWrapper2 = new ObjectWrapper(testObject);

            Assert.IsTrue(objectWrapper1.Equals(objectWrapper1));
            Assert.IsTrue(objectWrapper1.Equals(objectWrapper2));
            Assert.IsTrue(objectWrapper1.Equals((object)objectWrapper2));
            Assert.IsFalse(objectWrapper1.Equals(null));

            var objectWrapper3 = new ObjectWrapper(testObject2);

            Assert.IsFalse(objectWrapper1.Equals(objectWrapper3));
            Assert.IsFalse(objectWrapper1.Equals((object)objectWrapper3));
        }
        public void ObjectWrapperGetPropertyValue_NonPublic()
        {
            var publicTestObject = new PublicValueTypeTestClass();

            var objectWrapper = new ObjectWrapper(publicTestObject);

            Assert.IsNull(objectWrapper.GetPropertyValue(nameof(PublicValueTypeTestClass.InternalPropertyGetSet)));
            Assert.IsNull(objectWrapper.GetPropertyValue("ProtectedPropertyGetSet"));
            Assert.IsNull(objectWrapper.GetPropertyValue("PrivatePropertyGetSet"));


            var internalTestObject = new InternalValueTypeTestClass();

            objectWrapper = new ObjectWrapper(internalTestObject);
            Assert.IsNull(objectWrapper.GetPropertyValue(nameof(InternalValueTypeTestClass.InternalPropertyGetSet)));
            Assert.IsNull(objectWrapper.GetPropertyValue("ProtectedPropertyGetSet"));
            Assert.IsNull(objectWrapper.GetPropertyValue("PrivatePropertyGetSet"));
        }
        public void ObjectWrapperSetFieldValue_Class()
        {
            var testObject = new PublicValueTypeTestClass();

            var objectWrapper = new ObjectWrapper(testObject);

            objectWrapper.SetFieldValue(nameof(PublicValueTypeTestClass._publicField), 12);
            Assert.AreEqual(12, testObject._publicField);

            // Object wrapper does not provide access to not public members
            objectWrapper.SetFieldValue(nameof(PublicValueTypeTestClass._internalField), 24);
            Assert.AreEqual(0, testObject._internalField);

            objectWrapper.SetFieldValue("_protectedField", 48);
            Assert.AreEqual(0, testObject.GetProtectedFieldValue());

            objectWrapper.SetFieldValue("_privateField", 962);
            Assert.AreEqual(0, testObject.GetPrivateFieldValue());
        }
        public void ImmediateFieldSetValue_ValueType()
        {
            // Value type / Public
            var publicValueTypeTestObject = new PublicValueTypeTestClass();

            var immediateField = new ImmediateField(PublicValueTypePublicFieldFieldsInfo);

            immediateField.SetValue(publicValueTypeTestObject, 12);
            Assert.AreEqual(12, publicValueTypeTestObject._publicField);

            immediateField = new ImmediateField(PublicValueTypeInternalFieldFieldsInfo);
            immediateField.SetValue(publicValueTypeTestObject, 24);
            Assert.AreEqual(24, publicValueTypeTestObject._internalField);

            immediateField = new ImmediateField(PublicValueTypeProtectedFieldFieldsInfo);
            immediateField.SetValue(publicValueTypeTestObject, 48);
            Assert.AreEqual(48, publicValueTypeTestObject.GetProtectedFieldValue());

            immediateField = new ImmediateField(PublicValueTypePrivateFieldFieldsInfo);
            immediateField.SetValue(publicValueTypeTestObject, 96);
            Assert.AreEqual(96, publicValueTypeTestObject.GetPrivateFieldValue());

            // Value type / Internal
            var internalValueTypeTestObject = new InternalValueTypeTestClass();

            immediateField = new ImmediateField(InternalValueTypePublicFieldFieldsInfo);
            immediateField.SetValue(internalValueTypeTestObject, 192);
            Assert.AreEqual(192, internalValueTypeTestObject._publicField);

            immediateField = new ImmediateField(InternalValueTypeInternalFieldFieldsInfo);
            immediateField.SetValue(internalValueTypeTestObject, 384);
            Assert.AreEqual(384, internalValueTypeTestObject._internalField);

            immediateField = new ImmediateField(InternalValueTypeProtectedFieldFieldsInfo);
            immediateField.SetValue(internalValueTypeTestObject, 728);
            Assert.AreEqual(728, internalValueTypeTestObject.GetProtectedFieldValue());

            immediateField = new ImmediateField(InternalValueTypePrivateFieldFieldsInfo);
            immediateField.SetValue(internalValueTypeTestObject, 1536);
            Assert.AreEqual(1536, internalValueTypeTestObject.GetPrivateFieldValue());
        }
        public void GetImmediateTypeFromObject()
        {
            object        testObject1   = new PublicValueTypeTestClass();
            ImmediateType immediateType = ImmediateReflectionExtensions.GetImmediateType(testObject1);

            Assert.AreEqual(typeof(PublicValueTypeTestClass), immediateType.Type);

            PublicValueTypeTestClass testObject2 = new PublicValueTypeTestClass();

            immediateType = ImmediateReflectionExtensions.GetImmediateType(testObject2);
            Assert.AreEqual(typeof(PublicValueTypeTestClass), immediateType.Type);

            TestStruct testObject3 = new TestStruct();

            immediateType = ImmediateReflectionExtensions.GetImmediateType(testObject3);
            Assert.AreEqual(typeof(TestStruct), immediateType.Type);

            int testObject4 = 12;

            immediateType = ImmediateReflectionExtensions.GetImmediateType(testObject4);
            Assert.AreEqual(typeof(int), immediateType.Type);
        }
        public void ObjectWrapperInfo()
        {
            var testObject = new PublicValueTypeTestClass();

            TypeClassifiedMembers classifiedMembers = TypeClassifiedMembers.GetForPublicValueTypeTestObject();

            var objectWrapper = new ObjectWrapper(testObject);

            Assert.AreSame(testObject, objectWrapper.Object);
            Assert.AreEqual(typeof(PublicValueTypeTestClass), objectWrapper.Type);
            Assert.AreEqual(
                new ImmediateType(typeof(PublicValueTypeTestClass)),
                objectWrapper.ImmediateType);
            CollectionAssert.AreEquivalent(
                classifiedMembers.AllPublicMembers.Select(member => member.Name),
                objectWrapper.Members.Select(field => field.Name));
            CollectionAssert.AreEquivalent(
                classifiedMembers.PublicInstanceFields.Concat(classifiedMembers.StaticFields).Concat(classifiedMembers.ConstFields),
                objectWrapper.Fields.Select(field => field.FieldInfo));
            CollectionAssert.AreEquivalent(
                classifiedMembers.PublicInstanceProperties.Concat(classifiedMembers.StaticProperties),
                objectWrapper.Properties.Select(property => property.PropertyInfo));
        }
        public void ObjectWrapperHashCode()
        {
            var testObject  = new PublicValueTypeTestClass();
            var testObject2 = new PublicValueTypeTestClass();
            var testObject3 = new PublicValueTypeTestClass {
                PublicPropertyGetSet = 25
            };

            var objectWrapper1 = new ObjectWrapper(testObject);
            var objectWrapper2 = new ObjectWrapper(testObject);

            Assert.AreEqual(testObject.GetHashCode(), objectWrapper1.GetHashCode());
            Assert.AreEqual(objectWrapper1.GetHashCode(), objectWrapper2.GetHashCode());

            var objectWrapper3 = new ObjectWrapper(testObject2);

            Assert.AreEqual(testObject2.GetHashCode(), objectWrapper3.GetHashCode());
            Assert.AreNotEqual(objectWrapper1.GetHashCode(), objectWrapper3.GetHashCode());

            var objectWrapper4 = new ObjectWrapper(testObject3);

            Assert.AreNotEqual(objectWrapper1.GetHashCode(), objectWrapper4.GetHashCode());
        }
        public void ObjectWrapperGetMember()
        {
            var    testObject    = new PublicValueTypeTestClass();
            var    objectWrapper = new ObjectWrapper(testObject);
            string memberName    = nameof(PublicValueTypeTestClass._publicField);

            Assert.AreEqual(objectWrapper.Fields[memberName], objectWrapper.GetMember(memberName));
            Assert.AreEqual(objectWrapper.Fields[memberName], objectWrapper[memberName]);

            memberName = nameof(PublicValueTypeTestClass.PublicPropertyGet);
            Assert.AreEqual(objectWrapper.Properties[memberName], objectWrapper.GetMember(memberName));
            Assert.AreEqual(objectWrapper.Properties[memberName], objectWrapper[memberName]);

            memberName = "NotExists";
            Assert.IsNull(objectWrapper.GetMember(memberName));
            Assert.IsNull(objectWrapper[memberName]);

            // ReSharper disable AssignNullToNotNullAttribute
            // ReSharper disable once ReturnValueOfPureMethodIsNotUsed
            Assert.Throws <ArgumentNullException>(() => objectWrapper.GetMember(null));
            // ReSharper disable once UnusedVariable
            Assert.Throws <ArgumentNullException>(() => { ImmediateMember member = objectWrapper[null]; });
            // ReSharper restore AssignNullToNotNullAttribute
        }