public void BuildTree_WithMultipleItems()
        {
            // Arrange
            var items = new List <Item>();

            var item1 = new Item();

            item1.Criteria.Add("controller", new DecisionCriterionValue(value: "Store"));
            item1.Criteria.Add("action", new DecisionCriterionValue(value: "Buy"));
            items.Add(item1);

            var item2 = new Item();

            item2.Criteria.Add("controller", new DecisionCriterionValue(value: "Store"));
            item2.Criteria.Add("action", new DecisionCriterionValue(value: "Checkout"));
            items.Add(item2);

            // Act
            var tree = DecisionTreeBuilder <Item> .GenerateTree(items, new ItemClassifier());

            // Assert
            Assert.Empty(tree.Matches);

            var action = Assert.Single(tree.Criteria);

            Assert.Equal("action", action.Key);

            var buy = action.Branches["Buy"];

            Assert.Empty(buy.Matches);

            var controller = Assert.Single(buy.Criteria);

            Assert.Equal("controller", controller.Key);

            var store = Assert.Single(controller.Branches);

            Assert.Equal("Store", store.Key);
            Assert.Empty(store.Value.Criteria);
            Assert.Same(item1, Assert.Single(store.Value.Matches));

            var checkout = action.Branches["Checkout"];

            Assert.Empty(checkout.Matches);

            controller = Assert.Single(checkout.Criteria);
            Assert.Equal("controller", controller.Key);

            store = Assert.Single(controller.Branches);
            Assert.Equal("Store", store.Key);
            Assert.Empty(store.Value.Criteria);
            Assert.Same(item2, Assert.Single(store.Value.Matches));
        }
        public void BuildTree_Empty()
        {
            // Arrange
            var items = new List <Item>();

            // Act
            var tree = DecisionTreeBuilder <Item> .GenerateTree(items, new ItemClassifier());

            // Assert
            Assert.Empty(tree.Criteria);
            Assert.Empty(tree.Matches);
        }
        public void BuildTree_TrivialMatch()
        {
            // Arrange
            var items = new List <Item>();

            var item = new Item();

            items.Add(item);

            // Act
            var tree = DecisionTreeBuilder <Item> .GenerateTree(items, new ItemClassifier());

            // Assert
            Assert.Empty(tree.Criteria);
            Assert.Same(item, Assert.Single(tree.Matches));
        }
        public void BuildTree_WithMultipleCriteria()
        {
            // Arrange
            var items = new List <Item>();

            var item = new Item();

            item.Criteria.Add("area", new DecisionCriterionValue(value: "Admin"));
            item.Criteria.Add("controller", new DecisionCriterionValue(value: "Users"));
            item.Criteria.Add("action", new DecisionCriterionValue(value: "AddUser"));
            items.Add(item);

            // Act
            var tree = DecisionTreeBuilder <Item> .GenerateTree(items, new ItemClassifier());

            // Assert
            Assert.Empty(tree.Matches);

            var area = Assert.Single(tree.Criteria);

            Assert.Equal("area", area.Key);

            var admin = Assert.Single(area.Branches);

            Assert.Equal("Admin", admin.Key);
            Assert.Empty(admin.Value.Matches);

            var controller = Assert.Single(admin.Value.Criteria);

            Assert.Equal("controller", controller.Key);

            var users = Assert.Single(controller.Branches);

            Assert.Equal("Users", users.Key);
            Assert.Empty(users.Value.Matches);

            var action = Assert.Single(users.Value.Criteria);

            Assert.Equal("action", action.Key);

            var addUser = Assert.Single(action.Branches);

            Assert.Equal("AddUser", addUser.Key);
            Assert.Empty(addUser.Value.Criteria);
            Assert.Same(item, Assert.Single(addUser.Value.Matches));
        }
        public void BuildTree_WithDivergentCriteria()
        {
            // Arrange
            var items = new List <Item>();

            var item1 = new Item();

            item1.Criteria.Add("controller", new DecisionCriterionValue(value: "Store"));
            item1.Criteria.Add("action", new DecisionCriterionValue(value: "Buy"));
            items.Add(item1);

            var item2 = new Item();

            item2.Criteria.Add("controller", new DecisionCriterionValue(value: "Store"));
            item2.Criteria.Add("action", new DecisionCriterionValue(value: "Checkout"));
            items.Add(item2);

            var item3 = new Item();

            item3.Criteria.Add("stub", new DecisionCriterionValue(value: "Bleh"));
            items.Add(item3);

            // Act
            var tree = DecisionTreeBuilder <Item> .GenerateTree(items, new ItemClassifier());

            // Assert
            Assert.Empty(tree.Matches);

            var action = tree.Criteria[0];

            Assert.Equal("action", action.Key);

            var stub = tree.Criteria[1];

            Assert.Equal("stub", stub.Key);
        }
        public void BuildTree_WithInteriorMatch()
        {
            // Arrange
            var items = new List <Item>();

            var item1 = new Item();

            item1.Criteria.Add("controller", new DecisionCriterionValue(value: "Store"));
            item1.Criteria.Add("action", new DecisionCriterionValue(value: "Buy"));
            items.Add(item1);

            var item2 = new Item();

            item2.Criteria.Add("controller", new DecisionCriterionValue(value: "Store"));
            item2.Criteria.Add("action", new DecisionCriterionValue(value: "Checkout"));
            items.Add(item2);

            var item3 = new Item();

            item3.Criteria.Add("action", new DecisionCriterionValue(value: "Buy"));
            items.Add(item3);

            // Act
            var tree = DecisionTreeBuilder <Item> .GenerateTree(items, new ItemClassifier());

            // Assert
            Assert.Empty(tree.Matches);

            var action = Assert.Single(tree.Criteria);

            Assert.Equal("action", action.Key);

            var buy = action.Branches["Buy"];

            Assert.Same(item3, Assert.Single(buy.Matches));
        }