/**
 * 
 */
package org.jdesktop.swingx.treetable;

import java.util.Enumeration;

import javax.swing.tree.DefaultMutableTreeNode;

import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.junit.Test;
import org.junit.Before;
import org.junit.After;


import junit.framework.TestCase;

/**
 *
 */
@RunWith(JUnit4.class)
public class DefaultMutableTreeTableNodeUnitTest extends TestCase {
    @Test
     public void testAdd() {
         DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode("root");
         
         assertEquals(root.getChildCount(), 0);
         
         root.add(new DefaultMutableTreeTableNode("a"));
         
         assertEquals(root.getChildCount(), 1);
         
         root.add(new DefaultMutableTreeTableNode("a"));
         
         assertEquals(root.getChildCount(), 2);
     }
     
    @Test
     public void testAddDoesNotDuplicate() {
         DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode("root");
         
         assertEquals(root.getChildCount(), 0);
         
         DefaultMutableTreeTableNode a = new DefaultMutableTreeTableNode("a");
         root.add(a);
         
         assertEquals(root.getChildCount(), 1);
         
         root.add(a);
         
         assertEquals(root.getChildCount(), 1);
     }
     
    @Test
     public void testChildren() {
         DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode("root");
         
         Enumeration<? extends MutableTreeTableNode> children = root.children();
         
         while (children.hasMoreElements()) {
             fail("This enumaration should have no elements");
         }
         
         DefaultMutableTreeTableNode a = new DefaultMutableTreeTableNode("a");
         DefaultMutableTreeTableNode b = new DefaultMutableTreeTableNode("b");
         DefaultMutableTreeTableNode c = new DefaultMutableTreeTableNode("c");
         DefaultMutableTreeTableNode d = new DefaultMutableTreeTableNode("d");
         
         root.add(a);
         root.add(b);
         root.add(c);
         root.add(d);
         
         children = root.children();
         
         assertEquals(children.nextElement(), a);
         assertEquals(children.nextElement(), b);
         assertEquals(children.nextElement(), c);
         assertEquals(children.nextElement(), d);
         assertFalse(children.hasMoreElements());
     }
     
    @Test
     public void testAllowsChildren() {
         DefaultMutableTreeTableNode empty = new DefaultMutableTreeTableNode();
         assertTrue(empty.getAllowsChildren());
         empty.setAllowsChildren(!empty.getAllowsChildren());
         assertFalse(empty.getAllowsChildren());
         empty.setAllowsChildren(!empty.getAllowsChildren());
         assertTrue(empty.getAllowsChildren());
         
         DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode("root");
         assertTrue(root.getAllowsChildren());
         root.setAllowsChildren(!root.getAllowsChildren());
         assertFalse(root.getAllowsChildren());
         root.setAllowsChildren(!root.getAllowsChildren());
         assertTrue(root.getAllowsChildren());
         
         DefaultMutableTreeTableNode a = new DefaultMutableTreeTableNode("a", true);
         assertTrue(a.getAllowsChildren());
         a.setAllowsChildren(!a.getAllowsChildren());
         assertFalse(a.getAllowsChildren());
         a.setAllowsChildren(!a.getAllowsChildren());
         assertTrue(a.getAllowsChildren());
         
         DefaultMutableTreeTableNode b = new DefaultMutableTreeTableNode("b", false);
         assertFalse(b.getAllowsChildren());
         b.setAllowsChildren(!b.getAllowsChildren());
         assertTrue(b.getAllowsChildren());
         b.setAllowsChildren(!b.getAllowsChildren());
         assertFalse(b.getAllowsChildren());
     }
     
    @Test
     public void testGetChildAt() {
         DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode("root");
         
         try {
             root.getChildAt(-1);
             fail("expected IndexOutOfBoundsException");
         } catch (IndexOutOfBoundsException e) {
             //do nothing
         }
         
         try {
             root.getChildAt(root.getChildCount());
             fail("expected IndexOutOfBoundsException");
         } catch (IndexOutOfBoundsException e) {
             //do nothing
         }
         
         DefaultMutableTreeTableNode a = new DefaultMutableTreeTableNode("a");
         DefaultMutableTreeTableNode b = new DefaultMutableTreeTableNode("b");
         DefaultMutableTreeTableNode c = new DefaultMutableTreeTableNode("c");
         DefaultMutableTreeTableNode d = new DefaultMutableTreeTableNode("d");
         
         root.add(a);
         root.add(b);
         root.add(c);
         root.add(d);

         assertEquals(root.getChildAt(0), a);
         assertEquals(root.getChildAt(1), b);
         assertEquals(root.getChildAt(2), c);
         assertEquals(root.getChildAt(3), d);
         
         try {
             root.getChildAt(root.getChildCount());
             fail("expected IndexOutOfBoundsException");
         } catch (IndexOutOfBoundsException e) {
             //do nothing
         }
     }
     
