Package org.freeplane.plugin.script.proxy

Source Code of org.freeplane.plugin.script.proxy.ScriptApiTest$TestException

package org.freeplane.plugin.script.proxy;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import org.freeplane.core.util.FreeplaneIconUtils;
import org.freeplane.core.util.HtmlUtils;
import org.freeplane.core.util.LogUtils;
import org.freeplane.features.filter.Filter;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.text.NodeContainsCondition;
import org.freeplane.features.text.TextController;
import org.freeplane.features.ui.ViewController;
import org.freeplane.plugin.script.proxy.Proxy.Map;
import org.freeplane.plugin.script.proxy.Proxy.Node;

public class ScriptApiTest {
  ControllerProxy c;
  NodeProxy node;
  private Map map;
  private Comparator<NodeProxy> nodeComparator = new Comparator<NodeProxy>() {
    public int compare(NodeProxy o1, NodeProxy o2) {
      return new Integer(System.identityHashCode(o1.getDelegate())).compareTo(System.identityHashCode(o2
          .getDelegate()));
    }
  };

  @SuppressWarnings("serial")
  public static class TestException extends RuntimeException {
    public TestException(String message, Throwable cause) {
      super(message, cause);
    }

    public TestException(String message) {
      super(message);
    }
  }

  public ScriptApiTest(ControllerProxy c, NodeProxy node) {
    this.c = c;
    this.node = node;
  }

  public static void runAll(ControllerProxy c, NodeProxy node) {
    final long startMillis = System.currentTimeMillis();
    int failures = 0;
    int errors = 0;
    int pass = 0;
    Method tearDown = null;
    try {
      tearDown = ScriptApiTest.class.getMethod("tearDown");
    }
    catch (Exception e) {
      // ignore
    }
    for (Method method : ScriptApiTest.class.getMethods()) {
      if (!method.getName().startsWith("test"))
        continue;
      // new fixture
      final ScriptApiTest instance = new ScriptApiTest(c, node);
      try {
        method.invoke(instance);
        LogUtils.info(method.getName() + ": pass");
        pass++;
      }
      catch (InvocationTargetException e) {
        if (e.getCause() instanceof TestException) {
          LogUtils.warn(method.getName() + ": failure: " + e.getCause().getMessage(), e.getCause());
          failures++;
        }
        else {
          LogUtils.warn(method.getName() + ": error invoking test: " + e.getCause().getMessage(), e
              .getCause());
          errors++;
        }
      }
      catch (Throwable e) {
        LogUtils.warn(method.getName() + ": other error: " + e.getMessage(), e);
        errors++;
      }
      finally {
        try {
          if (tearDown != null)
            tearDown.invoke(instance);
        }
        catch (Throwable e) {
          LogUtils.warn("failure executing tearDown after " + method.getName(), e);
        }
      }
    }
    double seconds = (System.currentTimeMillis() - startMillis) / 1000.;
    String message = null;
    String iconKey = null;
    if (errors + failures == 0) {
      message = "success! " + pass + " tests passed in " + seconds + " seconds";
      iconKey = "button_ok";
    }
    else {
      message = "error! test result: " + errors + " errors, " + failures + " failures; " + pass
              + " tests passed in " + seconds + " seconds";
      iconKey = "button_cancel";
    }
    LogUtils.info(message);
    c.setStatusInfo(ViewController.STANDARD_STATUS_INFO_KEY, message, iconKey);
  }

  public void tearDown() {
    if (map != null)
      map.close(true, false);
  }

  @SuppressWarnings("deprecation")
  public void test_AttributesRO_get_String_name() {
    map = setupMapWithSomeAttributes();
    assertEquals("first value should be found", "va1", map.getRoot().getAttributes().get("a1"));
    assertEquals("should return null for non-existing attributes", null, map.getRoot().getAttributes().get("x"));
  }

  private Map setupMapWithSomeAttributes() {
    createTestMap();
    map.getRoot().getAttributes().add("a1", "va1");
    map.getRoot().getAttributes().add("a1", "va2");
    map.getRoot().getAttributes().add("a1", "va3");
    map.getRoot().getAttributes().add("b1", "vb1");
    return map;
  }

  private void assertEquals(String message, Object expected, Object actual) {
    message = (message == null || message.length() == 0) ? "Failure" : message;
    boolean isEqual = expected == null && actual == null || expected != null && actual != null
            && expected.equals(actual);
    if (!isEqual) {
      fail(message + ". Expected: " + expected + ", but was: " + actual);
    }
  }

  private void assertTrue(String message, boolean test) {
    if (!test)
      fail(message);
  }

  private void assertFalse(String message, boolean test) {
    if (test)
      fail(message);
  }

  private void fail(final String m) {
    throw new TestException(m);
  }

  private Map createTestMap() {
    map = c.newMap();
    map.getRoot().createChild("first node");
    map.getRoot().createChild("second node");
    return map;
  }

  private Node firstChild(final Node node) {
    return node.getChildren().get(0);
  }

