public void PropertiesBasic()
        {
            var propertiesType = this._assembly.GetType("AssemblyToProcess.Basic.Properties");
            var propertiesInstance = (dynamic) Activator.CreateInstance(propertiesType);

            PropertyExtensions.SetPrivatePropertyValue(
                propertiesInstance, "BackedProperty", 1.23);
            PropertyExtensions.SetPrivatePropertyValue(
                propertiesInstance, "PrivateProperty", 123);
            propertiesType.GetProperty("PublicProperty").SetValue(propertiesInstance, "I'm public.");

            // Hand copy.
            var hCopy = propertiesInstance.HCopy();
            var hGetter = new ObjectGetter(propertiesType, hCopy);

            Assert.Equal(1.23, hGetter.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(123, hGetter.PrivatePropertyValue("PrivateProperty"));
            Assert.Equal("I'm public.", hGetter.PropertyValue("PublicProperty"));

            // Deep copy.
            var dCopy = propertiesInstance.DeepCopy();
            var dGetter = new ObjectGetter(propertiesType, dCopy);

            Assert.Equal(1.23, dGetter.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(123, dGetter.PrivatePropertyValue("PrivateProperty"));
            Assert.Equal("I'm public.", dGetter.PropertyValue("PublicProperty"));
        }
Beispiel #2
0
        public void PropertiesBasic()
        {
            var propertiesType     = this._assembly.GetType("AssemblyToProcess.Basic.Properties");
            var propertiesInstance = (dynamic)Activator.CreateInstance(propertiesType);

            PropertyExtensions.SetPrivatePropertyValue(
                propertiesInstance, "BackedProperty", 1.23);
            PropertyExtensions.SetPrivatePropertyValue(
                propertiesInstance, "PrivateProperty", 123);
            propertiesType.GetProperty("PublicProperty").SetValue(propertiesInstance, "I'm public.");

            // Hand copy.
            var hCopy   = propertiesInstance.HCopy();
            var hGetter = new ObjectGetter(propertiesType, hCopy);

            Assert.Equal(1.23, hGetter.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(123, hGetter.PrivatePropertyValue("PrivateProperty"));
            Assert.Equal("I'm public.", hGetter.PropertyValue("PublicProperty"));

            // Deep copy.
            var dCopy   = propertiesInstance.DeepCopy();
            var dGetter = new ObjectGetter(propertiesType, dCopy);

            Assert.Equal(1.23, dGetter.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(123, dGetter.PrivatePropertyValue("PrivateProperty"));
            Assert.Equal("I'm public.", dGetter.PropertyValue("PublicProperty"));
        }
Beispiel #3
0
 /// we cannot have a reference to System.Web for Session here, so we use a delegate
 public static void SetFunctionForRetrievingCurrentObjectFromWebSession(
     ObjectSetter setter,
     ObjectGetter getter)
 {
     ObjDelegateSet = setter;
     ObjDelegateGet = getter;
 }
Beispiel #4
0
 /// we cannot have a reference to System.Web for Session here, so we use a delegate
 public static void SetFunctionForRetrievingCurrentObjectFromWebSession(
     ObjectSetter setter,
     ObjectGetter getter)
 {
     ObjDelegateSet = setter;
     ObjDelegateGet = getter;
 }
Beispiel #5
0
        public T Get(string id)
        {
            var obj = (T)Cache.Get(id);

            if (obj == null)
            {
                obj = ObjectGetter.Get(id);
                Cache.Set(id, obj, DateTimeOffset.Now.AddHours(ExpirationInHours));
            }
            return(obj);
        }
        public void GetObjects()
        {
            var dbContext = new DesignTimeDbContextFactory().CreateDbContext(null);

            var repo = new GenericRepository <int, OfferedObject>(dbContext);

            repo.Add(new OfferedObject
            {
                CurrentTransactionType = TransactionType.Free,

                PublishedAt = DateTime.UtcNow,
                Photos      = new System.Collections.Generic.List <ObjectPhoto> {
                    new ObjectPhoto {
                        AddedAtUtc = DateTime.UtcNow
                    }
                },
            });

            repo.SaveChanges();



            var impression        = new Mock <IObjectImpressionsManager>();
            var objectQueryHelper = new ObjectQueryHelper();
            var userDataManager   = new Mock <IUserDataManager>();

            userDataManager.Setup(u => u.AddCurrentUserIfNeeded()).ReturnsAsync((new Login
            {
                LoginLocation = new Point(10, 1)
            }, null as User));
            var configs = new Mock <IConfiguration>();

            configs.Setup(c => c["Settings:IncludeObjectLessThan"]).Returns("500");

            var photoConstructor = new Mock <Infrastructure.IPhotoUrlConstructor>();

            photoConstructor.Setup(p => p.Construct(It.IsAny <ObjectPhoto>())).Returns("Hello there");
            var objectGetter = new ObjectGetter(repo, photoConstructor.Object, impression.Object, objectQueryHelper, null, configs.Object, userDataManager.Object);


            var objects = objectGetter.GetObjects(new PagingArguments
            {
                Size        = 10,
                StartObject = 0
            });

            Assert.True(true);
        }
        public void FieldsBasic()
        {
            var fieldsType     = this._assembly.GetType("AssemblyToProcess.Basic.Fields");
            var fieldsInstance = (dynamic)Activator.CreateInstance(fieldsType);

            PropertyExtensions.SetPrivateFieldValue(fieldsInstance, "_privateField", "I'm private.");
            fieldsType.GetField("PublicField").SetValue(fieldsInstance, 123);

            // Hand copy.
            var hCopy   = fieldsInstance.HCopy();
            var hGetter = new ObjectGetter(fieldsType, hCopy);

            Assert.Equal("I'm private.", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(123, hGetter.FieldValue("PublicField"));

            // Deep copy.
            var dCopy   = fieldsInstance.DeepCopy();
            var dGetter = new ObjectGetter(fieldsType, dCopy);

            Assert.Equal("I'm private.", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(123, dGetter.FieldValue("PublicField"));
        }
        public void FluentGetterTest()
        {
            var type = typeof(NiceAct);
            var act  = new NiceAct()
            {
                Name     = "Hu",
                Age      = 22,
                Country  = Country.China,
                Birthday = DateTime.Today
            };

            var d = new Dictionary <string, object>();

            d["Name"]     = "Ax";
            d["Age"]      = 10086;
            d["Country"]  = Country.China;
            d["Birthday"] = DateTime.Today.AddDays(10);
            d["IsValid"]  = true;

            var g1 = ObjectGetter.Type(type).Instance(act);
            var g2 = ObjectGetter.Type(type).InitialValues(d);
            var g3 = ObjectGetter.Type <NiceAct>().Instance(act);
            var g4 = ObjectGetter.Type <NiceAct>().InitialValues(d);

            var g5 = ObjectGetter.Type(type).Value("Name");
            var g6 = ObjectGetter.Type <NiceAct>().Value("Name");
            var g7 = ObjectGetter.Type <NiceAct>().Value(t => t.Name);
            var g8 = ObjectGetter.Type <NiceAct>().Value <string>(t => t.Name);

            Assert.Equal("Hu", g1.GetValue <string>("Name"));
            Assert.Equal("Ax", g2.GetValue <string>("Name"));
            Assert.Equal("Hu", g3.GetValue <string>("Name"));
            Assert.Equal("Ax", g4.GetValue <string>("Name"));

            Assert.Equal("Hu", g5.Instance(act).Value);
            Assert.Equal("Hu", g6.Instance(act).Value);
            Assert.Equal("Hu", g7.Instance(act).Value);
            Assert.Equal("Hu", g8.Instance(act).Value);
        }
        public void FieldsBasic()
        {
            var fieldsType = this._assembly.GetType("AssemblyToProcess.Basic.Fields");
            var fieldsInstance = (dynamic) Activator.CreateInstance(fieldsType);

            PropertyExtensions.SetPrivateFieldValue(fieldsInstance, "_privateField", "I'm private.");
            fieldsType.GetField("PublicField").SetValue(fieldsInstance, 123);

            // Hand copy.
            var hCopy = fieldsInstance.HCopy();
            var hGetter = new ObjectGetter(fieldsType, hCopy);

            Assert.Equal("I'm private.", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(123, hGetter.FieldValue("PublicField"));

            // Deep copy.
            var dCopy = fieldsInstance.DeepCopy();
            var dGetter = new ObjectGetter(fieldsType, dCopy);

            Assert.Equal("I'm private.", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(123, dGetter.FieldValue("PublicField"));
        }
Beispiel #10
0
        public void ObjectInheritanceTest()
        {
            var inheritsAbstractType     = this._assembly.GetType("AssemblyToProcess.Abstracts.InheritsAbstract");
            var inheritsAbstractInstance = (dynamic)Activator.CreateInstance(inheritsAbstractType);

            inheritsAbstractType.GetField("MainObject").SetValue(inheritsAbstractInstance, "main obj");
            inheritsAbstractType.GetProperty("InterfaceProperty").SetValue(inheritsAbstractInstance, 123);

            // Hand copy.
            var hCopy = inheritsAbstractInstance.HCopy();

            var hGet = new ObjectGetter(inheritsAbstractType, hCopy);

            Assert.Equal("main obj", hGet.FieldValue("MainObject"));
            Assert.Equal(123, hGet.PropertyValue("InterfaceProperty"));

            // Deep copy.
            var dCopy = inheritsAbstractInstance.DeepCopy();

            var dGet = new ObjectGetter(inheritsAbstractType, dCopy);

            Assert.Equal("main obj", dGet.FieldValue("MainObject"));
            Assert.Equal(123, dGet.PropertyValue("InterfaceProperty"));
        }
        public void ObjectInheritanceTest()
        {
            var inheritsAbstractType = this._assembly.GetType("AssemblyToProcess.Abstracts.InheritsAbstract");
            var inheritsAbstractInstance = (dynamic) Activator.CreateInstance(inheritsAbstractType);

            inheritsAbstractType.GetField("MainObject").SetValue(inheritsAbstractInstance, "main obj");
            inheritsAbstractType.GetProperty("InterfaceProperty").SetValue(inheritsAbstractInstance, 123);

            // Hand copy.
            var hCopy = inheritsAbstractInstance.HCopy();

            var hGet = new ObjectGetter(inheritsAbstractType, hCopy);

            Assert.Equal("main obj", hGet.FieldValue("MainObject"));
            Assert.Equal(123, hGet.PropertyValue("InterfaceProperty"));

            // Deep copy.
            var dCopy = inheritsAbstractInstance.DeepCopy();

            var dGet = new ObjectGetter(inheritsAbstractType, dCopy);

            Assert.Equal("main obj", dGet.FieldValue("MainObject"));
            Assert.Equal(123, dGet.PropertyValue("InterfaceProperty"));
        }
        public void ObjectDictionaryTest()
        {
            var fieldsType = this._assembly.GetType("AssemblyToProcess.Basic.Fields");

            dynamic fieldInstanceOne = this.GetFieldInstance("first", 1);
            dynamic fieldInstanceTwo = this.GetFieldInstance("second", 2);
            dynamic fieldInstanceThree = this.GetFieldInstance("third", 3);

            var dictionaryType = Assembly.GetAssembly(typeof (Dictionary<Fields, Fields>))
                .GetType("System.Collections.Generic.Dictionary`2");

            var dictionaryInstance = (dynamic) Activator
                .CreateInstance(dictionaryType.MakeGenericType(fieldsType, fieldsType));
            dynamic dictionaryAdd = dictionaryInstance.GetType().GetMethod("Add");
            dictionaryAdd.Invoke(dictionaryInstance, new[] {fieldInstanceOne, fieldInstanceOne});
            dictionaryAdd.Invoke(dictionaryInstance, new[] {fieldInstanceTwo, fieldInstanceTwo});
            dictionaryAdd.Invoke(dictionaryInstance, new[] {fieldInstanceThree, null});

            var hasDictionaryType = this._assembly.GetType("AssemblyToProcess.Enumerables.HasDictionary");
            var hasDictionaryInstance = (dynamic) Activator.CreateInstance(hasDictionaryType);
            hasDictionaryType.GetField("DictionaryOfObjects").SetValue(hasDictionaryInstance, dictionaryInstance);

            // Hand copy.
            var hCopy = hasDictionaryInstance.HCopy();

            foreach (var item in hCopy.DictionaryOfObjects)
            {
                ObjectGetter hGetter = new ObjectGetter(fieldsType, item.Value);
                if (1 == item.Key.PublicField)
                {
                    Assert.Equal("first", hGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(1, hGetter.FieldValue("PublicField"));
                }
                else if (2 == item.Key.PublicField)
                {
                    Assert.Equal("second", hGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(2, hGetter.FieldValue("PublicField"));
                }
                else
                {
                    // Are nulls handled properly?
                    Assert.Equal(null, (Fields) item.Value);
                }
            }

            // Deep copy.
            dynamic dCopy = hasDictionaryInstance.DeepCopy();

            foreach (var item in dCopy.DictionaryOfObjects)
            {
                ObjectGetter dGetter = new ObjectGetter(fieldsType, item.Value);
                if (1 == item.Key.PublicField)
                {
                    Assert.Equal("first", dGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(1, dGetter.FieldValue("PublicField"));
                }
                else if (2 == item.Key.PublicField)
                {
                    Assert.Equal("second", dGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(2, dGetter.FieldValue("PublicField"));
                }
                else
                {
                    // Are nulls handled properly?
                    Assert.Equal(null, (Fields) item.Value);
                }
            }

            // Bad copy.
            dynamic bCopy = hasDictionaryInstance.BCopy();

            foreach (var item in bCopy.DictionaryOfObjects)
            {
                ObjectGetter bGetter = new ObjectGetter(fieldsType, item.Value);
                if (1 == item.Key.PublicField)
                {
                    Assert.Equal("first", bGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(1, bGetter.FieldValue("PublicField"));
                }
                else if (2 == item.Key.PublicField)
                {
                    Assert.Equal("second", bGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(2, bGetter.FieldValue("PublicField"));
                }
                else
                {
                    // Are nulls handled properly?
                    Assert.Equal(null, (Fields) item.Value);
                }
            }

            // Modify.
            dynamic dictionaryClear = dictionaryInstance.GetType().GetMethod("Clear");
            dictionaryClear.Invoke(dictionaryInstance, new dynamic[0]);
            dictionaryAdd.Invoke(dictionaryInstance, new[] {fieldInstanceTwo, fieldInstanceOne});
            dictionaryAdd.Invoke(dictionaryInstance, new[] {fieldInstanceThree, null});

            // Hand copy.
            foreach (var item in hCopy.DictionaryOfObjects)
            {
                ObjectGetter hGetter = new ObjectGetter(fieldsType, item.Value);
                if (1 == item.Key.PublicField)
                {
                    Assert.Equal("first", hGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(1, hGetter.FieldValue("PublicField"));
                }
                else if (2 == item.Key.PublicField)
                {
                    Assert.Equal("second", hGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(2, hGetter.FieldValue("PublicField"));
                }
                else
                {
                    // Are nulls handled properly?
                    Assert.Equal(null, (Fields) item.Value);
                }
            }

            // Deep copy.
            foreach (var item in dCopy.DictionaryOfObjects)
            {
                ObjectGetter dGetter = new ObjectGetter(fieldsType, item.Value);
                if (1 == item.Key.PublicField)
                {
                    Assert.Equal("first", dGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(1, dGetter.FieldValue("PublicField"));
                }
                else if (2 == item.Key.PublicField)
                {
                    Assert.Equal("second", dGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(2, dGetter.FieldValue("PublicField"));
                }
                else
                {
                    // Are nulls handled properly?
                    Assert.Equal(null, (Fields) item.Value);
                }
            }

            // Bad copy.
            foreach (var item in bCopy.DictionaryOfObjects)
            {
                ObjectGetter bGetter = new ObjectGetter(fieldsType, item.Value);
                if (2 == item.Key.PublicField)
                {
                    Assert.Equal("first", bGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(1, bGetter.FieldValue("PublicField"));
                }
                else
                {
                    // Are nulls handled properly?
                    Assert.Equal(null, (Fields) item.Value);
                }
            }
        }
Beispiel #13
0
        public void Tests()
        {
            var propT = this._assembly.GetType("AssemblyToProcess.Basic.Properties");
            var propI = (dynamic)Activator.CreateInstance(propT);

            PropertyExtensions.SetPrivatePropertyValue(propI, "BackedProperty", 1.23);
            PropertyExtensions.SetPrivatePropertyValue(propI, "PrivateProperty", 123);
            propT.GetProperty("PublicProperty").SetValue(propI, "I'm public.");

            var typicalIT = this._assembly.GetType("AssemblyToProcess.Inherits.TypicalInheritance");
            var typicalII = (dynamic)Activator.CreateInstance(typicalIT);

            typicalIT.GetField("Properties").SetValue(typicalII, propI);

            // Hand copy.
            var hCopy = typicalII.HCopy();
            var hGet  = new ObjectGetter(typicalIT, hCopy);

            var fValue = hGet.FieldValue("Properties");

            hGet = new ObjectGetter(propT, fValue);

            Assert.Equal(1.23, hGet.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(0, hGet.PrivatePropertyValue("PrivateProperty")); // Won't copy since it's private.
            Assert.Equal("I'm public.", hGet.PropertyValue("PublicProperty"));

            // Deep copy.
            var dCopy = typicalII.DeepCopy();
            var dGet  = new ObjectGetter(typicalIT, dCopy);

            fValue = dGet.FieldValue("Properties");
            dGet   = new ObjectGetter(propT, fValue);

            Assert.Equal(1.23, dGet.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(123, dGet.PrivatePropertyValue("PrivateProperty"));
            Assert.Equal("I'm public.", dGet.PropertyValue("PublicProperty"));

            // Bad copy.
            var bCopy = typicalII.BCopy();
            var bGet  = new ObjectGetter(typicalIT, bCopy);

            fValue = bGet.FieldValue("Properties");
            bGet   = new ObjectGetter(propT, fValue);

            Assert.Equal(1.23, bGet.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(123, bGet.PrivatePropertyValue("PrivateProperty"));
            Assert.Equal("I'm public.", bGet.PropertyValue("PublicProperty"));

            // Modify.
            PropertyExtensions.SetPrivatePropertyValue(propI, "BackedProperty", 2.34);
            PropertyExtensions.SetPrivatePropertyValue(propI, "PrivateProperty", 234);
            propT.GetProperty("PublicProperty").SetValue(propI, "I'm changed!");
            typicalIT.GetField("Properties").SetValue(typicalII, propI);

            // Hand copy.
            hGet = new ObjectGetter(typicalIT, hCopy);

            fValue = hGet.FieldValue("Properties");
            hGet   = new ObjectGetter(propT, fValue);

            Assert.Equal(1.23, hGet.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(0, hGet.PrivatePropertyValue("PrivateProperty")); // Won't copy since it's private.
            Assert.Equal("I'm public.", hGet.PropertyValue("PublicProperty"));

            // Deep copy.
            dGet = new ObjectGetter(typicalIT, dCopy);

            fValue = dGet.FieldValue("Properties");
            dGet   = new ObjectGetter(propT, fValue);

            Assert.Equal(1.23, dGet.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(123, dGet.PrivatePropertyValue("PrivateProperty"));
            Assert.Equal("I'm public.", dGet.PropertyValue("PublicProperty"));

            // Bad copy.
            bGet = new ObjectGetter(typicalIT, bCopy);

            fValue = bGet.FieldValue("Properties");
            bGet   = new ObjectGetter(propT, fValue);

            Assert.Equal(2.34, bGet.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(234, bGet.PrivatePropertyValue("PrivateProperty"));
            Assert.Equal("I'm changed!", bGet.PropertyValue("PublicProperty"));
        }
        public void ObjectListTest()
        {
            var fieldsType = this._assembly.GetType("AssemblyToProcess.Basic.Fields");

            dynamic fieldInstanceOne = this.GetFieldInstance("first", 1);
            dynamic fieldInstanceTwo = this.GetFieldInstance("second", 2);

            var listType = Assembly.GetAssembly(typeof (List<>))
                .GetType("System.Collections.Generic.List`1");

            var listInstance = (dynamic) Activator.CreateInstance(listType.MakeGenericType(fieldsType));
            dynamic listAdd = listInstance.GetType().GetMethod("Add");
            listAdd.Invoke(listInstance, new[] {fieldInstanceOne});
            listAdd.Invoke(listInstance, new[] {fieldInstanceTwo});
            listAdd.Invoke(listInstance, new dynamic[] {null});

            var hasListType = this._assembly.GetType("AssemblyToProcess.Enumerables.HasList");
            var hasListInstance = (dynamic) Activator.CreateInstance(hasListType);
            hasListType.GetField("ListOfObjects").SetValue(hasListInstance, listInstance);

            // Hand copy.
            var hCopy = hasListInstance.HCopy();

            var hGetter = new ObjectGetter(fieldsType, hCopy.ListOfObjects[0]);
            Assert.Equal("first", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, hGetter.FieldValue("PublicField"));

            hGetter = new ObjectGetter(fieldsType, hCopy.ListOfObjects[1]);
            Assert.Equal("second", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, hGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields) hCopy.ListOfObjects[2]);

            // Deep copy.
            var dCopy = hasListInstance.DeepCopy();

            var dGetter = new ObjectGetter(fieldsType, dCopy.ListOfObjects[0]);
            Assert.Equal("first", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, dGetter.FieldValue("PublicField"));

            dGetter = new ObjectGetter(fieldsType, dCopy.ListOfObjects[1]);
            Assert.Equal("second", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, dGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields) dCopy.ListOfObjects[2]);

            // Bad copy.
            var bCopy = hasListInstance.BCopy();

            var bGetter = new ObjectGetter(fieldsType, bCopy.ListOfObjects[0]);
            Assert.Equal("first", bGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, bGetter.FieldValue("PublicField"));

            bGetter = new ObjectGetter(fieldsType, bCopy.ListOfObjects[1]);
            Assert.Equal("second", bGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, bGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields) bCopy.ListOfObjects[2]);

            // Modify.
            dynamic listClear = listInstance.GetType().GetMethod("Clear");
            listClear.Invoke(listInstance, new dynamic[0]);
            listAdd.Invoke(listInstance, new[] {fieldInstanceTwo});
            listAdd.Invoke(listInstance, new dynamic[] {null});

            // Hand copy.
            hGetter = new ObjectGetter(fieldsType, hCopy.ListOfObjects[0]);
            Assert.Equal("first", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, hGetter.FieldValue("PublicField"));

            hGetter = new ObjectGetter(fieldsType, hCopy.ListOfObjects[1]);
            Assert.Equal("second", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, hGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields) hCopy.ListOfObjects[2]);

            // Deep copy.
            dGetter = new ObjectGetter(fieldsType, dCopy.ListOfObjects[0]);
            Assert.Equal("first", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, dGetter.FieldValue("PublicField"));

            dGetter = new ObjectGetter(fieldsType, dCopy.ListOfObjects[1]);
            Assert.Equal("second", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, dGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields) dCopy.ListOfObjects[2]);

            // Bad copy.
            bGetter = new ObjectGetter(fieldsType, bCopy.ListOfObjects[0]);
            Assert.Equal("second", bGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, bGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields) bCopy.ListOfObjects[1]);
        }
        public void Tests()
        {
            var propT = this._assembly.GetType("AssemblyToProcess.Basic.Properties");
            var propI = (dynamic) Activator.CreateInstance(propT);

            PropertyExtensions.SetPrivatePropertyValue(propI, "BackedProperty", 1.23);
            PropertyExtensions.SetPrivatePropertyValue(propI, "PrivateProperty", 123);
            propT.GetProperty("PublicProperty").SetValue(propI, "I'm public.");

            var typicalIT = this._assembly.GetType("AssemblyToProcess.Inherits.TypicalInheritance");
            var typicalII = (dynamic) Activator.CreateInstance(typicalIT);

            typicalIT.GetField("Properties").SetValue(typicalII, propI);

            // Hand copy.
            var hCopy = typicalII.HCopy();
            var hGet = new ObjectGetter(typicalIT, hCopy);

            var fValue = hGet.FieldValue("Properties");
            hGet = new ObjectGetter(propT, fValue);

            Assert.Equal(1.23, hGet.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(0, hGet.PrivatePropertyValue("PrivateProperty")); // Won't copy since it's private.
            Assert.Equal("I'm public.", hGet.PropertyValue("PublicProperty"));

            // Deep copy.
            var dCopy = typicalII.DeepCopy();
            var dGet = new ObjectGetter(typicalIT, dCopy);

            fValue = dGet.FieldValue("Properties");
            dGet = new ObjectGetter(propT, fValue);

            Assert.Equal(1.23, dGet.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(123, dGet.PrivatePropertyValue("PrivateProperty"));
            Assert.Equal("I'm public.", dGet.PropertyValue("PublicProperty"));

            // Bad copy.
            var bCopy = typicalII.BCopy();
            var bGet = new ObjectGetter(typicalIT, bCopy);

            fValue = bGet.FieldValue("Properties");
            bGet = new ObjectGetter(propT, fValue);
 
            Assert.Equal(1.23, bGet.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(123, bGet.PrivatePropertyValue("PrivateProperty"));
            Assert.Equal("I'm public.", bGet.PropertyValue("PublicProperty"));
            
            // Modify.
            PropertyExtensions.SetPrivatePropertyValue(propI, "BackedProperty", 2.34);
            PropertyExtensions.SetPrivatePropertyValue(propI, "PrivateProperty", 234);
            propT.GetProperty("PublicProperty").SetValue(propI, "I'm changed!");
            typicalIT.GetField("Properties").SetValue(typicalII, propI);

            // Hand copy.
            hGet = new ObjectGetter(typicalIT, hCopy);

            fValue = hGet.FieldValue("Properties");
            hGet = new ObjectGetter(propT, fValue);

            Assert.Equal(1.23, hGet.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(0, hGet.PrivatePropertyValue("PrivateProperty")); // Won't copy since it's private.
            Assert.Equal("I'm public.", hGet.PropertyValue("PublicProperty"));

            // Deep copy.
            dGet = new ObjectGetter(typicalIT, dCopy);

            fValue = dGet.FieldValue("Properties");
            dGet = new ObjectGetter(propT, fValue);

            Assert.Equal(1.23, dGet.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(123, dGet.PrivatePropertyValue("PrivateProperty"));
            Assert.Equal("I'm public.", dGet.PropertyValue("PublicProperty"));

            // Bad copy.
            bGet = new ObjectGetter(typicalIT, bCopy);

            fValue = bGet.FieldValue("Properties");
            bGet = new ObjectGetter(propT, fValue);
 
            Assert.Equal(2.34, bGet.PrivatePropertyValue("BackedProperty"));
            Assert.Equal(234, bGet.PrivatePropertyValue("PrivateProperty"));
            Assert.Equal("I'm changed!", bGet.PropertyValue("PublicProperty"));
        }
        public void ArrayOfObjects()
        {
            var fieldsType = this._assembly.GetType("AssemblyToProcess.Basic.Fields");

            dynamic fieldInstanceOne = this.GetFieldInstance("first", 1);
            dynamic fieldInstanceTwo = this.GetFieldInstance("second", 2);

            dynamic fieldsArrayInstance = Array.CreateInstance(fieldsType, 3);
            fieldsArrayInstance.SetValue(fieldInstanceOne, 0);
            fieldsArrayInstance.SetValue(fieldInstanceTwo, 1);
            fieldsArrayInstance.SetValue(null, 2);

            var arrayOfObjectsType = this._assembly
                .GetType("AssemblyToProcess.Arrays.ArrayOfObjects");
            var arrayOfObjectsInstance = (dynamic) Activator.CreateInstance(arrayOfObjectsType);
            arrayOfObjectsType.GetField("FieldsArray").SetValue(arrayOfObjectsInstance, fieldsArrayInstance);

            // Hand copy.
            var hCopy = arrayOfObjectsInstance.HCopy();

            var hGetter = new ObjectGetter(fieldsType, hCopy.FieldsArray[0]);
            Assert.Equal("first", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, hGetter.FieldValue("PublicField"));

            hGetter = new ObjectGetter(fieldsType, hCopy.FieldsArray[1]);
            Assert.Equal("second", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, hGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)hCopy.FieldsArray[2]);

            // Deep copy.
            var dCopy = arrayOfObjectsInstance.DeepCopy();

            var dGetter = new ObjectGetter(fieldsType, dCopy.FieldsArray[0]);
            Assert.Equal("first", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, dGetter.FieldValue("PublicField"));

            dGetter = new ObjectGetter(fieldsType, dCopy.FieldsArray[1]);
            Assert.Equal("second", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, dGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)dCopy.FieldsArray[2]);
 
            // Bad copy.
            var bCopy = arrayOfObjectsInstance.BCopy();

            var bGetter = new ObjectGetter(fieldsType, bCopy.FieldsArray[0]);
            Assert.Equal("first", bGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, bGetter.FieldValue("PublicField"));

            bGetter = new ObjectGetter(fieldsType, bCopy.FieldsArray[1]);
            Assert.Equal("second", bGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, bGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)bCopy.FieldsArray[2]);

            // Modify.
            fieldInstanceOne = this.GetFieldInstance("third", 3);
            fieldInstanceTwo = this.GetFieldInstance("fourth", 4);
            fieldsArrayInstance.SetValue(fieldInstanceOne, 0);
            fieldsArrayInstance.SetValue(fieldInstanceTwo, 1);
            arrayOfObjectsType.GetField("FieldsArray").SetValue(arrayOfObjectsInstance, fieldsArrayInstance);

            // Hand copy (should stay the same).
            hGetter = new ObjectGetter(fieldsType, hCopy.FieldsArray[0]);
            Assert.Equal("first", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, hGetter.FieldValue("PublicField"));

            hGetter = new ObjectGetter(fieldsType, hCopy.FieldsArray[1]);
            Assert.Equal("second", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, hGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)hCopy.FieldsArray[2]);

            // Deep copy (should stay the same).
            dGetter = new ObjectGetter(fieldsType, dCopy.FieldsArray[0]);
            Assert.Equal("first", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, dGetter.FieldValue("PublicField"));

            dGetter = new ObjectGetter(fieldsType, dCopy.FieldsArray[1]);
            Assert.Equal("second", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, dGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)dCopy.FieldsArray[2]);
 
            // Bad copy (should be modified).
            bGetter = new ObjectGetter(fieldsType, bCopy.FieldsArray[0]);
            Assert.Equal("third", bGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(3, bGetter.FieldValue("PublicField"));

            bGetter = new ObjectGetter(fieldsType, bCopy.FieldsArray[1]);
            Assert.Equal("fourth", bGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(4, bGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)bCopy.FieldsArray[2]);
        }
        public void ObjectDictionaryTest()
        {
            var fieldsType = this._assembly.GetType("AssemblyToProcess.Basic.Fields");

            dynamic fieldInstanceOne   = this.GetFieldInstance("first", 1);
            dynamic fieldInstanceTwo   = this.GetFieldInstance("second", 2);
            dynamic fieldInstanceThree = this.GetFieldInstance("third", 3);

            var dictionaryType = Assembly.GetAssembly(typeof(Dictionary <Fields, Fields>))
                                 .GetType("System.Collections.Generic.Dictionary`2");

            var dictionaryInstance = (dynamic)Activator
                                     .CreateInstance(dictionaryType.MakeGenericType(fieldsType, fieldsType));
            dynamic dictionaryAdd = dictionaryInstance.GetType().GetMethod("Add");

            dictionaryAdd.Invoke(dictionaryInstance, new[] { fieldInstanceOne, fieldInstanceOne });
            dictionaryAdd.Invoke(dictionaryInstance, new[] { fieldInstanceTwo, fieldInstanceTwo });
            dictionaryAdd.Invoke(dictionaryInstance, new[] { fieldInstanceThree, null });

            var hasDictionaryType     = this._assembly.GetType("AssemblyToProcess.Enumerables.HasDictionary");
            var hasDictionaryInstance = (dynamic)Activator.CreateInstance(hasDictionaryType);

            hasDictionaryType.GetField("DictionaryOfObjects").SetValue(hasDictionaryInstance, dictionaryInstance);

            // Hand copy.
            var hCopy = hasDictionaryInstance.HCopy();

            foreach (var item in hCopy.DictionaryOfObjects)
            {
                ObjectGetter hGetter = new ObjectGetter(fieldsType, item.Value);
                if (1 == item.Key.PublicField)
                {
                    Assert.Equal("first", hGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(1, hGetter.FieldValue("PublicField"));
                }
                else if (2 == item.Key.PublicField)
                {
                    Assert.Equal("second", hGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(2, hGetter.FieldValue("PublicField"));
                }
                else
                {
                    // Are nulls handled properly?
                    Assert.Equal(null, (Fields)item.Value);
                }
            }

            // Deep copy.
            dynamic dCopy = hasDictionaryInstance.DeepCopy();

            foreach (var item in dCopy.DictionaryOfObjects)
            {
                ObjectGetter dGetter = new ObjectGetter(fieldsType, item.Value);
                if (1 == item.Key.PublicField)
                {
                    Assert.Equal("first", dGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(1, dGetter.FieldValue("PublicField"));
                }
                else if (2 == item.Key.PublicField)
                {
                    Assert.Equal("second", dGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(2, dGetter.FieldValue("PublicField"));
                }
                else
                {
                    // Are nulls handled properly?
                    Assert.Equal(null, (Fields)item.Value);
                }
            }

            // Bad copy.
            dynamic bCopy = hasDictionaryInstance.BCopy();

            foreach (var item in bCopy.DictionaryOfObjects)
            {
                ObjectGetter bGetter = new ObjectGetter(fieldsType, item.Value);
                if (1 == item.Key.PublicField)
                {
                    Assert.Equal("first", bGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(1, bGetter.FieldValue("PublicField"));
                }
                else if (2 == item.Key.PublicField)
                {
                    Assert.Equal("second", bGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(2, bGetter.FieldValue("PublicField"));
                }
                else
                {
                    // Are nulls handled properly?
                    Assert.Equal(null, (Fields)item.Value);
                }
            }

            // Modify.
            dynamic dictionaryClear = dictionaryInstance.GetType().GetMethod("Clear");

            dictionaryClear.Invoke(dictionaryInstance, new dynamic[0]);
            dictionaryAdd.Invoke(dictionaryInstance, new[] { fieldInstanceTwo, fieldInstanceOne });
            dictionaryAdd.Invoke(dictionaryInstance, new[] { fieldInstanceThree, null });

            // Hand copy.
            foreach (var item in hCopy.DictionaryOfObjects)
            {
                ObjectGetter hGetter = new ObjectGetter(fieldsType, item.Value);
                if (1 == item.Key.PublicField)
                {
                    Assert.Equal("first", hGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(1, hGetter.FieldValue("PublicField"));
                }
                else if (2 == item.Key.PublicField)
                {
                    Assert.Equal("second", hGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(2, hGetter.FieldValue("PublicField"));
                }
                else
                {
                    // Are nulls handled properly?
                    Assert.Equal(null, (Fields)item.Value);
                }
            }

            // Deep copy.
            foreach (var item in dCopy.DictionaryOfObjects)
            {
                ObjectGetter dGetter = new ObjectGetter(fieldsType, item.Value);
                if (1 == item.Key.PublicField)
                {
                    Assert.Equal("first", dGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(1, dGetter.FieldValue("PublicField"));
                }
                else if (2 == item.Key.PublicField)
                {
                    Assert.Equal("second", dGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(2, dGetter.FieldValue("PublicField"));
                }
                else
                {
                    // Are nulls handled properly?
                    Assert.Equal(null, (Fields)item.Value);
                }
            }

            // Bad copy.
            foreach (var item in bCopy.DictionaryOfObjects)
            {
                ObjectGetter bGetter = new ObjectGetter(fieldsType, item.Value);
                if (2 == item.Key.PublicField)
                {
                    Assert.Equal("first", bGetter.PrivateFieldValue("_privateField"));
                    Assert.Equal(1, bGetter.FieldValue("PublicField"));
                }
                else
                {
                    // Are nulls handled properly?
                    Assert.Equal(null, (Fields)item.Value);
                }
            }
        }
        public async Task GetObjects_ShouldReturnCorrectDistances()
        {
            var geometryFactory = NtsGeometryServices.Instance.CreateGeometryFactory(srid: 4326);
            var users           = new List <User>
            {
                new User
                {
                    Status   = UserStatus.Available,
                    UserName = "******",
                },
                new User
                {
                    Status   = UserStatus.Available,
                    UserName = "******",
                },
                new User
                {
                    Status   = UserStatus.Available,
                    UserName = "******",
                }
            };

            var logins = new List <Login>
            {
                new Login
                {
                    User          = users[0],
                    LoggedAt      = DateTime.UtcNow.AddDays(-10),
                    LoginLocation = new Point(40, 40)
                    {
                        SRID = 4326
                    },
                },
                new Login
                {
                    User          = users[0],
                    LoggedAt      = DateTime.UtcNow.AddDays(0),
                    LoginLocation = new Point(10, 10)
                    {
                        SRID = 4326
                    },
                },
                new Login
                {
                    User          = users[1],
                    LoggedAt      = DateTime.UtcNow.AddDays(10),
                    LoginLocation = new Point(40, 40)
                    {
                        SRID = 4326
                    },
                },
                new Login
                {
                    User          = users[2],
                    LoggedAt      = DateTime.UtcNow.AddDays(10),
                    LoginLocation = new Point(10.003, 10)
                    {
                        SRID = 4326
                    },
                }
            };

            users[0].Logins = new List <Login>
            {
                logins[0], logins[1]
            };
            users[1].Logins = new List <Login> {
                logins[2]
            };
            users[2].Logins = new List <Login> {
                logins[3]
            };
            var objects = new List <OfferedObject>
            {
                new OfferedObject
                {
                    OfferedObjectId        = 1,
                    PublishedAt            = DateTime.UtcNow.AddDays(-1),
                    ObjectStatus           = ObjectStatus.Available,
                    OwnerLogin             = logins[0],
                    CurrentTransactionType = TransactionType.Free,
                    Photos      = new List <ObjectPhoto>(),
                    Tags        = new List <ObjectTag>(),
                    Impressions = new List <ObjectImpression>()
                },
                new OfferedObject
                {
                    OfferedObjectId        = 2,
                    PublishedAt            = DateTime.UtcNow.AddDays(-1),
                    ObjectStatus           = ObjectStatus.Available,
                    OwnerLogin             = logins[1],
                    CurrentTransactionType = TransactionType.Free,
                    Photos      = new List <ObjectPhoto>(),
                    Tags        = new List <ObjectTag>(),
                    Impressions = new List <ObjectImpression>()
                },
                new OfferedObject
                {
                    OfferedObjectId        = 3,
                    PublishedAt            = DateTime.UtcNow.AddDays(-1),
                    ObjectStatus           = ObjectStatus.Available,
                    OwnerLogin             = logins[2],
                    CurrentTransactionType = TransactionType.Free,
                    Photos      = new List <ObjectPhoto>(),
                    Tags        = new List <ObjectTag>(),
                    Impressions = new List <ObjectImpression>()
                },
                new OfferedObject
                {
                    OfferedObjectId        = 4,
                    PublishedAt            = DateTime.UtcNow.AddDays(-1),
                    ObjectStatus           = ObjectStatus.Available,
                    OwnerLogin             = logins[2],
                    CurrentTransactionType = TransactionType.Free,
                    Photos      = new List <ObjectPhoto>(),
                    Tags        = new List <ObjectTag>(),
                    Impressions = new List <ObjectImpression>()
                },
            };

            var objectsRepo = new Mock <IRepository <int, OfferedObject> >();
            var objectsMock = objects.AsQueryable().BuildMock();

            objectsRepo.Setup(o => o.Table).Returns(objects.AsQueryable().BuildMock().Object);

            var loginRepo         = new Mock <IRepository <Guid, Login> >();
            var photoConstructor  = new Mock <IPhotoUrlConstructor>();
            var impression        = new Mock <IObjectImpressionsManager>();
            var objectQueryHelper = new ObjectQueryHelper();
            var userDataManager   = new Mock <IUserDataManager>();

            userDataManager.Setup(u => u.AddCurrentUserIfNeeded()).ReturnsAsync((logins[3], users[2]));
            var configs = new Mock <IConfiguration>();

            configs.Setup(c => c["Settings:IncludeObjectLessThan"]).Returns("500");
            var getter = new ObjectGetter(objectsRepo.Object, photoConstructor.Object, impression.Object, objectQueryHelper, null, configs.Object, userDataManager.Object);

            var result = await getter.GetObjects(new PagingArguments { StartObject = 0, Size = 20 });

            Assert.True(result.Count == 4);
        }
        public void ArrayOfObjects()
        {
            var fieldsType = this._assembly.GetType("AssemblyToProcess.Basic.Fields");

            dynamic fieldInstanceOne = this.GetFieldInstance("first", 1);
            dynamic fieldInstanceTwo = this.GetFieldInstance("second", 2);

            dynamic fieldsArrayInstance = Array.CreateInstance(fieldsType, 3);

            fieldsArrayInstance.SetValue(fieldInstanceOne, 0);
            fieldsArrayInstance.SetValue(fieldInstanceTwo, 1);
            fieldsArrayInstance.SetValue(null, 2);

            var arrayOfObjectsType = this._assembly
                                     .GetType("AssemblyToProcess.Arrays.ArrayOfObjects");
            var arrayOfObjectsInstance = (dynamic)Activator.CreateInstance(arrayOfObjectsType);

            arrayOfObjectsType.GetField("FieldsArray").SetValue(arrayOfObjectsInstance, fieldsArrayInstance);

            // Hand copy.
            var hCopy = arrayOfObjectsInstance.HCopy();

            var hGetter = new ObjectGetter(fieldsType, hCopy.FieldsArray[0]);

            Assert.Equal("first", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, hGetter.FieldValue("PublicField"));

            hGetter = new ObjectGetter(fieldsType, hCopy.FieldsArray[1]);
            Assert.Equal("second", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, hGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)hCopy.FieldsArray[2]);

            // Deep copy.
            var dCopy = arrayOfObjectsInstance.DeepCopy();

            var dGetter = new ObjectGetter(fieldsType, dCopy.FieldsArray[0]);

            Assert.Equal("first", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, dGetter.FieldValue("PublicField"));

            dGetter = new ObjectGetter(fieldsType, dCopy.FieldsArray[1]);
            Assert.Equal("second", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, dGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)dCopy.FieldsArray[2]);

            // Bad copy.
            var bCopy = arrayOfObjectsInstance.BCopy();

            var bGetter = new ObjectGetter(fieldsType, bCopy.FieldsArray[0]);

            Assert.Equal("first", bGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, bGetter.FieldValue("PublicField"));

            bGetter = new ObjectGetter(fieldsType, bCopy.FieldsArray[1]);
            Assert.Equal("second", bGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, bGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)bCopy.FieldsArray[2]);

            // Modify.
            fieldInstanceOne = this.GetFieldInstance("third", 3);
            fieldInstanceTwo = this.GetFieldInstance("fourth", 4);
            fieldsArrayInstance.SetValue(fieldInstanceOne, 0);
            fieldsArrayInstance.SetValue(fieldInstanceTwo, 1);
            arrayOfObjectsType.GetField("FieldsArray").SetValue(arrayOfObjectsInstance, fieldsArrayInstance);

            // Hand copy (should stay the same).
            hGetter = new ObjectGetter(fieldsType, hCopy.FieldsArray[0]);
            Assert.Equal("first", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, hGetter.FieldValue("PublicField"));

            hGetter = new ObjectGetter(fieldsType, hCopy.FieldsArray[1]);
            Assert.Equal("second", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, hGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)hCopy.FieldsArray[2]);

            // Deep copy (should stay the same).
            dGetter = new ObjectGetter(fieldsType, dCopy.FieldsArray[0]);
            Assert.Equal("first", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, dGetter.FieldValue("PublicField"));

            dGetter = new ObjectGetter(fieldsType, dCopy.FieldsArray[1]);
            Assert.Equal("second", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, dGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)dCopy.FieldsArray[2]);

            // Bad copy (should be modified).
            bGetter = new ObjectGetter(fieldsType, bCopy.FieldsArray[0]);
            Assert.Equal("third", bGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(3, bGetter.FieldValue("PublicField"));

            bGetter = new ObjectGetter(fieldsType, bCopy.FieldsArray[1]);
            Assert.Equal("fourth", bGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(4, bGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)bCopy.FieldsArray[2]);
        }
        public void ObjectListTest()
        {
            var fieldsType = this._assembly.GetType("AssemblyToProcess.Basic.Fields");

            dynamic fieldInstanceOne = this.GetFieldInstance("first", 1);
            dynamic fieldInstanceTwo = this.GetFieldInstance("second", 2);

            var listType = Assembly.GetAssembly(typeof(List <>))
                           .GetType("System.Collections.Generic.List`1");

            var     listInstance = (dynamic)Activator.CreateInstance(listType.MakeGenericType(fieldsType));
            dynamic listAdd      = listInstance.GetType().GetMethod("Add");

            listAdd.Invoke(listInstance, new[] { fieldInstanceOne });
            listAdd.Invoke(listInstance, new[] { fieldInstanceTwo });
            listAdd.Invoke(listInstance, new dynamic[] { null });

            var hasListType     = this._assembly.GetType("AssemblyToProcess.Enumerables.HasList");
            var hasListInstance = (dynamic)Activator.CreateInstance(hasListType);

            hasListType.GetField("ListOfObjects").SetValue(hasListInstance, listInstance);

            // Hand copy.
            var hCopy = hasListInstance.HCopy();

            var hGetter = new ObjectGetter(fieldsType, hCopy.ListOfObjects[0]);

            Assert.Equal("first", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, hGetter.FieldValue("PublicField"));

            hGetter = new ObjectGetter(fieldsType, hCopy.ListOfObjects[1]);
            Assert.Equal("second", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, hGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)hCopy.ListOfObjects[2]);

            // Deep copy.
            var dCopy = hasListInstance.DeepCopy();

            var dGetter = new ObjectGetter(fieldsType, dCopy.ListOfObjects[0]);

            Assert.Equal("first", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, dGetter.FieldValue("PublicField"));

            dGetter = new ObjectGetter(fieldsType, dCopy.ListOfObjects[1]);
            Assert.Equal("second", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, dGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)dCopy.ListOfObjects[2]);

            // Bad copy.
            var bCopy = hasListInstance.BCopy();

            var bGetter = new ObjectGetter(fieldsType, bCopy.ListOfObjects[0]);

            Assert.Equal("first", bGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, bGetter.FieldValue("PublicField"));

            bGetter = new ObjectGetter(fieldsType, bCopy.ListOfObjects[1]);
            Assert.Equal("second", bGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, bGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)bCopy.ListOfObjects[2]);

            // Modify.
            dynamic listClear = listInstance.GetType().GetMethod("Clear");

            listClear.Invoke(listInstance, new dynamic[0]);
            listAdd.Invoke(listInstance, new[] { fieldInstanceTwo });
            listAdd.Invoke(listInstance, new dynamic[] { null });

            // Hand copy.
            hGetter = new ObjectGetter(fieldsType, hCopy.ListOfObjects[0]);
            Assert.Equal("first", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, hGetter.FieldValue("PublicField"));

            hGetter = new ObjectGetter(fieldsType, hCopy.ListOfObjects[1]);
            Assert.Equal("second", hGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, hGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)hCopy.ListOfObjects[2]);

            // Deep copy.
            dGetter = new ObjectGetter(fieldsType, dCopy.ListOfObjects[0]);
            Assert.Equal("first", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(1, dGetter.FieldValue("PublicField"));

            dGetter = new ObjectGetter(fieldsType, dCopy.ListOfObjects[1]);
            Assert.Equal("second", dGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, dGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)dCopy.ListOfObjects[2]);

            // Bad copy.
            bGetter = new ObjectGetter(fieldsType, bCopy.ListOfObjects[0]);
            Assert.Equal("second", bGetter.PrivateFieldValue("_privateField"));
            Assert.Equal(2, bGetter.FieldValue("PublicField"));

            // Are nulls handled properly?
            Assert.Equal(null, (Fields)bCopy.ListOfObjects[1]);
        }