public void TestResetItemsSource()
        {
            AvalonTestRunner.RunInSTA(delegate
              {
                  //populate sample data
                  List<string> businessObjects = new List<string>(4);
                  businessObjects.Add("A");
                  businessObjects.Add("AA");
                  businessObjects.Add("AAA");
                  businessObjects.Add("AAAA");
                  businessObjects.Add("AAAA");

                  TreeListBox treeListBox = new TreeListBox();
                  treeListBox.ExposedGenerateItemsSource(businessObjects);

                  //check that there are 4 items in the items source and that they are of type TreeLiistBoxInfo
                  Assert.AreEqual(5, treeListBox.Items.Count,
                                  "Invalid number of items added");
                  for (int i = 0; i < treeListBox.Items.Count; i++)
                  {
                      Assert.AreEqual(typeof (TreeListBoxInfo),
                                      treeListBox.Items[i].GetType(),
                                      "Invalid type added to tree list box");
                  }
              });
        }
        public void TestItemsSourceCollectionNotifications()
        {
            AvalonTestRunner.RunInSTA(delegate
              {
                  //populate sample data
                  ObservableCollection<string> businessObjects =
                      new ObservableCollection<string>();
                  businessObjects.Add("A");
                  businessObjects.Add("AA");
                  businessObjects.Add("AAA");
                  businessObjects.Add("AAAA");

                  TreeListBox treeListBox = new TreeListBox();
                  treeListBox.ExposedGenerateItemsSource(businessObjects);
                  Assert.AreEqual(4, treeListBox.Items.Count,
                                  "Invalid number of items added");

                  //add anew item and verify that this item was added to the items source
                  businessObjects.Add("NewItem1");
                  //check the Count
                  Assert.AreEqual(5, treeListBox.Items.Count,
                                  "Invalid number of items added");
                  //check the position of the item
                  Assert.AreEqual("NewItem1",
                                  ((TreeListBoxInfo) treeListBox.Items[4]).DataItem,
                                  "Item was added at an invalid index");

                  //insert another item in the begining of the list
                  businessObjects.Insert(1, "NewItem2");
                  //check the Count
                  Assert.AreEqual(6, treeListBox.Items.Count,
                                  "Invalid number of items added");
                  //check the position of the item
                  Assert.AreEqual("NewItem2",
                                  ((TreeListBoxInfo) treeListBox.Items[1]).DataItem,
                                  "Item was added at an invalid index");

                  //Check the remove
                  businessObjects.RemoveAt(1);
                  //check the Count
                  Assert.AreEqual(5, treeListBox.Items.Count,
                                  "Invalid number of items added");
                  //validate that the item was deleted properly
                  for (int i = 0; i < treeListBox.Items.Count; i++)
                      Assert.AreNotEqual("NewItem2",
                                         ((TreeListBoxInfo) treeListBox.Items[i]).DataItem,
                                         "Item was removed from the wrong index");
              });
        }
        public void TestPopulationOfChildrenFromNotifications()
        {
            AvalonTestRunner.RunInSTA(delegate
            {
                //children collection
                ObservableCollection<MockHierarchalObject> childNodes =
                    new ObservableCollection<MockHierarchalObject>(
                        new List<MockHierarchalObject>(new MockHierarchalObject[]
                                                         {
                                                             //children
                                                             new MockHierarchalObject(
                                                                 "child1 of A"),
                                                             new MockHierarchalObject(
                                                                 "child2 of A"),
                                                             new MockHierarchalObject(
                                                                 "child3 of A"),
                                                         }));

                //create sample data
                MockHierarchalObject dataSource =
                    new MockHierarchalObject("A", childNodes);

                //prepare the parent collection
                TreeListBox parentControl = new TreeListBox();
                parentControl.ChildItemSourcePath = "Children";
                parentControl.ExposedGenerateItemsSource(new MockHierarchalObject[]
                                                           {
                                                               new MockHierarchalObject(
                                                                   "First, item with no children")
                                                               ,
                                                               //add a simple item that has no children
                                                               dataSource,
                                                               //add the item that has children to test on
                                                               new MockHierarchalObject(
                                                                   "Last, item with no children")
                                                           });

                Assert.AreEqual(3, parentControl.Items.Count, "Invalid number of items");
                //create an item to test
                TreeListBoxItem item = new TreeListBoxItem(parentControl);
                item.ExposePrepareItem(parentControl.Items[1] as TreeListBoxInfo);
                //pass the info that was create for the item that has children

                //expand the item this should result in the items source of the parent include the children
                item.IsExpanded = true;
                //3 root nodes and 3 children are suppose to be in the list
                Assert.AreEqual(3 + 3, parentControl.Items.Count,
                                "Invalid number of items");

                //add a new item to child collection and check if it is added
                childNodes.Add(new MockHierarchalObject("child4 of A"));
                //3 root nodes and 3 + 1(which is the new one) children are suppose to be in the list
                Assert.AreEqual(3 + childNodes.Count, parentControl.Items.Count,
                                "Invalid number of items");
                //check the index of the new item in the flat list
                //1 is the index of the container item, and 4 is the count of the children
                Assert.AreEqual("child4 of A",
                                ((MockHierarchalObject)
                                 ((TreeListBoxInfo)parentControl.Items[1 + 4]).DataItem).
                                    Text,
                                "Item was not added in the right index");

                //check that the insert in a specific index
                childNodes.Insert(2, new MockHierarchalObject("inserted child of A"));
                Assert.AreEqual(3 + childNodes.Count, parentControl.Items.Count,
                                "Invalid number of items");
                //check that the insert was done in the right index(where 1 is the parent index and 2 is the index in the children collection)
                Assert.AreEqual("inserted child of A",
                                ((MockHierarchalObject)
                                 ((TreeListBoxInfo)parentControl.Items[1 + 3]).DataItem).
                                    Text,
                                "Item was not added in the right index");

                //check the remove of items
                childNodes.RemoveAt(2);
                //check the Count
                Assert.AreEqual(3 + childNodes.Count, parentControl.Items.Count,
                                "Invalid number of items added");
                //validate that the item was deleted properly
                for (int i = 0; i < parentControl.Items.Count; i++)
                    Assert.AreNotEqual("inserted child of A",
                                       ((MockHierarchalObject)
                                        ((TreeListBoxInfo)parentControl.Items[i]).
                                            DataItem).Text,
                                       "Item was removed from the wrong index");

                //check that if we collapse the items no children are add
                item.IsExpanded = false;
                //check that the items where collapsed
                Assert.AreEqual(3, parentControl.Items.Count,
                                "Invalid number of items after collapse item");

                childNodes.Add(new MockHierarchalObject("Test collapse"));
                //check that the item was not added to the flat list since the item is collapsed
                Assert.AreEqual(3, parentControl.Items.Count,
                                "Invalid number of items after collapse item");

                //check that when you re expand the item all items are generated
                item.IsExpanded = true;
                Assert.AreEqual(3 + childNodes.Count, parentControl.Items.Count,
                                "Invalid number of items after collapse item");
            });
        }
        public void TestPopulationOfChildren()
        {
            AvalonTestRunner.RunInSTA(delegate
            {
                //create sample data
                MockHierarchalObject dataSource =
                    new MockHierarchalObject("A",
                                             new List<MockHierarchalObject>(
                                                 new MockHierarchalObject[]
                                                   {
                                                       //children
                                                       new MockHierarchalObject(
                                                           "child1 of A"),
                                                       new MockHierarchalObject(
                                                           "child2 of A"),
                                                       new MockHierarchalObject(
                                                           "child3 of A"),
                                                   }));

                //prepare the parent collection
                TreeListBox parentControl = new TreeListBox();
                parentControl.ChildItemSourcePath = "Children";
                parentControl.ExposedGenerateItemsSource(new MockHierarchalObject[]
                                                           {
                                                               new MockHierarchalObject(
                                                                   "First, item with no children")
                                                               ,
                                                               //add a simple item that has no children
                                                               dataSource,
                                                               //add the item that has children to test on
                                                               new MockHierarchalObject(
                                                                   "Last, item with no children")
                                                           });
                Assert.AreEqual(3, parentControl.Items.Count, "Invalid number of items");
                //create an item to test
                TreeListBoxItem item = new TreeListBoxItem(parentControl);
                item.ExposePrepareItem(parentControl.Items[1] as TreeListBoxInfo);
                //pass the info that was create for the item that has children

                //expand the item this should result in the items source of the parent include the children
                item.IsExpanded = true;
                //3 root nodes and 3 children are suppose to be in the list
                Assert.AreEqual(3 + 3, parentControl.Items.Count,
                                "Invalid number of items");

                //check that the items where create in the right indeces
                Assert.AreEqual("child1 of A",
                                ((MockHierarchalObject)
                                 ((TreeListBoxInfo)parentControl.Items[2]).DataItem).Text,
                                "Child Item was placed in the wrong index");
                //validate that the last item(which is index to of the root nodes) of the root nodes has been moved to the proper index
                //2 is the index in the root nodes, 3 is the count of the children, so the last item should have moved to index 5
                Assert.AreEqual("Last, item with no children",
                                ((MockHierarchalObject)
                                 ((TreeListBoxInfo)parentControl.Items[2 + 3]).DataItem).
                                    Text,
                                "Root Item was placed in the wrong index");

                //validate that the level of the items has been incremented
                //start from index 2, since the children are place at index 2
                for (int i = 2; i < 3 + 2; i++)
                    Assert.AreEqual(1, ((TreeListBoxInfo)parentControl.Items[i]).Level,
                                    "Invalid level set for child nodes");

                //Validate the Collapse
                item.IsExpanded = false;

                //all children should be dropped
                Assert.AreEqual(3, parentControl.Items.Count, "Invalid number of items");

                //check that the indeces of the items is back to normal
                Assert.AreEqual("First, item with no children",
                                ((MockHierarchalObject)
                                 ((TreeListBoxInfo)parentControl.Items[0]).DataItem).Text,
                                "Root Item was placed in the wrong index");
                Assert.AreEqual("A",
                                ((MockHierarchalObject)
                                 ((TreeListBoxInfo)parentControl.Items[1]).DataItem).Text,
                                "Root Item was placed in the wrong index");
                Assert.AreEqual("Last, item with no children",
                                ((MockHierarchalObject)
                                 ((TreeListBoxInfo)parentControl.Items[2]).DataItem).Text,
                                "Root Item was placed in the wrong index");
            });
        }