  private Node firstChild() {
    return firstChild(map.getRoot());
  }

  public void test_AttributesRO_getAll_String_name() {
    map = setupMapWithSomeAttributes();
    assertEquals("all values should be found", list("va1", "va2", "va3"), map.getRoot().getAttributes().getAll(
        "a1"));
    assertEquals("all values should be found", Collections.singletonList("vb1"), map.getRoot().getAttributes()
        .getAll("b1"));
    assertEquals("should return empty list for non-existing attributes", Collections.EMPTY_LIST, map.getRoot()
        .getAttributes().getAll("x"));
  }

  @SuppressWarnings("deprecation")
    public void test_AttributesRO_getAttributeNames() {
    map = setupMapWithSomeAttributes();
    assertEquals("all names should be found", list("a1", "a1", "a1", "b1"), map.getRoot().getAttributes()
        .getAttributeNames());
  }

  public void test_AttributesRO_get_int_index() {
    map = setupMapWithSomeAttributes();
    assertEquals("find by index", "va1", map.getRoot().getAttributes().get(0));
    assertEquals("find by index", "va2", map.getRoot().getAttributes().get(1));
    assertEquals("find by index", "va3", map.getRoot().getAttributes().get(2));
    assertEquals("find by index", "vb1", map.getRoot().getAttributes().get(3));
    try {
      map.getRoot().getAttributes().get(4);
      fail("expect IndexOutOfBoundsException on get(int) with illegal index");
    }
    catch (IndexOutOfBoundsException e) {
      // OK - expected
    }
  }

  public void test_AttributesRO_findAttribute_String_name() {
    map = setupMapWithSomeAttributes();
    assertEquals("first matching attribute should be found", 0, map.getRoot().getAttributes().findFirst("a1"));
  }

  public void test_AttributesRO_size() {
    map = setupMapWithSomeAttributes();
    assertEquals("count attributes", 4, map.getRoot().getAttributes().size());
  }

  public void test_Attributes_set_int_index_String_value() {
    map = setupMapWithSomeAttributes();
    map.getRoot().getAttributes().set(3, "VB1");
    map.getRoot().getAttributes().set(1, "VA2");
    assertEquals("values should be updated", list("va1", "VA2", "va3"), map.getRoot().getAttributes().getAll(
        "a1"));
    assertEquals("values should be updated", list("VB1"), map.getRoot().getAttributes().getAll("b1"));
    try {
      map.getRoot().getAttributes().set(4, "xx");
      fail("expect IndexOutOfBoundsException on set(int, value) with illegal index");
    }
    catch (IndexOutOfBoundsException e) {
      // OK - expected
    }
  }

  public void test_Attributes_set_int_index_String_name_String_value() {
    map = setupMapWithSomeAttributes();
    map.getRoot().getAttributes().set(1, "c1", "VC1");
    assertEquals("values should be updated", list("va1", "va3"), map.getRoot().getAttributes().getAll("a1"));
    assertEquals("values should be updated", 1, map.getRoot().getAttributes().findFirst("c1"));
    assertEquals("values should be updated", "VC1", map.getRoot().getAttributes().get(1));
    try {
      map.getRoot().getAttributes().set(4, "xx", "yy");
      fail("expect IndexOutOfBoundsException on set(int, name, value) with illegal index");
    }
    catch (IndexOutOfBoundsException e) {
      // OK - expected
    }
  }

  @SuppressWarnings("deprecation")
  public void test_Attributes_remove_String_name() {
    map = setupMapWithSomeAttributes();
    map.getRoot().getAttributes().remove("a1");
    assertEquals("first matching attribute should be removed", list("va2", "va3"), map.getRoot()
        .getAttributes().getAll("a1"));
    assertEquals("first matching attribute should be removed", 3, map.getRoot().getAttributes().size());
  }

  private <T> List<T> list(T... args) {
    return Arrays.asList(args);
  }

  private <T> Set<T> set(T... args) {
    return set(Arrays.asList(args));
  }

  @SuppressWarnings("unchecked")
  private <T> Set<T> set(List<T> list) {
    TreeSet<T> set = null;
    if (list.size() > 0 && list.get(0) instanceof Node)
      set = new TreeSet<T>((Comparator<T>) nodeComparator);
    else
      set = new TreeSet<T>();
    set.addAll(list);
    return set;
  }

  public void test_Attributes_removeAll_String_name() {
    map = setupMapWithSomeAttributes();
    map.getRoot().getAttributes().removeAll("a1");
    assertEquals("all matching attributes should be removed", list(), map.getRoot().getAttributes()
        .getAll("a1"));
    assertEquals("all matching attribute should be removed", 1, map.getRoot().getAttributes().size());
  }

  public void test_Attributes_remove_int_index() {
    map = setupMapWithSomeAttributes();
    // remove from the rear to keep the index stable (otherwise remove(1) twice)
    map.getRoot().getAttributes().remove(2);
    map.getRoot().getAttributes().remove(1);
    assertEquals("attribute should be removed", list("va1"), map.getRoot().getAttributes().getAll("a1"));
    assertEquals("attribute should be removed", 2, map.getRoot().getAttributes().size());
  }

