public void BypassingTaskFunctionality_Failure()
        {
            var exception = new Exception("Raaaaaaaaaaa");

            var obp = new ObjectBuilders.Providers.FunctionBasedObjectBuilderProvider <int>((address) => {
                return(new ObjectBuilders.FunctionBasedObjectBuilder <int>(
                           (context, address) => { return new ObjectBuilders.DependencySet <int>(); },
                           (context, address, builtDependencies) => { return null; },
                           (context, address, dependencies) => throw new Exception("Don't call me")
                           ));
            });

            var taskRunner = new Tasks.FunctionBasedTaskRunner((task) => {
                var objectBuildingTask = task as Tasks.IObjectBuildingTask <int>;
                if (objectBuildingTask == null)
                {
                    throw new InvalidOperationException("Er....");
                }

                objectBuildingTask.SetException(exception);
            });

            var objectContext = new ObjectContext <int>(null, obp, taskRunner);

            var obj = objectContext.BuildObject(5);

            Assert.IsTrue(obj.ObjectBuiltOrFailureWaitHandle.WaitOne());
            Assert.AreEqual(ObjectBuildingStates.Failure, obj.ObjectBuildingState);
            Assert.AreSame(exception, obj.Exception);
        }
        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 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);
        }