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 ImmediateFieldGetValue_EnumThrows()
        {
            var immediateField = new ImmediateField(TestEnumFieldValueFieldInfo);

            // ReSharper disable once ReturnValueOfPureMethodIsNotUsed
            Assert.Throws <TargetException>(() => immediateField.GetValue(null));
        }
        public void ImmediateFieldGetValue_Enum()
        {
            // Simple TestEnum
            const TestEnum testEnum1 = TestEnum.EnumValue2;

            var immediateField = new ImmediateField(TestEnumFieldValueFieldInfo);

            Assert.AreEqual((int)TestEnum.EnumValue2, immediateField.GetValue(testEnum1));

            immediateField = new ImmediateField(TestEnumField2FieldInfo);
            Assert.AreEqual(TestEnum.EnumValue2, immediateField.GetValue(null));

            // TestEnum (inherit ulong)
            const TestEnumULong testEnum2 = TestEnumULong.EnumValue1;

            immediateField = new ImmediateField(TestEnumULongFieldValueFieldInfo);
            Assert.AreEqual((ulong)TestEnumULong.EnumValue1, immediateField.GetValue(testEnum2));

            immediateField = new ImmediateField(TestEnumULongField1FieldInfo);
            Assert.AreEqual(TestEnumULong.EnumValue1, immediateField.GetValue(null));

            // TestEnumFlags
            const TestEnumFlags testEnum3 = TestEnumFlags.EnumValue1 | TestEnumFlags.EnumValue2;

            immediateField = new ImmediateField(TestEnumFlagsFieldValueFieldInfo);
            Assert.AreEqual((int)(TestEnumFlags.EnumValue1 | TestEnumFlags.EnumValue2), immediateField.GetValue(testEnum3));

            immediateField = new ImmediateField(TestEnumFlagsField3FieldInfo);
            Assert.AreEqual(TestEnumFlags.EnumValue3, immediateField.GetValue(null));
        }
        public void ImmediateFieldGetValue_NullInstance()
        {
            var immediateField = new ImmediateField(PublicValueTypePublicFieldFieldsInfo);

            // ReSharper disable once AssignNullToNotNullAttribute
            // ReSharper disable once ReturnValueOfPureMethodIsNotUsed
            Assert.Throws <TargetException>(() => immediateField.GetValue(null));
        }
        public void ImmediateFieldGetValue_Static()
        {
            var testObject1 = new TestObject {
                TestValue = 1
            };
            var testObject2 = new TestObject {
                TestValue = 2
            };

            // Value type
            PublicValueTypeTestClass._publicStaticField = 12;
            var immediateField = new ImmediateField(PublicValueTypeStaticPublicFieldFieldsInfo);

            Assert.AreEqual(12, immediateField.GetValue(null));

            InternalValueTypeTestClass._publicStaticField = 24;
            immediateField = new ImmediateField(InternalValueTypeStaticPublicFieldFieldsInfo);
            Assert.AreEqual(24, immediateField.GetValue(null));

            // Reference type
            PublicReferenceTypeTestClass._publicStaticField = testObject1;
            immediateField = new ImmediateField(PublicReferenceTypeStaticPublicFieldFieldsInfo);
            Assert.AreSame(testObject1, immediateField.GetValue(null));

            InternalReferenceTypeTestClass._publicStaticField = testObject2;
            immediateField = new ImmediateField(InternalReferenceTypeStaticPublicFieldFieldsInfo);
            Assert.AreSame(testObject2, immediateField.GetValue(null));

            // Object type
            PublicObjectTypeTestClass._publicStaticField = 48;
            immediateField = new ImmediateField(PublicObjectTypeStaticPublicFieldFieldsInfo);
            Assert.AreEqual(48, immediateField.GetValue(null));

            InternalObjectTypeTestClass._publicStaticField = 96;
            immediateField = new ImmediateField(InternalObjectTypeStaticPublicFieldFieldsInfo);
            Assert.AreEqual(96, immediateField.GetValue(null));

            PublicObjectTypeTestClass._publicStaticField = testObject1;
            immediateField = new ImmediateField(PublicObjectTypeStaticPublicFieldFieldsInfo);
            Assert.AreEqual(testObject1, immediateField.GetValue(null));

            InternalObjectTypeTestClass._publicStaticField = testObject2;
            immediateField = new ImmediateField(InternalObjectTypeStaticPublicFieldFieldsInfo);
            Assert.AreEqual(testObject2, immediateField.GetValue(null));
        }
        public void ImmediateFieldGetValue([NotNull] object target, [NotNull] FieldInfo field, [CanBeNull] object expectedValue)
        {
            var immediateField = new ImmediateField(field);

            object gotValue = immediateField.GetValue(target);

            if (expectedValue is null)
            {
                Assert.IsNull(gotValue);
            }
            else if (expectedValue.GetType().IsValueType)
            {
                Assert.AreEqual(expectedValue, gotValue);
            }
            else
            {
                Assert.AreSame(expectedValue, gotValue);
            }
        }
 public int GetImmediateField_Field()
 {
     return((int)ImmediateField.GetValue(BenchmarkObject));
 }
 public string GetImmediateField_Field()
 {
     return($"{(int)ImmediateField.GetValue(BenchmarkObject)}{(float)ImmediateField2.GetValue(BenchmarkObject2)}{(string)ImmediateField3.GetValue(BenchmarkObject3)}{(uint)ImmediateField4.GetValue(BenchmarkObject4)}");
 }