  public void test_Attributes_set_String_name_String_value() {
    map = setupMapWithSomeAttributes();
    map.getRoot().getAttributes().set("a1", "VA1");
    map.getRoot().getAttributes().set("c1", "vc1");
    assertEquals("first matching attribute should be changed", list("VA1", "va2", "va3"), map.getRoot()
        .getAttributes().getAll("a1"));
    assertEquals("attribute should be added", list("vc1"), map.getRoot().getAttributes().getAll("c1"));
    assertEquals("attribute should be added", 5, map.getRoot().getAttributes().size());
  }

  public void test_Attributes_add_String_name_String_value() {
    map = setupMapWithSomeAttributes();
    map.getRoot().getAttributes().add("a1", "va1");
    map.getRoot().getAttributes().set("c1", "vc1");
    assertEquals("attribute should be added", list("va1", "va2", "va3", "va1"), map.getRoot().getAttributes()
        .getAll("a1"));
    assertEquals("attribute should be added", list("vc1"), map.getRoot().getAttributes().getAll("c1"));
    assertEquals("attribute should be added", 6, map.getRoot().getAttributes().size());
  }

  //
  //  public void test_ConnectorRO_getColor() {
  //   
  //  }
  //
  //  public void test_ConnectorRO_getEndArrow() {
  //   
  //  }
  //
  //  public void test_ConnectorRO_getMiddleLabel() {
  //   
  //  }
  //
  //  public void test_ConnectorRO_getSource() {
  //   
  //  }
  //
  //  public void test_ConnectorRO_getSourceLabel() {
  //   
  //  }
  //
  //  public void test_ConnectorRO_getStartArrow() {
  //   
  //  }
  //
  //  public void test_ConnectorRO_getTarget() {
  //   
  //  }
  //
  //  public void test_ConnectorRO_getTargetLabel() {
  //   
  //  }
  //
  //  public void test_ConnectorRO_simulatesEdge() {
  //   
  //  }
  //
  //  public void test_Connector_setColor_Color_color() {
  //   
  //  }
  //
  //  public void test_Connector_setEndArrow_ArrowType_arrowType() {
  //   
  //  }
  //
  //  public void test_Connector_setMiddleLabel_String_label() {
  //   
  //  }
  //
  //  public void test_Connector_setSimulatesEdge_boolean_simulatesEdge() {
  //   
  //  }
  //
  //  public void test_Connector_setSourceLabel_String_label() {
  //   
  //  }
  //
  //  public void test_Connector_setStartArrow_ArrowType_arrowType() {
  //   
  //  }
  //
  //  public void test_Connector_setTargetLabel_String_label() {
  //   
  //  }
  public void test_ControllerRO_getSelected() {
    map = c.newMap();
    assertEquals("new root node should be selected", map.getRoot(), c.getSelected());
    final Node firstChild = map.getRoot().createChild("child 1");
    final Node secondChild = map.getRoot().createChild("child 2");
    // FIXME: why aren't the new node selected?
    assertEquals("root node should still be selected after adding nodes", map.getRoot(), c.getSelected());
    c.selectMultipleNodes(list(firstChild, secondChild));
    // what's the rule?
    assertEquals("last selected node should be returned", secondChild, c.getSelected());
  }

  public void test_ControllerRO_getSelecteds() {
    map = c.newMap();
    assertEquals("new root node should be selected", map.getRoot(), c.getSelected());
    final Node firstChild = map.getRoot().createChild("child 1");
    final Node secondChild = map.getRoot().createChild("child 2");
    assertEquals("root node should still be selected after adding nodes", set(map.getRoot()), set(c
        .getSelecteds()));
    c.selectMultipleNodes(list(firstChild, secondChild));
    assertEquals("only the nodes selected via selectMultipleNodes should be returned",
        set(firstChild, secondChild), set(c.getSelecteds()));
  }

  public void test_ControllerRO_getSortedSelection_boolean_differentSubtrees() {
   
  }

  @SuppressWarnings("deprecation")
    public void test_ControllerRO_find_ICondition_condition() {
    map = c.newMap();
    @SuppressWarnings("unused")
    final Node firstChild = map.getRoot().createChild("child 1");
    final Node secondChild = map.getRoot().createChild("child 2");
    final List<Node> found = c.find(new NodeContainsCondition(TextController.FILTER_NODE, "child 2", false));
    assertEquals("one matching node should be found", list(secondChild), found);
  }

  public void test_ControllerRO_find_Closure_closure() {
   
  }

  public void test_Controller_centerOnNode_Node_center() {
    map = c.newMap();
    final Node firstChild = map.getRoot().createChild("child 1");
    // no actual test
    c.centerOnNode(firstChild);
  }

