public void CheckAsynchronousDiscoveryWorks_AsyncModeIsFalse()
        {
            var fixedObjects = new Dictionary <int, object>();

            fixedObjects [0] = "0";

            var builders = new Dictionary <int, ObjectBuilders.IObjectBuilder <int> >();
            var builder  = new CheckAsynchronousDiscoveryWorksObjectBuilder(false);

            builders [1] = builder;

            var obp     = new ObjectBuilders.Providers.FixedObjectBuilderProvider <int>(builders, fixedObjects);
            var context = new ObjectContext <int>(null, obp, _taskRunner);

            var info = context.BuildObject(1);

            Assert.IsNotNull(info);
            Assert.AreEqual(ObjectBuildingStates.DependenciesKnown, info.ObjectBuildingState);
            info.ObjectBuiltOrFailureWaitHandle.WaitOne();
            Assert.AreEqual(ObjectBuildingStates.ObjectBuilt, info.ObjectBuildingState);
            Assert.IsInstanceOfType(info.BuiltObject, typeof(string));
            Assert.AreEqual("Wrapped 0", (string)info.BuiltObject);
            Assert.IsTrue(builder.DiscoveryThreadID.HasValue);
            Assert.AreEqual(System.Threading.Thread.CurrentThread.ManagedThreadId, builder.DiscoveryThreadID.Value);
        }
        public void RecursiveDependencies_Standard()
        {
            var fixedObjects = new Dictionary <int, object>();

            fixedObjects [0] = 1;
            fixedObjects [1] = "Object 1";
            fixedObjects [2] = "Object 2";

            var builders = new Dictionary <int, ObjectBuilders.IObjectBuilder <int> >();
            var builder  = new RecursiveDependenciesObjectBuilder();

            builders [3] = builder;

            var obp     = new ObjectBuilders.Providers.FixedObjectBuilderProvider <int>(builders, fixedObjects);
            var context = new ObjectContext <int>(null, obp, _taskRunner);

            var info = context.BuildObject(3);

            Assert.IsNotNull(info);
            info.ObjectBuiltOrFailureWaitHandle.WaitOne();
            Assert.AreEqual(ObjectBuildingStates.ObjectBuilt, info.ObjectBuildingState);

            Assert.IsInstanceOfType(info.BuiltObject, typeof(string));
            Assert.AreEqual("Object 1", (string)info.BuiltObject);
        }
        public void SimpleDependencyOverride()
        {
            var fixedObjects = new Dictionary <int, object>();

            fixedObjects [0] = "0";
            fixedObjects [1] = "1";

            var builders = new Dictionary <int, ObjectBuilders.IObjectBuilder <int> >();

            builders [2] = new ObjectBuilders.FunctionBasedObjectBuilder <int>(
                (builderContext, address) =>
            {
                var dependencySet = new ObjectBuilders.DependencySet <int>();
                dependencySet.AddDependency("0", 0);
                dependencySet.AddDependency("1", 1);
                return(dependencySet);
            },
                (builderContext, address, dependencies) => null,
                (builderContext, address, dependencies) => {
                Assert.IsTrue(dependencies.TryGetDependency("0", out var dependencyNumber1));
                Assert.IsTrue(dependencies.TryGetDependency("1", out var dependencyNumber2));

                var builtObject = string.Format("{0}-{1}-{2}",
                                                address,
                                                dependencyNumber1.BuiltObject,
                                                dependencyNumber2.BuiltObject);
                return(builtObject);
            });

            var obp     = new ObjectBuilders.Providers.FixedObjectBuilderProvider <int>(builders, fixedObjects);
            var context = new ObjectContext <int>(null, obp, _taskRunner);

            var info = context.BuildObject(2);

            Assert.IsNotNull(info);
            info.ObjectBuiltOrFailureWaitHandle.WaitOne();
            Assert.AreEqual(ObjectBuildingStates.ObjectBuilt, info.ObjectBuildingState);
            Assert.IsNotNull(info.BuiltObject);
            Assert.IsInstanceOfType(info.BuiltObject, typeof(string));
            Assert.AreEqual("2-0-1", (string)info.BuiltObject);

            var overrides = new Dictionary <int, object>();

            overrides [0] = "Update";
            var overrideOBP     = new ObjectBuilders.Providers.FixedObjectBuilderProvider <int>(null, overrides);
            var overrideContext = new ObjectContext <int>(context, overrideOBP, _taskRunner);

            var overrideInfo = overrideContext.BuildObject(2);

            Assert.IsNotNull(overrideInfo);
            overrideInfo.ObjectBuiltOrFailureWaitHandle.WaitOne();

            Assert.AreEqual(ObjectBuildingStates.ObjectBuilt, overrideInfo.ObjectBuildingState);
            Assert.AreNotSame(info.BuiltObject, overrideInfo.BuiltObject);
            Assert.IsInstanceOfType(overrideInfo.BuiltObject, typeof(string));
            Assert.AreEqual("2-Update-1", overrideInfo.BuiltObject);
        }
        public void CheckObjectLocking()
        {
            var fixedObjects = new Dictionary <int, object>();

            fixedObjects [0] = "0a";

            var fixedObjects2 = new Dictionary <int, object>();

            fixedObjects2 [0] = "0b";

            var builders = new Dictionary <int, ObjectBuilders.IObjectBuilder <int> >();
            var obp      = new ObjectBuilders.Providers.FixedObjectBuilderProvider <int>(builders, fixedObjects);
            var context  = new ObjectContext <int>(null, obp, _taskRunner);

            obp.ObjectBuilders [1] = new ObjectBuilders.FunctionBasedObjectBuilder <int>(
                (builderContext, address) =>
            {
                var dependencySet = new ObjectBuilders.DependencySet <int>();
                dependencySet.AddDependency("live", 0, null);
                dependencySet.AddDependency("fixed", 0, context);
                return(dependencySet);
            },
                (builderContext, address, dependencies) => null,
                (builderContext, address, dependencies) => {
                Assert.IsTrue(dependencies.TryGetDependency("live", out var liveDependency));
                Assert.IsTrue(dependencies.TryGetDependency("fixed", out var fixedDependency));

                var builtObject = string.Format("{0}-{1}-{2}",
                                                address,
                                                fixedDependency.BuiltObject,
                                                liveDependency.BuiltObject);
                return(builtObject);
            });


            var info = context.BuildObject(1);

            Assert.IsNotNull(info);
            info.ObjectBuiltOrFailureWaitHandle.WaitOne();
            Assert.AreEqual(ObjectBuildingStates.ObjectBuilt, info.ObjectBuildingState);
            Assert.IsNotNull(info.BuiltObject);
            Assert.IsInstanceOfType(info.BuiltObject, typeof(string));
            Assert.AreEqual("1-0a-0a", (string)info.BuiltObject);

            var obpOverrides    = new ObjectBuilders.Providers.FixedObjectBuilderProvider <int>(null, fixedObjects2);
            var overrideContext = new ObjectContext <int>(context, obpOverrides, _taskRunner);

            var info2 = overrideContext.BuildObject(1);

            Assert.IsNotNull(info2);
            info2.ObjectBuiltOrFailureWaitHandle.WaitOne();
            Assert.AreEqual(ObjectBuildingStates.ObjectBuilt, info2.ObjectBuildingState);
            Assert.IsNotNull(info2.BuiltObject);
            Assert.IsInstanceOfType(info2.BuiltObject, typeof(string));
            Assert.AreEqual("1-0a-0b", (string)info2.BuiltObject);
        }
        public void MissingBuilder()
        {
            var fixedObjects = new Dictionary <int, object>();

            fixedObjects [0] = "0";
            fixedObjects [1] = "1";

            var obp     = new ObjectBuilders.Providers.FixedObjectBuilderProvider <int>(null, fixedObjects);
            var context = new ObjectContext <int>(null, obp, _taskRunner);

            var info = context.BuildObject(2);

            Assert.IsNotNull(info);
            info.ObjectBuiltOrFailureWaitHandle.WaitOne();
            Assert.AreEqual(ObjectBuildingStates.NoBuilderAvailable, info.ObjectBuildingState);
        }
        public void BuildSimpleObject()
        {
            var fixedObjects = new Dictionary <int, object>();

            fixedObjects [0] = true;
            var objectBuilderProvider = new ObjectBuilders.Providers.FixedObjectBuilderProvider <int>(null, fixedObjects);
            var context = new ObjectContext <int>(null, objectBuilderProvider, _taskRunner);

            var info = context.BuildObject(0);

            Assert.IsNotNull(info);
            info.ObjectBuiltOrFailureWaitHandle.WaitOne();
            Assert.AreEqual(ObjectBuildingStates.ObjectBuilt, info.ObjectBuildingState);
            Assert.IsInstanceOfType(info.BuiltObject, typeof(bool));
            Assert.IsTrue((bool)info.BuiltObject);
        }
        public void BuildSimpleHeirarchySameContext()
        {
            var fixedObjects = new Dictionary <int, object>();

            fixedObjects [0] = "0";
            fixedObjects [1] = "1";

            var builders = new Dictionary <int, ObjectBuilders.IObjectBuilder <int> >();

            builders [2] = new ObjectBuilders.FunctionBasedObjectBuilder <int>(
                (builderContext, address) =>
            {
                var dependencySet = new ObjectBuilders.DependencySet <int>();
                dependencySet.AddDependency("0", 0);
                dependencySet.AddDependency("1", 1);
                return(dependencySet);
            },
                (builderContext, address, dependencies) => null,
                (builderContext, address, dependencies) => {
                Assert.IsTrue(dependencies.TryGetDependency("0", out var dependencyNumber1));
                Assert.IsTrue(dependencies.TryGetDependency("1", out var dependencyNumber2));

                return(address.ToString());
            });

            var obp     = new ObjectBuilders.Providers.FixedObjectBuilderProvider <int>(builders, fixedObjects);
            var context = new ObjectContext <int>(null, obp, _taskRunner);

            var info = context.BuildObject(2);

            Assert.IsNotNull(info);
            info.ObjectBuiltOrFailureWaitHandle.WaitOne();
            Assert.AreEqual(ObjectBuildingStates.ObjectBuilt, info.ObjectBuildingState);
            Assert.IsInstanceOfType(info.BuiltObject, typeof(string));
            Assert.AreEqual("2", (string)info.BuiltObject);
        }
        public void OverrideWithDependencyChanges()
        {
            var fixedObjects = new Dictionary <int, object>();

            fixedObjects [0] = "0";
            fixedObjects [1] = "1";
            fixedObjects [2] = "2";

            var builders = new Dictionary <int, ObjectBuilders.IObjectBuilder <int> >();

            builders [3] = new ObjectBuilders.FunctionBasedObjectBuilder <int>(
                (builderContext, address) =>
            {
                var dependencySet = new ObjectBuilders.DependencySet <int>();
                dependencySet.AddDependency("0", 0);
                dependencySet.AddDependency("1", 1);
                return(dependencySet);
            },
                (builderContext, address, dependencies) => null,
                (builderContext, address, dependencies) => {
                Assert.IsTrue(dependencies.TryGetDependency("0", out var dependencyNumber1));
                Assert.IsTrue(dependencies.TryGetDependency("1", out var dependencyNumber2));

                var builtObject = string.Format("{0}-{1}-{2}",
                                                address,
                                                dependencyNumber1.BuiltObject,
                                                dependencyNumber2.BuiltObject);
                return(builtObject);
            });

            var obp     = new ObjectBuilders.Providers.FixedObjectBuilderProvider <int>(builders, fixedObjects);
            var context = new ObjectContext <int>(null, obp, _taskRunner);

            var buildingInfo3 = context.BuildObject(3);

            buildingInfo3.ObjectBuiltOrFailureWaitHandle.WaitOne();
            Assert.AreEqual(ObjectBuildingStates.ObjectBuilt, buildingInfo3.ObjectBuildingState);
            Assert.AreEqual("3-0-1", (string)buildingInfo3.BuiltObject);

            var buildersOverrides = new Dictionary <int, ObjectBuilders.IObjectBuilder <int> >();

            buildersOverrides  [3] = new ObjectBuilders.FunctionBasedObjectBuilder <int>(
                (builderContext, address) =>
            {
                var dependencySet = new ObjectBuilders.DependencySet <int>();
                dependencySet.AddDependency("1", 1);
                dependencySet.AddDependency("2", 2);
                return(dependencySet);
            },
                (builderContext, address, dependencies) => null,
                (builderContext, address, dependencies) => {
                Assert.IsTrue(dependencies.TryGetDependency("1", out var dependencyNumber1));
                Assert.IsTrue(dependencies.TryGetDependency("2", out var dependencyNumber2));

                var builtObject = string.Format("{0}-{1}-{2}",
                                                address,
                                                dependencyNumber1.BuiltObject,
                                                dependencyNumber2.BuiltObject);
                return(builtObject);
            });

            var obpOverrides    = new ObjectBuilders.Providers.FixedObjectBuilderProvider <int>(buildersOverrides, null);
            var overrideContext = new ObjectContext <int>(context, obpOverrides, _taskRunner);

            var overridenBuildingInfo3 = overrideContext.BuildObject(3);

            overridenBuildingInfo3.ObjectBuiltOrFailureWaitHandle.WaitOne();
            Assert.AreEqual(ObjectBuildingStates.ObjectBuilt, overridenBuildingInfo3.ObjectBuildingState);
            Assert.AreEqual("3-1-2", (string)overridenBuildingInfo3.BuiltObject);
        }