public void TestEmulateExpandEventAsync()
 {
     NativeTree tree = new NativeTree(testDlg.IdentifyFromDialogId(1042));
     Async async = new Async();
     tree.EmulateExpand(tree.Nodes[0], true, async);
     Assert.IsTrue(0 < MessageBoxUtility.CloseAll(testDlg, async));
 }
        public void TestEmulateExpandEvent()
        {
            NativeTree tree = new NativeTree(testDlg.IdentifyFromDialogId(1041));

            //経験から発見されたTreeの性質として、一度開いた後はExpnadメッセージで後の通知が発生しない。
            //そのため、別途通知を投げている。その確認。
            Assert.IsTrue(EventChecker.IsSameTestEvent(testDlg,
                delegate { tree.EmulateExpand(tree.Nodes[1], true); },
                new CodeInfo[] { new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGING),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGED),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGING),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGED)},
                    new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDING),
                    new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDED)
                ));
            Assert.IsTrue(EventChecker.IsSameTestEvent(testDlg,
                delegate { tree.EmulateExpand(tree.Nodes[1], false); },
                new CodeInfo[] { new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGING),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGED),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGING),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGED)},
                    new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDING),
                    new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDED)
                ));
            Assert.IsTrue(EventChecker.IsSameTestEvent(testDlg,
                delegate { tree.EmulateExpand(tree.Nodes[1], true); },
                new CodeInfo[] { new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGING),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGED),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGING),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGED)},
                    new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDING),
                    new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDED)
                ));

            //詳細な通知内容の確認。
            NMTREEVIEW[] expectation = new NMTREEVIEW[2];
            expectation[0].action = expectation[1].action = 1;
            expectation[0].itemNew.cChildren = expectation[1].itemNew.cChildren = 0;
            expectation[0].itemNew.cchTextMax = expectation[1].itemNew.cchTextMax = 0;
            expectation[0].itemNew.hItem = expectation[1].itemNew.hItem = tree.Nodes[1];
            expectation[0].itemNew.iImage = expectation[1].itemNew.iImage = 3;
            expectation[0].itemNew.iSelectedImage = expectation[1].itemNew.iSelectedImage = 4;
            expectation[0].itemNew.lParam = expectation[1].itemNew.lParam = new IntPtr(101);
            expectation[0].itemNew.mask = expectation[1].itemNew.mask = (int)(TVIF.IMAGE | TVIF.PARAM | TVIF.STATE | TVIF.HANDLE | TVIF.SELECTEDIMAGE);
            expectation[0].itemNew.pszText = expectation[1].itemNew.pszText = IntPtr.Zero;
            expectation[0].itemNew.state = 0x1060;
            expectation[1].itemNew.state = 0x1040;
            expectation[0].itemNew.stateMask = expectation[1].itemNew.stateMask = 0xffff;
            Assert.IsTrue(EventChecker.CheckNotifyDetail(testDlg,
                delegate { tree.EmulateExpand(tree.Nodes[1], false); },
                expectation));
            
        }
        public void TestSetGetItem()
        {
            NativeTree tree = new NativeTree(testDlg.IdentifyFromDialogId(1041));
            TVITEMEX item = new TVITEMEX();
            foreach (TVIF element in (TVIF[])Enum.GetValues(typeof(TVIF)))
            {
                item.mask |= element;
            }
            foreach (TVIS element in (TVIS[])Enum.GetValues(typeof(TVIS)))
            {
                item.stateMask |= element;
            }

            //アイテムのすべての情報が正常に取得できることを確認。
            item.hItem = tree.Nodes[0];
            tree.GetItem(item);
            Assert.AreEqual("0", item.pszText);
            Assert.AreEqual(0, item.iImage);
            Assert.AreEqual(4, item.iSelectedImage);
            Assert.AreEqual(1, item.cChildren);
            Assert.AreEqual(new IntPtr(100), item.lParam);
            Assert.AreEqual((TVIS)0, (item.state & TVIS.EXPANDED));
            tree.EmulateExpand(item.hItem, true);
            tree.GetItem(item);
            Assert.AreEqual(TVIS.EXPANDED, (item.state & TVIS.EXPANDED));
            item.hItem = tree.FindNode(0, 0); //iImageは上記では0確認であるため、念のため、値の入ったアイテムでもテスト。
            tree.GetItem(item);
            Assert.AreEqual(1, item.iImage);

            //全ての情報情報を設定できることを確認。
            item.hItem = tree.Nodes[0];
            tree.GetItem(item);//もとに戻す用
            TVITEMEX newItem = new TVITEMEX();
            newItem.hItem = item.hItem;
            newItem.mask = item.mask;
            newItem.pszText = "xxx";
            newItem.iImage = 1;
            newItem.iSelectedImage = 2;
            newItem.cChildren = 0;
            newItem.lParam = new IntPtr(200);
            newItem.stateMask = TVIS.SELECTED;
            newItem.state = TVIS.SELECTED;
            tree.EmulateChangeItem(newItem);

            TVITEMEX check = new TVITEMEX();
            check.hItem = item.hItem;
            check.mask = item.mask;
            check.stateMask = item.stateMask;
            tree.GetItem(check);
            Assert.AreEqual("xxx", check.pszText);
            Assert.AreEqual(1, check.iImage);
            Assert.AreEqual(2, check.iSelectedImage);
            Assert.AreEqual(0, check.cChildren);
            Assert.AreEqual(new IntPtr(200), check.lParam);
            Assert.AreEqual(TVIS.SELECTED, check.state & TVIS.SELECTED);
        }
        public void TestEnsureVisible()
        {
            NativeTree tree = new NativeTree(testDlg.IdentifyFromDialogId(1041));
            tree.EmulateExpand(tree.Nodes[1], true);
            IntPtr node = tree.FindNode(1, 99);
            RECT native = new RECT();
            NativeMethods.GetWindowRect(tree.Handle, out native);

            Rectangle rect = new Rectangle(0, 0, native.Right - native.Left + 1, native.Bottom - native.Top + 1);
            Assert.IsFalse(rect.Contains(tree.GetItemRect(node, false)));
            Assert.IsTrue(tree.EnsureVisible(node));
            Assert.IsTrue(rect.Contains(tree.GetItemRect(node, false)));
        }
        public void TestExpanded()
        {
            NativeTree tree = new NativeTree(testDlg.IdentifyFromDialogId(1041));
            tree.EmulateExpand(tree.Nodes[0], true);
            Assert.IsTrue(tree.IsExpanded(tree.Nodes[0]));
            tree.EmulateExpand(tree.Nodes[0], false);
            Assert.IsFalse(tree.IsExpanded(tree.Nodes[0]));

            //非同期でも同様の効果があることの確認。
            Async a = new Async();
            tree.EmulateExpand(tree.Nodes[0], true, a);
            while (!a.IsCompleted)
            {
                Thread.Sleep(10);
            }
            Assert.IsTrue(tree.IsExpanded(tree.Nodes[0]));
        }