  public void test_Controller_select_Node_toSelect() {
    map = c.newMap();
    final Node firstChild = map.getRoot().createChild("child 1");
    final Node secondChild = map.getRoot().createChild("child 2");
    final Node thirdChild = map.getRoot().createChild("child 3");
    c.select(secondChild);
    final Set<Node> set = set(secondChild);
    final Set<Node> selected = set(c.getSelecteds());
    assertEquals("one node should be selected", set, selected);
    c.select(firstChild);
    assertEquals("one node should be selected", set(firstChild), set(c.getSelecteds()));
    c.select(thirdChild);
    assertEquals("one node should be selected", set(thirdChild), set(c.getSelecteds()));
  }

  public void test_Controller_selectBranch_Node_branchRoot() {
    map = c.newMap();
    final Node child1 = map.getRoot().createChild("child 1");
    final Node child2 = map.getRoot().createChild("child 2");
    final Node grandchild1 = child1.createChild("child 1.1");
    final Node grandchild2 = child1.createChild("child 1.2");
    final Node grandGrandChild = child1.createChild("child 1.1.1");
    c.selectBranch(child1);
    assertEquals("all node of the branch should be selected",
        set(child1, grandchild1, grandchild2, grandGrandChild), set(c.getSelecteds()));
    c.selectBranch(child2);
    assertEquals("one node should be selected", set(child2), set(c.getSelecteds()));
  }

  public void test_Controller_selectMultipleNodes_List_Node_toSelect() {
    // see test_ControllerRO_getSelected()
  }

  @SuppressWarnings("deprecation")
  public void test_Controller_undo_redo_stuff() {
    map = c.newMap();
    map.getRoot().createChild("child 1");
    assertFalse("node should be there before undo", c.find(new NodeContainsCondition(TextController.FILTER_NODE, "child 1", false)).isEmpty());
    c.undo();
    assertTrue("node should be away after undo", c.find(new NodeContainsCondition(TextController.FILTER_NODE, "child 1", false)).isEmpty());
    c.redo();
    assertFalse("node should be there after redo", c.find(new NodeContainsCondition(TextController.FILTER_NODE, "child 1", false)).isEmpty());
    c.deactivateUndo();
    c.undo();
    assertTrue("node should still be there after undo since undo is deactivated", c.find(
        new NodeContainsCondition(TextController.FILTER_NODE, "child 1", false)).isEmpty());
  }

  public void test_Controller_setStatusInfo_String_info() {
    // no actual test
    c.setStatusInfo("test statusinfo");
    // no actual test - info should be removed
    c.setStatusInfo(null);
  }

  public void test_Controller_setStatusInfo_String_infoPanelKey_String_info() {
    // no actual test
    final String infoPanelKey = "testStatusPanel";
    c.setStatusInfo(infoPanelKey, "someid");
    // no actual test - info should be removed
    c.setStatusInfo(infoPanelKey, (String) null);
  }

  @SuppressWarnings("deprecation")
  public void test_Controller_setStatusInfo_String_infoPanelKey_Icon_icon() {
    final List<String> keys = FreeplaneIconUtils.listStandardIconKeys();
    assertTrue("find out about the available icons with FreeplaneIconUtils.listStandardIconKeys() -> " + keys,
        keys.contains("button_ok"));
    // no actual test
    c.setStatusInfo("standard", FreeplaneIconUtils.createStandardIcon("button_ok"));
    // no actual test - info should be removed
    c.setStatusInfo(null);
  }

  public void test_Controller_setStatusInfo_String_infoPanelKey_String_info_String_iconKey() {
    final List<String> keys = FreeplaneIconUtils.listStandardIconKeys();
    final String iconKey = "button_ok";
    assertTrue("check if FreeplaneIconUtils.listStandardIconKeys() contains '" + iconKey + "'; list content: "
            + keys, keys.contains(iconKey));
    // no actual test
    final String infoPanelKey = "standard";
    c.setStatusInfo(infoPanelKey, "hi there!", iconKey);
    // no actual test - info should be removed
    c.setStatusInfo(infoPanelKey, (String) null);
  }

  public void test_Controller_newMap() {
    map = c.newMap();
  }

