public void ParallelBuilding()
        {
            var functionBasedOBP = new ObjectBuilders.Providers.FunctionBasedObjectBuilderProvider <Tuple <string, int> >(
                (tuple) =>
            {
                switch (tuple.Item1)
                {
                case "Data":
                    return(new ObjectBuilders.FixedObjectBuilder <Tuple <string, int> >(0));

                case "Logic":
                    return(new ObjectBuilders.FunctionBasedObjectBuilder <Tuple <string, int> >(
                               (builderContext, address) =>
                    {
                        var dependencySet = new ObjectBuilders.DependencySet <Tuple <string, int> >();
                        dependencySet.AddDependency("dep" + address.Item2, Tuple.Create("Data", address.Item2));
                        return dependencySet;
                    },
                               (builderContext, address, dependencies) => null,
                               (builderContext, address, dependencies) =>
                    {
                        var startTime = DateTime.UtcNow;
                        double val = 1;
                        for (int i = 0; i < 100000000; ++i)
                        {
                            val += Math.Sqrt(i);
                        }

                        var timeSpan = DateTime.UtcNow - startTime;
                        return timeSpan;
                    }));

                default:
                    throw new NotSupportedException();
                }
            });

            var context     = new ObjectContext <Tuple <string, int> >(null, functionBasedOBP, _taskRunner);
            var infoObjects = new List <IObjectBuildingInfo <Tuple <string, int> > >(300);

            for (int idx = 0; idx < 16; idx++)
            {
                var address = Tuple.Create("Logic", idx);
                infoObjects.Add(context.BuildObject(address));
            }

            foreach (var infoObj in infoObjects)
            {
                infoObj.ObjectBuiltOrFailureWaitHandle.WaitOne();
                Assert.AreEqual(ObjectBuildingStates.ObjectBuilt, infoObj.ObjectBuildingState);
            }
        }
        public void CheckProviderBehaviour()
        {
            var provider = new FunctionBasedObjectBuilderProvider <int>(
                (address) =>
            {
                switch (address)
                {
                case 0:
                    return(new FixedObjectBuilder <int>(0));

                default:
                    return(null);
                }
            });

            Assert.IsTrue(provider.TryGetObjectBuilder(0, out var objectBuilder));
            Assert.IsNotNull(objectBuilder);

            Assert.IsFalse(provider.TryGetObjectBuilder(1, out objectBuilder));
        }