public void TestAdvancedObjects()
        {
            var instanceFactory = new CSharpInstanceFactory();

            // ZAS: Is able to navigate generic types
            var list = instanceFactory.InstantiateInstanceOf <List <string> >(goodValue: true);

            Assert.IsNotNull(list);

            // ZAS: Is able to navigate complicated objects and dependencies
            var complexObject = instanceFactory.InstantiateInstanceOf <AdvancedObjectA>(goodValue: true);

            Assert.IsNotNull(complexObject);

            // ZAS: Is able to navigate interface objects
            var interfaceObject = instanceFactory.InstantiateInstanceOf <IAdvancedObject>(goodValue: true);

            Assert.IsNotNull(interfaceObject);
            Assert.IsTrue(typeof(IAdvancedObject).IsAssignableFrom(interfaceObject.GetType()));

            // ZAS: Is able to create dynamic Actions
            var emptyAction = instanceFactory.InstantiateInstanceOf <Action>(goodValue: true);

            Assert.IsNotNull(emptyAction);
            Assert.DoesNotThrow(new TestDelegate(emptyAction));

            var boolAction = instanceFactory.InstantiateInstanceOf <Action <bool> >(goodValue: true);

            Assert.IsNotNull(boolAction);
            Assert.DoesNotThrow(() => boolAction(false));

            // ZAS: Is able to create dynamic functions
            var emptyFunction = instanceFactory.InstantiateInstanceOf <Func <bool> >(goodValue: true);

            Assert.IsNotNull(emptyFunction);
            Assert.IsFalse(emptyFunction());

            var boolFunction = instanceFactory.InstantiateInstanceOf <Func <bool, bool> >(goodValue: true);

            Assert.IsNotNull(boolFunction);
            Assert.IsFalse(boolFunction(false));
        }
        public void TestBasicUseGoodValues()
        {
            var instanceFactory = new CSharpInstanceFactory();

            // ZAS: Good Value type defaults are just the default() value
            Assert.AreEqual(default(bool), instanceFactory.InstantiateInstanceOf <bool>(goodValue: true));
            Assert.AreEqual(default(byte), instanceFactory.InstantiateInstanceOf <byte>(goodValue: true));
            Assert.AreEqual(default(sbyte), instanceFactory.InstantiateInstanceOf <sbyte>(goodValue: true));
            Assert.AreEqual(default(char), instanceFactory.InstantiateInstanceOf <char>(goodValue: true));
            Assert.AreEqual(default(decimal), instanceFactory.InstantiateInstanceOf <decimal>(goodValue: true));
            Assert.AreEqual(default(double), instanceFactory.InstantiateInstanceOf <double>(goodValue: true));
            Assert.AreEqual(default(float), instanceFactory.InstantiateInstanceOf <float>(goodValue: true));
            Assert.AreEqual(default(int), instanceFactory.InstantiateInstanceOf <int>(goodValue: true));
            Assert.AreEqual(default(uint), instanceFactory.InstantiateInstanceOf <uint>(goodValue: true));
            Assert.AreEqual(default(long), instanceFactory.InstantiateInstanceOf <long>(goodValue: true));
            Assert.AreEqual(default(ulong), instanceFactory.InstantiateInstanceOf <ulong>(goodValue: true));
            Assert.AreEqual(default(short), instanceFactory.InstantiateInstanceOf <short>(goodValue: true));
            Assert.AreEqual(default(ushort), instanceFactory.InstantiateInstanceOf <ushort>(goodValue: true));

            // ZAS: Good reference types are a pre-determined value instead of being null
            Assert.AreEqual(CSharpInstanceFactory.GOOD_OBJECT_VALUE, instanceFactory.InstantiateInstanceOf <object>(goodValue: true));
            Assert.AreEqual(CSharpInstanceFactory.GOOD_STRING_VALUE, instanceFactory.InstantiateInstanceOf <string>(goodValue: true));

            // ZAS: Default values can be customized
            instanceFactory.AssignDefaultValue <bool>(true, goodValue: true);
            instanceFactory.AssignDefaultValue <byte>(3, goodValue: true);
            instanceFactory.AssignDefaultValue <sbyte>(3, goodValue: true);
            instanceFactory.AssignDefaultValue <char>('3', goodValue: true);
            instanceFactory.AssignDefaultValue <decimal>(3, goodValue: true);
            instanceFactory.AssignDefaultValue <double>(3, goodValue: true);
            instanceFactory.AssignDefaultValue <float>(3, goodValue: true);
            instanceFactory.AssignDefaultValue <int>(3, goodValue: true);
            instanceFactory.AssignDefaultValue <uint>(3, goodValue: true);
            instanceFactory.AssignDefaultValue <long>(3, goodValue: true);
            instanceFactory.AssignDefaultValue <ulong>(3, goodValue: true);
            instanceFactory.AssignDefaultValue <short>(3, goodValue: true);
            instanceFactory.AssignDefaultValue <ushort>(3, goodValue: true);

            var newGoodDefaultObject = new { TheValue = 3 };

            instanceFactory.AssignDefaultValue <object>(newGoodDefaultObject, goodValue: true);

            var newGoodDefaultString = "Three";

            instanceFactory.AssignDefaultValue <string>(newGoodDefaultString, goodValue: true);

            // ZAS: Make sure our new values have been applied
            Assert.AreEqual(true, instanceFactory.InstantiateInstanceOf <bool>(goodValue: true));
            Assert.AreEqual(3, instanceFactory.InstantiateInstanceOf <byte>(goodValue: true));
            Assert.AreEqual(3, instanceFactory.InstantiateInstanceOf <sbyte>(goodValue: true));
            Assert.AreEqual('3', instanceFactory.InstantiateInstanceOf <char>(goodValue: true));
            Assert.AreEqual(3, instanceFactory.InstantiateInstanceOf <decimal>(goodValue: true));
            Assert.AreEqual(3, instanceFactory.InstantiateInstanceOf <double>(goodValue: true));
            Assert.AreEqual(3, instanceFactory.InstantiateInstanceOf <float>(goodValue: true));
            Assert.AreEqual(3, instanceFactory.InstantiateInstanceOf <int>(goodValue: true));
            Assert.AreEqual(3, instanceFactory.InstantiateInstanceOf <uint>(goodValue: true));
            Assert.AreEqual(3, instanceFactory.InstantiateInstanceOf <long>(goodValue: true));
            Assert.AreEqual(3, instanceFactory.InstantiateInstanceOf <ulong>(goodValue: true));
            Assert.AreEqual(3, instanceFactory.InstantiateInstanceOf <short>(goodValue: true));
            Assert.AreEqual(3, instanceFactory.InstantiateInstanceOf <ushort>(goodValue: true));
            Assert.AreEqual(newGoodDefaultObject, instanceFactory.InstantiateInstanceOf <object>(goodValue: true));
            Assert.AreEqual(newGoodDefaultString, instanceFactory.InstantiateInstanceOf <string>(goodValue: true));

            // ZAS: Clear back to defaults
            instanceFactory.ClearDefaultValues(goodValues: true);
        }
        public void TestBasicUseBadValues()
        {
            var instanceFactory = new CSharpInstanceFactory();

            // ZAS: Bad Value type defaults are values that are likely to not be considered
            Assert.AreEqual(false, instanceFactory.InstantiateInstanceOf <bool>(goodValue: false));
            Assert.AreEqual(byte.MaxValue, instanceFactory.InstantiateInstanceOf <byte>(goodValue: false));
            Assert.AreEqual(sbyte.MinValue, instanceFactory.InstantiateInstanceOf <sbyte>(goodValue: false));
            Assert.AreEqual(char.MinValue, instanceFactory.InstantiateInstanceOf <char>(goodValue: false));
            Assert.AreEqual(decimal.MinValue, instanceFactory.InstantiateInstanceOf <decimal>(goodValue: false));
            Assert.AreEqual(double.MinValue, instanceFactory.InstantiateInstanceOf <double>(goodValue: false));
            Assert.AreEqual(float.MinValue, instanceFactory.InstantiateInstanceOf <float>(goodValue: false));
            Assert.AreEqual(int.MinValue, instanceFactory.InstantiateInstanceOf <int>(goodValue: false));
            Assert.AreEqual(uint.MaxValue, instanceFactory.InstantiateInstanceOf <uint>(goodValue: false));
            Assert.AreEqual(long.MinValue, instanceFactory.InstantiateInstanceOf <long>(goodValue: false));
            Assert.AreEqual(ulong.MaxValue, instanceFactory.InstantiateInstanceOf <ulong>(goodValue: false));
            Assert.AreEqual(short.MinValue, instanceFactory.InstantiateInstanceOf <short>(goodValue: false));
            Assert.AreEqual(ushort.MaxValue, instanceFactory.InstantiateInstanceOf <ushort>(goodValue: false));

            // ZAS: Bad reference types are just null
            Assert.AreEqual(null, instanceFactory.InstantiateInstanceOf <object>(goodValue: false));
            Assert.AreEqual(null, instanceFactory.InstantiateInstanceOf <string>(goodValue: false));

            // ZAS: Default values can be customized
            instanceFactory.AssignDefaultValue <bool>(false, goodValue: false);
            instanceFactory.AssignDefaultValue <byte>(3, goodValue: false);
            instanceFactory.AssignDefaultValue <sbyte>(-3, goodValue: false);
            instanceFactory.AssignDefaultValue <char>('3', goodValue: false);
            instanceFactory.AssignDefaultValue <decimal>(-3, goodValue: false);
            instanceFactory.AssignDefaultValue <double>(-3, goodValue: false);
            instanceFactory.AssignDefaultValue <float>(-3, goodValue: false);
            instanceFactory.AssignDefaultValue <int>(-3, goodValue: false);
            instanceFactory.AssignDefaultValue <uint>(3, goodValue: false);
            instanceFactory.AssignDefaultValue <long>(-3, goodValue: false);
            instanceFactory.AssignDefaultValue <ulong>(3, goodValue: false);
            instanceFactory.AssignDefaultValue <short>(-3, goodValue: false);
            instanceFactory.AssignDefaultValue <ushort>(3, goodValue: false);

            var newBadDefaultObject = new { BrokenObject = true };

            instanceFactory.AssignDefaultValue <object>(newBadDefaultObject, goodValue: false);

            var newBadDefaultString = "!@#$%^&*()";

            instanceFactory.AssignDefaultValue <string>(newBadDefaultString, goodValue: false);

            // ZAS: Make sure our new values have been applied
            Assert.AreEqual(false, instanceFactory.InstantiateInstanceOf <bool>(goodValue: false));
            Assert.AreEqual(3, instanceFactory.InstantiateInstanceOf <byte>(goodValue: false));
            Assert.AreEqual(-3, instanceFactory.InstantiateInstanceOf <sbyte>(goodValue: false));
            Assert.AreEqual('3', instanceFactory.InstantiateInstanceOf <char>(goodValue: false));
            Assert.AreEqual(-3, instanceFactory.InstantiateInstanceOf <decimal>(goodValue: false));
            Assert.AreEqual(-3, instanceFactory.InstantiateInstanceOf <double>(goodValue: false));
            Assert.AreEqual(-3, instanceFactory.InstantiateInstanceOf <float>(goodValue: false));
            Assert.AreEqual(-3, instanceFactory.InstantiateInstanceOf <int>(goodValue: false));
            Assert.AreEqual(3, instanceFactory.InstantiateInstanceOf <uint>(goodValue: false));
            Assert.AreEqual(-3, instanceFactory.InstantiateInstanceOf <long>(goodValue: false));
            Assert.AreEqual(3, instanceFactory.InstantiateInstanceOf <ulong>(goodValue: false));
            Assert.AreEqual(-3, instanceFactory.InstantiateInstanceOf <short>(goodValue: false));
            Assert.AreEqual(3, instanceFactory.InstantiateInstanceOf <ushort>(goodValue: false));
            Assert.AreEqual(newBadDefaultObject, instanceFactory.InstantiateInstanceOf <object>(goodValue: false));
            Assert.AreEqual(newBadDefaultString, instanceFactory.InstantiateInstanceOf <string>(goodValue: false));

            // ZAS: Clear back to defaults
            instanceFactory.ClearDefaultValues(goodValues: false);
        }