  //
  //  public void test_EdgeRO_getColor() {
  //   
  //  }
  //
  //  public void test_EdgeRO_getType() {
  //   
  //  }
  //
  //  public void test_EdgeRO_getWidth() {
  //   
  //  }
  //
  //  public void test_Edge_setColor_Color_color() {
  //   
  //  }
  //
  //  public void test_Edge_setType_EdgeStyle_type() {
  //   
  //  }
  //
  //  public void test_Edge_setWidth_int_width() {
  //   
  //  }
  //
  //  public void test_ExternalObjectRO_getURI() {
  //   
  //  }
  //
  //  public void test_ExternalObjectRO_getZoom() {
  //   
  //  }
  //
  //  public void test_ExternalObject_setURI_String_uri() {
  //   
  //  }
  //
  //  public void test_ExternalObject_setZoom_float_zoom() {
  //   
  //  }
  //
  //  public void test_FontRO_getName() {
  //   
  //  }
  //
  //  public void test_FontRO_getSize() {
  //   
  //  }
  //
  //  public void test_FontRO_isBold() {
  //   
  //  }
  //
  //  public void test_FontRO_isBoldSet() {
  //   
  //  }
  //
  //  public void test_FontRO_isItalic() {
  //   
  //  }
  //
  //  public void test_FontRO_isItalicSet() {
  //   
  //  }
  //
  //  public void test_FontRO_isNameSet() {
  //   
  //  }
  //
  //  public void test_FontRO_isSizeSet() {
  //   
  //  }
  //
  //  public void test_Font_resetBold() {
  //   
  //  }
  //
  //  public void test_Font_resetItalic() {
  //   
  //  }
  //
  //  public void test_Font_resetName() {
  //   
  //  }
  //
  //  public void test_Font_resetSize() {
  //   
  //  }
  //
  //  public void test_Font_setBold_boolean_bold() {
  //   
  //  }
  //
  //  public void test_Font_setItalic_boolean_italic() {
  //   
  //  }
  //
  //  public void test_Font_setName_String_name() {
  //   
  //  }
  //
  //  public void test_Font_setSize_int_size() {
  //   
  //  }
  //
  //  public void test_IconsRO_getIcons() {
  //   
  //  }
  //
  //  public void test_Icons_addIcon_String_name() {
  //   
  //  }
  //
  //  public void test_Icons_removeIcon_String_iconID() {
  //   
  //  }
  //
  //  public void test_LinkRO_get() {
  //   
  //  }
  //
  //  public void test_Link_set_String_target() {
  //   
  //  }
  public void test_MapRO_getRoot() {
    map = c.newMap();
    assertEquals("the root node shouldn't have a parent", null, map.getRoot().getParent());
  }

  public void test_MapRO_node_String_id() {
    map = c.newMap();
    final Node firstChild = map.getRoot().createChild("child 1");
    final String id = firstChild.getId();
    assertEquals("get by id returned wrong node", firstChild, map.node(id));
  }

  public void test_MapRO_getFile() {
    map = c.newMap();
    assertTrue("the file of a new map should be null", map.getFile() == null);
  }

  public void test_Map_close() {
    Map originalMap = node.getMap();
    map = c.newMap();
    map.getRoot().createChild("child 1");
    assertFalse("a new map should have been opened", originalMap.equals(map));
    map.close(true, false);
    assertEquals("the original map should be selected again", originalMap.getName(), c.getSelected().getMap()
        .getName());
    // let tearDown() some work to do...
    map = c.newMap();
  }

  public void test_Map_save() {
   
  }

  public void test_NodeRO_getAttributes() {
    createTestMap();
    map.getRoot().getAttributes().add("a1", "va1");
    assertEquals("value should be found", "va1", map.getRoot().getAttributes().get(0));
  }

  public void test_NodeRO_getChildPosition_Node_childNode() {
    map = c.newMap();
    final Node child1 = map.getRoot().createChild("child 1");
    final Node child2 = map.getRoot().createChild("child 2");
    assertEquals("wrong position", 0, map.getRoot().getChildPosition(child1));
    assertEquals("wrong position", 1, map.getRoot().getChildPosition(child2));
  }

  public void test_NodeRO_getChildren() {
    map = c.newMap();
    final Node child1 = map.getRoot().createChild("child 1");
    final Node child2 = map.getRoot().createChild("child 2");
    final List<Node> children = map.getRoot().getChildren();
    assertEquals("wrong children count", 2, children.size());
    assertEquals("wrong order", child1, children.get(0));
    assertEquals("wrong order", child2, children.get(1));
  }

  //
  //  public void test_NodeRO_getConnectorsIn() {
  //   
  //  }
  //
  //  public void test_NodeRO_getConnectorsOut() {
  //   
  //  }
  //
  //  public void test_NodeRO_getExternalObject() {
  //   
  //  }
  public void test_NodeRO_getIcons() {
    map = c.newMap();
    final Node root = map.getRoot();
    assertTrue("by default a node has no icons", root.getIcons().getIcons().isEmpty());
    root.getIcons().add("bee");
    assertEquals("one icon added", 1, root.getIcons().getIcons().size());
  }

  public void test_NodeRO_getLink() {
    map = c.newMap();
    final Node root = map.getRoot();
    assertEquals("by default a node has no links", null, root.getLink().getText());
    final String url = "file://blabla.txt";
    root.getLink().setText(url);
    assertEquals("a link should have been added", url, root.getLink().getText());
  }

  public void test_NodeRO_getMap() {
    map = c.newMap();
    final Node root = map.getRoot();
    assertEquals("???", map, root.getMap());
  }

  public void test_NodeRO_getId() {
    map = c.newMap();
    final Node root = map.getRoot();
    assertTrue("unknown node id pattern in '" + root.getId() + "'", root.getId().matches("ID_[1-9]\\d+"));
  }
 
