public void when_creating_component_named_as_property_then_throws()
        {
            var product = new Product("Foo", "IFoo");
            product.CreateProperty("Element");

            Assert.Throws<ArgumentException>(() => product.CreateElement("Element", "IElement"));
        }
Example #2
0
        public void when_visiting_root_then_visits_entire_graph()
        {
            var products = 0;
            var elements = 0;
            var collections = 0;
            var containers = 0;
            var components = 0;
            var properties = 0;

            var visitor = InstanceVisitor.Create(
                p => products++,
                e => elements++,
                c => collections++,
                c => containers++,
                c => components++,
                p => properties++);

            var product = new Product("Foo", "IFoo");
            product.CreateElement("Element", "IElement")
                .CreateProperty("IsVisible");
            product.CreateCollection("Collection", "ICollection")
                .CreateElement("Element", "IElement");
            product.CreateProperty("IsVisible");

            product.Accept(visitor);

            Assert.Equal(1, products);
            Assert.Equal(2, elements);
            Assert.Equal(1, collections);
            Assert.Equal(4, containers);
            Assert.Equal(4, components);
            Assert.Equal(2, properties);
        }
        public void when_mapping_product_then_maps_component_schema()
        {
            var toolkit = new ToolkitSchema("Toolkit", "1.0");
            var schema = toolkit.CreateProductSchema("IProduct");
            var element = schema.CreateElementSchema("IElement");
            element.CreatePropertySchema("IsPublic", typeof(bool));

            var product = new Product("Product", "IProduct");
            product.CreateElement("Element", "IElement")
                .CreateProperty("IsPublic").Value = true;

            ComponentMapper.SyncProduct(product, (IProductInfo)schema);

            Assert.NotNull(product.Components.First().Schema);
            Assert.NotNull(product.Components.First().Properties.First().Schema);
        }
        public void when_disposing_element_then_does_not_raise_deleted_event()
        {
            var product = new Product("Foo", "IFoo");
            var child = product.CreateElement("Storage", "IStorage");

            var deleted = false;
            child.Events.Deleted += (s, e) => deleted = true;

            child.Dispose();

            Assert.False(deleted);
        }
        public void when_creating_element_then_it_has_schema_defined_properties()
        {
            var product = new Product("Foo", "IFoo");
            var info = Mock.Of<IProductInfo>(x =>
                x.Toolkit.Id == "Test" &&
                x.Toolkit.Version == "1.0" &&
                x.SchemaId == "IFoo" &&
                x.Components == new IComponentInfo[]
                {
                    Mock.Of<IElementInfo>(e =>
                        e.SchemaId == "IElement" &&
                        e.Properties == new []
                        {
                            Mock.Of<IPropertyInfo>(p => p.Name == "IsPublic" && p.PropertyType == typeof(bool))
                        })
                });

            product.Schema = info;

            var child = product.CreateElement("Element", "IElement");

            Assert.Equal(1, child.Properties.Count());
            Assert.Equal("IsPublic", child.Properties.First().Name);
            Assert.NotNull(child.Properties.First().Schema);
            Assert.Equal(typeof(bool), child.Properties.First().Schema.PropertyType);
        }
        public void when_creating_element_then_it_has_schema()
        {
            var info = Mock.Of<IProductInfo>(x =>
                x.Toolkit.Id == "Test" &&
                x.Toolkit.Version == "1.0" &&
                x.SchemaId == "IFoo" &&
                x.Components == new IComponentInfo[]
                {
                    Mock.Of<IElementInfo>(e => e.SchemaId == "IElement")
                });

            var product = new Product("Foo", "IFoo");
            product.Schema = info;

            var child = product.CreateElement("Element", "IElement");

            Assert.NotNull(child.Schema);
        }
        public void when_property_changed_on_element_then_raises_property_changed_on_parent()
        {
            var product = new Product("Product", "IProduct");
            product.CreateElement("Element", "IElement")
                .CreateProperty("key").Value = "foo";

            var changed = default(PropertyChangeEventArgs);

            product.Events.PropertyChanged += (sender, args) => changed = args;

            product.Components.First().Set("key", "bar");

            Assert.NotNull(changed);
            Assert.Equal("Element", changed.PropertyName);
            Assert.Same(changed.OldValue, changed.NewValue);
            Assert.Same(product.Components.First(), changed.NewValue);
        }
        public void when_enumerating_components_then_can_access_created_element()
        {
            var product = new Product("Foo", "IFoo");
            var child = product.CreateElement("Storage", "IStorage");

            var component = product.Components.FirstOrDefault();

            Assert.NotNull(component);
            Assert.Same(child, component);
        }
        public void when_element_new_name_is_duplicated_with_other_element_then_throws()
        {
            var product = new Product("Foo", "IFoo");

            product.CreateElement("Storage", "IStorage");

            var child = product.CreateElement("Storage2", "IStorage");

            Assert.Throws<ArgumentException>(() => child.Name = "Storage");
        }
        public void when_disposing_product_then_disposes_entire_graph()
        {
            var product = new Product("Product", "IProduct");
            product.CreateCollection("Collection", "ICollection")
                .CreateItem("Item", "IItem");
            product.CreateElement("Element", "IElement")
                .CreateElement("NestedElement", "IElement");

            product.Dispose();

            Assert.True(product.IsDisposed);
            Assert.True(product.Components.All(c => c.IsDisposed));
            Assert.True(product.Components.OfType<Collection>().All(c => c.Items.All(e => e.IsDisposed)));
        }
        public void when_creating_duplicate_name_component_then_throws()
        {
            var product = new Product("Foo", "IFoo");
            var child = product.CreateCollection("Storage", "IStorage");

            // Same name and schema id
            Assert.Throws<ArgumentException>(() => product.CreateCollection("Storage", "IStorage"));
            // Same name, different schema id
            Assert.Throws<ArgumentException>(() => product.CreateCollection("Storage", "IBucket"));

            // Different component type, same name and schema id
            Assert.Throws<ArgumentException>(() => product.CreateElement("Storage", "IStorage"));
            // Different component type, same name, different schema id
            Assert.Throws<ArgumentException>(() => product.CreateElement("Storage", "IBucket"));
        }
        public void when_deleting_element_then_raises_component_removed()
        {
            var product = new Product("Foo", "IFoo");
            var removed = default(IComponent);
            var child = product.CreateElement("Storage", "IStorage");

            product.ComponentRemoved += (sender, args) => removed = args.Value;

            child.Delete();

            Assert.NotNull(removed);
            Assert.Same(removed, child);
        }
        public void when_deleting_renamed_element_then_removes_from_parent_components()
        {
            var product = new Product("Foo", "IFoo");
            var child = product.CreateElement("Storage", "IStorage");

            child.Name = "Bar";
            child.Delete();

            Assert.Equal(0, product.Components.Count());
        }
        public void when_deleting_element_then_disposes_it()
        {
            var product = new Product("Foo", "IFoo");
            var child = product.CreateElement("Storage", "IStorage");

            child.Delete();

            Assert.True(child.IsDisposed);
        }
        public void when_creating_hierarchy_then_can_access_owning_product()
        {
            var product = new Product("Foo", "IFoo");
            var child = product.CreateElement("Bar", "IBar").CreateElement("Baz", "IBaz");

            Assert.Same(product, child.Product);
        }
        public void when_creating_element_then_sets_name_and_schema_id()
        {
            var product = new Product("Foo", "IFoo");

            var child = product.CreateElement("Storage", "IStorage");

            Assert.Equal("Storage", child.Name);
            Assert.Equal("IStorage", child.SchemaId);
        }
        public void when_creating_element_then_references_parent_product()
        {
            var product = new Product("Foo", "IFoo");

            var child = product.CreateElement("Storage", "IStorage");

            Assert.Same(child.Parent, product);
        }
        public void when_creating_element_then_raises_component_added()
        {
            var product = new Product("Foo", "IFoo");
            var added = default(IComponent);

            product.ComponentAdded += (sender, args) => added = args.Value;

            var child = product.CreateElement("Storage", "IStorage");

            Assert.NotNull(added);
            Assert.Same(added, child);
        }
        public void when_disposing_element_then_does_not_remove_from_parent()
        {
            var product = new Product("Foo", "IFoo");
            var child = product.CreateElement("Storage", "IStorage");

            child.Dispose();

            Assert.Equal(1, product.Components.Count());
        }
        public void when_mapping_product_then_removes_elements_with_no_matching_schema()
        {
            var toolkit = new ToolkitSchema("Toolkit", "1.0");
            var schema = toolkit.CreateProductSchema("IProduct");
            schema.CreateElementSchema("IElement");

            var product = new Product("Product", "IProduct");
            var element = product.CreateElement("Element", "IFoo");

            Assert.Equal(1, product.Components.Count());

            ComponentMapper.SyncProduct(product, (IProductInfo)schema);

            Assert.Equal(0, product.Components.Count());
            Assert.Null(element.Parent);
        }