public void GetDescriptor_CycleMetadataCompleted_MethodsReturnExpected()
        {
            ExportDescriptorPromise      promise  = null;
            IDictionary <string, object> metadata = null;

            promise = new ExportDescriptorPromise(new CompositionContract(typeof(int)), "Origin", true, () => Enumerable.Empty <CompositionDependency>(), depdendencies =>
            {
                ExportDescriptor cycleDescriptor = promise.GetDescriptor();
                metadata = cycleDescriptor.Metadata;

                return(ExportDescriptor.Create(Activator, new Dictionary <string, object> {
                    { "key", "value" }
                }));
            });

            // Invoke the GetDescriptor method to start the test.
            Assert.NotNull(promise.GetDescriptor());

            // Make sure all the IDictionary methods complete successfully.
            Assert.Equal("value", metadata["key"]);
            Assert.True(metadata.Contains(new KeyValuePair <string, object>("key", "value")));
            Assert.True(metadata.ContainsKey("key"));
            Assert.False(metadata.IsReadOnly);

            metadata["key"] = "value2";
            Assert.True(metadata.TryGetValue("key", out object value));
            Assert.Equal("value2", value);

            metadata.Add("key2", "value");
            Assert.Equal(2, metadata.Count);

            metadata.Remove("key2");
            Assert.Equal(1, metadata.Count);

            metadata.Add(new KeyValuePair <string, object>("key2", "value"));
            Assert.Equal(2, metadata.Count);

            metadata.Remove(new KeyValuePair <string, object>("key2", "value"));
            Assert.Equal(1, metadata.Count);

            Assert.Equal(1, metadata.Keys.Count);
            Assert.Equal(1, metadata.Values.Count);

            var array = new KeyValuePair <string, object> [2];

            metadata.CopyTo(array, 1);
            Assert.Equal(new KeyValuePair <string, object>[] { default(KeyValuePair <string, object>), new KeyValuePair <string, object>("key", "value2") }, array);

            IEnumerator enumerator = metadata.GetEnumerator();

            Assert.True(enumerator.MoveNext());
            Assert.Equal(new KeyValuePair <string, object>("key", "value2"), enumerator.Current);

            enumerator = ((IEnumerable)metadata).GetEnumerator();
            Assert.True(enumerator.MoveNext());
            Assert.Equal(new KeyValuePair <string, object>("key", "value2"), enumerator.Current);

            metadata.Clear();
            Assert.Equal(0, metadata.Count);
        }
        public void GetDescriptor_GetWhenNull_ThrowsNullReferenceException()
        {
            var descriptor = ExportDescriptor.Create(Activator, new Dictionary <string, object>());
            var promise    = new ExportDescriptorPromise(new CompositionContract(typeof(int)), "Origin", true, null, dependencies =>
            {
                return(ExportDescriptor.Create(Activator, new Dictionary <string, object>()));
            });

            Assert.Throws <NullReferenceException>(() => promise.GetDescriptor());
        }
        public void GetDescriptor_GetWhenReturnsNull_ThrowsArgumentNullException()
        {
            var descriptor = ExportDescriptor.Create(Activator, new Dictionary <string, object>());
            var promise    = new ExportDescriptorPromise(new CompositionContract(typeof(int)), "Origin", true, () => Enumerable.Empty <CompositionDependency>(), depdendencies =>
            {
                return(null);
            });

            AssertExtensions.Throws <ArgumentNullException>("descriptor", () => promise.GetDescriptor());
        }
        public void Ctor_Dependencies(CompositionContract contract, string origin, bool isShared, IEnumerable <CompositionDependency> dependencies)
        {
            int calledDependencies  = 0;
            int calledGetDescriptor = 0;
            var descriptor          = ExportDescriptor.Create(Activator, new Dictionary <string, object>());
            var promise             = new ExportDescriptorPromise(contract, origin, isShared, () =>
            {
                calledDependencies++;
                return(dependencies);
            }, getDependencies =>
            {
                Assert.Equal(dependencies, getDependencies);
                calledGetDescriptor++;
                return(descriptor);
            });

            Assert.Same(contract, promise.Contract);
            Assert.Same(origin, promise.Origin);
            Assert.Equal(isShared, promise.IsShared);

            // The Dependencies parameter should only be invoked once.
            Assert.Equal(0, calledDependencies);
            Assert.Equal(0, calledGetDescriptor);
            Assert.Equal(dependencies, promise.Dependencies);
            Assert.Equal(1, calledDependencies);
            Assert.Equal(0, calledGetDescriptor);

            Assert.Same(promise.Dependencies, promise.Dependencies);
            Assert.Equal(1, calledDependencies);
            Assert.Equal(0, calledGetDescriptor);

            // The GetDescriptor parameter should only be invoked once.
            ExportDescriptor actualDescriptor = promise.GetDescriptor();

            Assert.Same(descriptor, actualDescriptor);
            Assert.Equal(1, calledDependencies);
            Assert.Equal(1, calledGetDescriptor);

            Assert.Same(actualDescriptor, promise.GetDescriptor());
            Assert.Equal(1, calledDependencies);
            Assert.Equal(1, calledGetDescriptor);
        }
        public void GetDescriptor_GetWhenReturnsNull_ThrowsInternalErrorException()
        {
            var descriptor = ExportDescriptor.Create(Activator, new Dictionary <string, object>());
            var promise    = new ExportDescriptorPromise(new CompositionContract(typeof(int)), "Origin", true, () => Enumerable.Empty <CompositionDependency>(), depdendencies =>
            {
                return(null);
            });

            Exception ex = Assert.ThrowsAny <Exception>(() => promise.GetDescriptor());

            Assert.Equal("Microsoft.Internal.Assumes+InternalErrorException", ex.GetType().ToString());
        }
        public void GetDescriptor_CycleMetadataNotCompleted_MethodsThrowNotImplementedException()
        {
            ExportDescriptorPromise promise = null;

            promise = new ExportDescriptorPromise(new CompositionContract(typeof(int)), "Origin", true, () => Enumerable.Empty <CompositionDependency>(), depdendencies =>
            {
                ExportDescriptor cycleDescriptor      = promise.GetDescriptor();
                IDictionary <string, object> metadata = cycleDescriptor.Metadata;

                Assert.Throws <NotImplementedException>(() => metadata.Add("key", "value"));
                Assert.Throws <NotImplementedException>(() => metadata.Clear());
                Assert.Throws <NotImplementedException>(() => metadata.Add(default(KeyValuePair <string, object>)));
                Assert.Throws <NotImplementedException>(() => metadata.CopyTo(null, 0));
                Assert.Throws <NotImplementedException>(() => metadata.Contains(default(KeyValuePair <string, object>)));
                Assert.Throws <NotImplementedException>(() => metadata.ContainsKey("key"));
                Assert.Throws <NotImplementedException>(() => metadata.Count);
                Assert.Throws <NotImplementedException>(() => metadata.IsReadOnly);
                Assert.Throws <NotImplementedException>(() => metadata.GetEnumerator());
                Assert.Throws <NotImplementedException>(() => ((IEnumerable)metadata).GetEnumerator());
                Assert.Throws <NotImplementedException>(() => metadata.Keys);
                Assert.Throws <NotImplementedException>(() => metadata.Remove("key"));
                Assert.Throws <NotImplementedException>(() => metadata.Remove(default(KeyValuePair <string, object>)));
                Assert.Throws <NotImplementedException>(() => metadata.TryGetValue("key", out object _));
                Assert.Throws <NotImplementedException>(() => metadata.Values);

                Assert.Throws <NotImplementedException>(() => metadata["key"]);
                Assert.Throws <NotImplementedException>(() => metadata["key"] = "value");

                return(ExportDescriptor.Create(Activator, new Dictionary <string, object> {
                    { "key", "value" }
                }));
            });

            // Invoke the GetDescriptor method to start the test.
            Assert.NotNull(promise.GetDescriptor());
        }
        public void GetDescriptor_CycleMetadataBroken_HasExpectedProperties()
        {
            ExportDescriptorPromise promise         = null;
            ExportDescriptor        cycleDescriptor = null;

            promise = new ExportDescriptorPromise(new CompositionContract(typeof(int)), "Origin", true, () => Enumerable.Empty <CompositionDependency>(), depdendencies =>
            {
                cycleDescriptor = promise.GetDescriptor();
                return(ExportDescriptor.Create(Activator, new Dictionary <string, object> {
                    { "key", "value" }
                }));
            });

            ExportDescriptor descriptor = promise.GetDescriptor();

            Assert.Same(descriptor.Activator, cycleDescriptor.Activator);
            Assert.Same(descriptor.Metadata, cycleDescriptor.Metadata);
        }
        public void GetDescriptor_CycleActivatorNotCompleted_ThrowsNotImplementedException()
        {
            ExportDescriptorPromise promise = null;

            promise = new ExportDescriptorPromise(new CompositionContract(typeof(int)), "Origin", true, () => Enumerable.Empty <CompositionDependency>(), depdendencies =>
            {
                ExportDescriptor cycleDescriptor = promise.GetDescriptor();
                CompositeActivator activator     = cycleDescriptor.Activator;
                Assert.Throws <NotImplementedException>(() => activator(null, null));

                return(ExportDescriptor.Create(Activator, new Dictionary <string, object> {
                    { "key", "value" }
                }));
            });

            // Invoke the GetDescriptor method to start the test.
            Assert.NotNull(promise.GetDescriptor());
        }
        public void GetDescriptor_CycleActivatorNotCompleted_ThrowsInternalErrorException()
        {
            ExportDescriptorPromise promise = null;

            promise = new ExportDescriptorPromise(new CompositionContract(typeof(int)), "Origin", true, () => Enumerable.Empty <CompositionDependency>(), depdendencies =>
            {
                ExportDescriptor cycleDescriptor = promise.GetDescriptor();
                CompositeActivator activator     = cycleDescriptor.Activator;
                Exception ex = Assert.ThrowsAny <Exception>(() => activator(null, null));
                Assert.Equal("Microsoft.Internal.Assumes+InternalErrorException", ex.GetType().ToString());

                return(ExportDescriptor.Create(Activator, new Dictionary <string, object> {
                    { "key", "value" }
                }));
            });

            // Invoke the GetDescriptor method to start the test.
            Assert.NotNull(promise.GetDescriptor());
        }
        public void GetDescriptor_CycleActivatorCompleted_Success()
        {
            ExportDescriptorPromise promise   = null;
            CompositeActivator      activator = null;

            promise = new ExportDescriptorPromise(new CompositionContract(typeof(int)), "Origin", true, () => Enumerable.Empty <CompositionDependency>(), depdendencies =>
            {
                ExportDescriptor cycleDescriptor = promise.GetDescriptor();
                activator = cycleDescriptor.Activator;

                return(ExportDescriptor.Create(Activator, new Dictionary <string, object> {
                    { "key", "value" }
                }));
            });

            ExportDescriptor descriptor = promise.GetDescriptor();

            Assert.Equal("hi", descriptor.Activator(null, null));
            Assert.Equal("hi", activator(null, null));
        }