  @SuppressWarnings("deprecation")
    public void test_NodeRO_getNodeID() {
    map = c.newMap();
    final Node root = map.getRoot();
    assertTrue("unknown node id pattern in '" + root.getNodeID() + "'", root.getNodeID().matches("ID_[1-9]\\d+"));
  }

    public void test_NodeRO_getNodeLevel_boolean_countHidden() {
    createTestMap();
    assertEquals("root is level 0", 0, map.getRoot().getNodeLevel(true));
    final Node child = firstChild();
    assertEquals("children are at level 1", 1, child.getNodeLevel(false));
    final Node grandchild = child.createChild();
    assertEquals("grandchildren are at level 2", 2, grandchild.getNodeLevel(false));
    assertEquals("grandchildren are at level 2 - countHidden only matters if there are hidden nodes" //
        , 2, grandchild.getNodeLevel(true));
    // seems that the countHidden flag isn't testable here since it's not possible to filter nodes (and it
    // doesn't make sense to extent the API for that), right?
  }

  public void test_NodeRO_getNote_getPlain(){
    map = c.newMap();
    final Node rootNode = map.getRoot();
    final String plainText = " xx\nx ";
    rootNode.setNote(plainText);
    assertEquals("", HtmlUtils.plainToHTML(plainText), rootNode.getNoteText());
    assertEquals("", HtmlUtils.plainToHTML(plainText), rootNode.getNote().getText());
    assertEquals("", plainText, rootNode.getNote().getPlain());
    final String xml = "<x> yyy </x>";
    rootNode.setNote(xml);
    assertEquals("", HtmlUtils.plainToHTML(xml), rootNode.getNoteText());
    // in Groovy also assert HtmlUtils.plainToHTML(" xxx ") == root.note would be OK
    assertEquals("", HtmlUtils.plainToHTML(xml), rootNode.getNote().getText());
    assertEquals("", xml, rootNode.getNote().getPlain());
    rootNode.setNote("<html> <em>zzzzz</em> </hmtl>");
    assertEquals("", "zzzzz", rootNode.getNote().getPlain());
  }

  public void test_NodeRO_getNote() {
    map = c.newMap();
    final Node root = map.getRoot();
    root.setNote(" xxx ");
    // in Groovy also assert HtmlUtils.plainToHTML(" xxx ") == root.note would be OK
    assertEquals("", HtmlUtils.plainToHTML(" xxx "), root.getNote().getText());
    assertEquals("", HtmlUtils.plainToHTML(" xxx "), root.getNoteText());
    root.setNote(" x\nxx ");
    // in Groovy also assert HtmlUtils.plainToHTML(" xxx ") == root.note would be OK
    assertEquals("", HtmlUtils.plainToHTML(" x\nxx "), root.getNote().getText());
    assertEquals("", HtmlUtils.plainToHTML(" x\nxx "), root.getNoteText());
  }

  public void test_NodeRO_getParent() {
    createTestMap();
    final Node root = map.getRoot();
    assertEquals("root has no parent", null, root.getParent());
    final Node child = firstChild(root);
    assertEquals("", root, child.getParent());
  }

  //  public void test_NodeRO_getStyle() {
  //   
  //  }
  //
  public void test_NodeRO_getPlainText() {
    map = c.newMap();
    final Node root = map.getRoot();
    final String plainText = " xxx ";
    root.setText(plainText);
    assertEquals("", plainText, root.getText());
    assertEquals("plain text should be kept untouched", plainText, root.getPlainText());
    final String xml = "<x> yyy </x>";
    root.setText(xml);
    assertEquals("xml tags are not stripped", xml, root.getPlainText());
    root.setText("<html> <em>zzzzz</em> </hmtl>");
    assertEquals("html tags should be stripped", "zzzzz", root.getPlainText());
  }

  public void test_NodeRO_getPlainTextContent() {
    // getPlainTextContent() is deprecated - see #test_NodeRO_getPlainText()
  }

  public void test_NodeRO_getText() {
    map = c.newMap();
    final Node root = map.getRoot();
    root.setText(" xxx ");
    assertEquals("", " xxx ", root.getText());
    root.setText(" x\nxx ");
    assertEquals("", " x\nxx ", root.getText());
  }

  public void test_NodeRO_isDescendantOf_Node_p() {
    createTestMap();
    final Node root = map.getRoot();
    assertTrue("a node is its own descendant", root.isDescendantOf(root));
    assertFalse("siblings aren't descendants of each other", firstChild(root).isDescendantOf(
        root.getChildren().get(1)));
    assertFalse("siblings aren't descendants of each other", root.getChildren().get(1).isDescendantOf(
        firstChild(root)));
    assertTrue("children are descendants of their parents", firstChild(root).isDescendantOf(root));
    final Node grandchild = firstChild(root).createChild();
    assertTrue("grandchildren are descendants of their parents", firstChild(root).isDescendantOf(root));
    assertTrue("grandchildren are descendants of their grandparents", grandchild.isDescendantOf(root));
  }