    @Test
     public void testGetChildCount() {
         DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode("root");
         
         assertEquals(root.getChildCount(), 0);
         
         DefaultMutableTreeTableNode a = new DefaultMutableTreeTableNode("a");
         root.add(a);
         assertEquals(root.getChildCount(), 1);
         
         DefaultMutableTreeTableNode b = new DefaultMutableTreeTableNode("b");
         root.add(b);
         assertEquals(root.getChildCount(), 2);
         
         DefaultMutableTreeTableNode c = new DefaultMutableTreeTableNode("c");
         root.add(c);
         assertEquals(root.getChildCount(), 3);
         
         DefaultMutableTreeTableNode d = new DefaultMutableTreeTableNode("d");
         root.add(d);
         assertEquals(root.getChildCount(), 4);

         root.remove(a);
         assertEquals(root.getChildCount(), 3);
         
         root.remove(b);
         assertEquals(root.getChildCount(), 2);
         
         root.remove(c);
         assertEquals(root.getChildCount(), 1);
         
         root.remove(d);
         assertEquals(root.getChildCount(), 0);
     }
     
    @Test
     public void testGetIndex() {
         DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode("root");
         
         assertEquals(root.getIndex(null), -1);
         
         assertEquals(root.getIndex(new DefaultMutableTreeNode()), -1);
         
         assertEquals(root.getIndex(new DefaultMutableTreeTableNode()), -1);
         
         DefaultMutableTreeTableNode a = new DefaultMutableTreeTableNode("a");
         root.add(a);
         assertEquals(root.getIndex(a), 0);
         
         DefaultMutableTreeTableNode b = new DefaultMutableTreeTableNode("b");
         root.add(b);
         assertEquals(root.getIndex(b), 1);
         
         DefaultMutableTreeTableNode c = new DefaultMutableTreeTableNode("c");
         root.add(c);
         assertEquals(root.getIndex(c), 2);
         
         DefaultMutableTreeTableNode d = new DefaultMutableTreeTableNode("d");
         root.add(d);
         assertEquals(root.getIndex(d), 3);
     }
     
    @Test
     public void testGetParent() {
         DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode("root");

         assertNull(root.getParent());
         
         DefaultMutableTreeTableNode a = new DefaultMutableTreeTableNode("a");
         a.setParent(root);
         
         assertEquals(a.getParent(), root);
         assertEquals(root.getChildAt(0), a);
         
         DefaultMutableTreeTableNode b = new DefaultMutableTreeTableNode("b");
         b.setParent(root);
         
         assertEquals(b.getParent(), root);
         assertEquals(root.getChildAt(1), b);
         
         DefaultMutableTreeTableNode c = new DefaultMutableTreeTableNode("c");
         c.setParent(root);
         
         assertEquals(c.getParent(), root);
         assertEquals(root.getChildAt(2), c);
         
         DefaultMutableTreeTableNode d = new DefaultMutableTreeTableNode("d");
         d.setParent(root);
         
         assertEquals(d.getParent(), root);
         assertEquals(root.getChildAt(3), d);
         
         a.setParent(d);
         
         assertEquals(root.getChildCount(), 3);
         assertEquals(a.getParent(), d);
         assertEquals(d.getChildAt(0), a);
         
         b.setAllowsChildren(false);
         
         try {
             c.setParent(b);
             fail("expected IllegalArgumentException");
         } catch (IllegalArgumentException e) {
             //do nothing
         }
         
         assertEquals(c.getParent(), root);
         assertEquals(b.getChildCount(), 0);
     }
     
    @Test
     public void testSetParent() {
         DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode("root");
         DefaultMutableTreeTableNode a = new DefaultMutableTreeTableNode("a");
         root.add(a);
         assertEquals(root.getChildCount(), 1);
         
         a.setParent(null);
         assertEquals(root.getChildCount(), 0);
         
         a.setParent(root);
         assertEquals(root.getChildCount(), 1);
         
         a.setParent(null);
         assertEquals(root.getChildCount(), 0);
         
         root.setAllowsChildren(false);
         try {
             a.setParent(root);
             fail("should throw IllegalArgumentException");
         } catch (IllegalArgumentException e) {
             //success
         }
     }
     
    @Test
     public void testUserObject() {
         DefaultMutableTreeTableNode empty = new DefaultMutableTreeTableNode();
         assertNull(empty.getUserObject());
         empty.setUserObject("root");
         assertEquals(empty.getUserObject(), "root");
         
         DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode("root");
         assertEquals(root.getUserObject(), "root");
//         root.setAllowsChildren(!root.getAllowsChildren());
//         assertFalse(root.getAllowsChildren());
//         root.setAllowsChildren(!root.getAllowsChildren());
//         assertTrue(root.getAllowsChildren());
//         
//         DefaultMutableTreeTableNode a = new DefaultMutableTreeTableNode("a", true);
//         assertTrue(a.getAllowsChildren());
//         a.setAllowsChildren(!a.getAllowsChildren());
//         assertFalse(a.getAllowsChildren());
//         a.setAllowsChildren(!a.getAllowsChildren());
//         assertTrue(a.getAllowsChildren());
//         
//         DefaultMutableTreeTableNode b = new DefaultMutableTreeTableNode("b", false);
//         assertFalse(b.getAllowsChildren());
//         b.setAllowsChildren(!b.getAllowsChildren());
//         assertTrue(b.getAllowsChildren());
//         b.setAllowsChildren(!b.getAllowsChildren());
//         assertFalse(b.getAllowsChildren());
     }
}