  public void test_NodeRO_isFolded() {
    createTestMap();
    final Node root = map.getRoot();
    final Node child = firstChild();
    final Node grandchild = child.createChild("grandchild");
    assertFalse("initially nothing should be folded", root.isFolded());
    assertFalse("initially nothing should be folded", child.isFolded());
    root.setFolded(true);
    assertFalse("root isn't foldable", root.isFolded());
    child.setFolded(true);
    assertTrue("node should be folded now", child.isFolded());
    assertFalse("folding is not recursive in terms of isFolded()", grandchild.isFolded());
    child.setFolded(false);
    assertFalse("node should be unfolded again", child.isFolded());
    grandchild.setFolded(true);
    assertFalse("a node without children is not foldable", grandchild.isFolded());
    // test undo of folding - give the new node a child first to make it foldable
    grandchild.createChild("grandgrandchild");
    grandchild.setFolded(true);
    assertTrue("node should be folded now", grandchild.isFolded());
    c.undo();
    assertFalse("folding should be undone now", grandchild.isFolded());
  }

  public void test_NodeRO_isLeaf() {
    map = c.newMap();
    final Node root = map.getRoot();
    assertTrue("even root is a leaf, if single", root.isLeaf());
    root.createChild("child");
    assertFalse("root is never a leaf, even without children", root.isLeaf());
    assertTrue("child without children should be leaf", firstChild(root).isLeaf());
    firstChild(root).createChild("grandchild");
    assertFalse("child with children is not a leaf", firstChild(root).isLeaf());
  }

  //
  //  public void test_NodeRO_isLeft() {
  //   
  //  }
  //
  public void test_NodeRO_isRoot() {
    createTestMap();
    assertTrue("root has no parent", map.getRoot().getParent() == null);
  }

  public void test_NodeRO_isVisible() {
    map = c.newMap();
    map.getRoot().createChild("first node");
    map.getRoot().createChild("second node");
    assertTrue("initially all nodes should be visible", firstChild().isVisible());
    new Filter(new NodeContainsCondition(TextController.FILTER_NODE, "first", false), true, true, true).applyFilter(this, Controller
        .getCurrentController().getMap(), true);
    assertTrue("first node should be  matched by the filter", firstChild().isVisible());
    assertFalse("second node should not be matched by the filter", map.getRoot().getChildren().get(1).isVisible());
    c.setStatusInfo("filter", (String) null);
  }

  /** copy of {@link #test_ControllerRO_find_ICondition_condition()}. */
  @SuppressWarnings("deprecation")
  public void test_NodeRO_find_ICondition_condition() {
    map = c.newMap();
    @SuppressWarnings("unused")
    final Node firstChild = map.getRoot().createChild("child 1");
    final Node secondChild = map.getRoot().createChild("child 2");
    final List<Node> found = c.find(new NodeContainsCondition(TextController.FILTER_NODE, "child 2", false));
    assertEquals("one matching node should be found", list(secondChild), found);
  }

  //  public void test_NodeRO_find_Closure_closure() {
  //   
  //  }
  public void test_NodeRO_getLastModifiedAt() {
    map = c.newMap();
    final Node child = map.getRoot().createChild("a node");
    final Date initialLastModifiedAt = child.getLastModifiedAt();
    long diff = System.currentTimeMillis() - initialLastModifiedAt.getTime();
    // one second should be enough
    assertTrue("lastModifiedAt seems to be set incorrectly. It says it's " + diff + " ms ago", //
        diff >= 0 && diff < 1000L);
    // createChild() initially set both timestamps to the same value and changes modifiedAt directly
    // afterwards in setText()
    diff = initialLastModifiedAt.getTime() - child.getCreatedAt().getTime();
    assertTrue("modifiedAt and createdAt should be set nearly to the same timestamp initially but modifiedAt = "
            + initialLastModifiedAt.getTime() + ", createdAt = " + child.getCreatedAt().getTime(), //
        diff >= 0 && diff < 50);
    final Date epoch = new Date(0);
    child.setLastModifiedAt(epoch);
    child.setText("changed");
    assertTrue("lastModifiedAt should be changed after changing the node text", //
        child.getLastModifiedAt().after(epoch));
  }

  public void test_NodeRO_getCreatedAt() {
    map = c.newMap();
    final Node child = map.getRoot().createChild("a node");
    final Date initialCreatedAt = child.getCreatedAt();
    final long diff = System.currentTimeMillis() - initialCreatedAt.getTime();
    // one second should be enough
    assertTrue("createdAt seems to be set incorrectly. It says it's " + diff + " ms ago", //
        diff >= 0 && diff < 1000L);
    final Date epoch = new Date(0);
    child.setCreatedAt(epoch);
    child.setText("changed");
    assertEquals("createdAt should not be changed after changing the node text", //
        epoch, child.getCreatedAt());
  }

  //  public void test_Node_addConnectorTo_Node_target() {
  //   
  //  }
  //
  //  public void test_Node_addConnectorTo_String_targetNodeID() {
  //   
  //  }
  public void test_Node_createChild() {
    map = c.newMap();
    assertEquals("", 0, map.getRoot().getChildren().size());
    map.getRoot().createChild();
    assertEquals("child should be created", 1, map.getRoot().getChildren().size());
  }

  public void test_Node_createChild_int_position() {
    map = c.newMap();
    final Node root = map.getRoot();
    final Node child1 = root.createChild("child 1");
    final Node child2 = root.createChild("child 2");
    assertEquals("wrong position", 0, root.getChildPosition(child1));
    assertEquals("wrong position", 1, root.getChildPosition(child2));
    final Node child3 = root.createChild(0);
    assertEquals("wrong insert position", 0, root.getChildPosition(child3));
    assertEquals("node should be shifted", 1, root.getChildPosition(child1));
    assertEquals("node should be shifted", 2, root.getChildPosition(child2));
    final Node child4 = root.createChild(3);
    assertEquals("wrong insert position", 3, root.getChildPosition(child4));
    assertEquals("node should be shifted", 0, root.getChildPosition(child3));
    assertEquals("node should be shifted", 1, root.getChildPosition(child1));
    try {
      root.createChild(-1);
      fail("a negative position should lead to an exception");
    }
    catch (Throwable e) {
    }
    try {
      root.createChild(5);
      fail("too large positions should lead to an exception");
    }
    catch (Throwable e) {
    }
  }

  public void test_Node_delete() {
    map = c.newMap();
    final Node root = map.getRoot();
    final Node child1 = root.createChild("child 1");
    final Node child2 = root.createChild("child 2");
    assertEquals("", 2, root.getChildren().size());
    child1.delete();
    assertEquals("deletion failed", 1, root.getChildren().size());
    assertEquals("wrong node deleted", child2, root.getChildren().get(0));
  }

  public void test_Node_moveTo_Node_parentNode() {
    map = c.newMap();
    final Node root = map.getRoot();
    final Node child1 = root.createChild("child 1");
    final Node child2 = root.createChild("child 2");
    final Node grandchild = child1.createChild("grandchild");
    assertEquals("child2 should have no children", 0, child2.getChildren().size());
    grandchild.moveTo(child2);
    assertEquals("grandchild should be a child of child2 now", child2, grandchild.getParent());
  }

  public void test_Node_moveTo_Node_parentNode_int_position() {
    map = c.newMap();
    final Node root = map.getRoot();
    final Node child1 = root.createChild("child 1");
    final Node child2 = root.createChild("child 2");
    final Node grandchild = child1.createChild("grandchild");
    assertEquals("wrong count of children", 2, root.getChildren().size());
    grandchild.moveTo(root, 1);
    assertEquals("wrong position", child1, root.getChildren().get(0));
    assertEquals("wrong position", grandchild, root.getChildren().get(1));
    assertEquals("wrong position", child2, root.getChildren().get(2));
  }

  //
  //  public void test_Node_removeConnector_Connector_connectorToBeRemoved() {
  //   
  //  }
  //
  public void test_Node_setFolded_boolean_folded() {
    createTestMap();
    final Node child = firstChild();
    child.createChild("grandchild");
    child.setFolded(true);
    assertTrue("node should be folded now", child.isFolded());
    child.setFolded(false);
    assertFalse("node should be unfolded again", child.isFolded());
  }

  public void test_Node_setPlainNote_String_text() {
    // see test_NodeRO_getPlainNote()
  }

  public void test_Node_setNoteText_String_text() {
    // see test_NodeRO_getNote()
  }

  public void test_Node_setText_String_text() {
    // see test_NodeRO_getText()
  }

  public void test_Node_setLastModifiedAt_Date_date() {
    // see test_NodeRO_getLastModifiedAt()
  }

  public void test_Node_setCreatedAt_Date_date() {
    // see test_NodeRO_getCreatedAt()
  }
  //  public void test_NodeStyleRO_getStyle() {
  //   
  //  }
  //
  //  public void test_NodeStyleRO_getStyleNode() {
  //   
  //  }
  //
  //  public void test_NodeStyleRO_getBackgroundColor() {
  //   
  //  }
  //
  //  public void test_NodeStyleRO_getEdge() {
  //   
  //  }
  //
  //  public void test_NodeStyleRO_getFont() {
  //   
  //  }
  //
  //  public void test_NodeStyleRO_getNodeTextColor() {
  //   
  //  }
  //
  //  public void test_NodeStyle_setStyle_Object_key() {
  //   
  //  }
  //
  //  public void test_NodeStyle_setBackgroundColor_Color_color() {
  //   
  //  }
  //
  //  public void test_NodeStyle_setNodeTextColor_Color_color() {
  //   
  //  }
}
TOP

Related Classes of org.freeplane.plugin.script.proxy.ScriptApiTest$TestException

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.