/** * Copyright 2014, Emory University * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package edu.emory.clir.clearnlp.constituent; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.List; import java.util.regex.Pattern; import org.junit.Test; import edu.emory.clir.clearnlp.util.PatternUtils; /** * @since 3.0.0 * @author Jinho D. Choi ({@code jinho.choi@emory.edu}) */ public class CTNodeTest { @Test public void testGetters() { CTNode curr = new CTNode("NP-PRD-1-LOC=2"); testGetTags(curr); CTNode[] children = new CTNode[4]; children[0] = new CTNode("NP-LOC"); children[1] = new CTNode("CC", "and"); children[2] = new CTNode("NP-TMP"); children[3] = new CTNode("PP-LOC-PRD"); for (CTNode child : children) curr.addChild(child); testGetChildren(curr, children); CTNode gChild = new CTNode("-NONE-", "*ICH*"); children[0].addChild(new CTNode("-NONE-", "*")); children[2].addChild(new CTNode("NNP", "Jinho")); children[2].addChild(gChild); children[3].addChild(new CTNode("PP")); testGetAncestors(curr, children, gChild); testGetDescendants(curr, children); testGetSiblings(curr, children); testGetSubtree(curr); testGetEmptyCategories(curr); assertEquals(2, gChild.getDistanceToTop()); } private void testGetTags(CTNode curr) { assertEquals("NP-LOC-PRD-1=2", curr.getTags()); assertEquals("[LOC, PRD]", curr.getFunctionTagSet().toString()); assertEquals(1, curr.getEmptyCategoryIndex()); assertEquals(2, curr.getGappingRelationIndex()); } private void testGetChildren(CTNode curr, CTNode[] children) { Pattern p = PatternUtils.createClosedORPattern("PP","CC"); List<CTNode> list; list = curr.getChildrenList(CTLib.matchC("NP")); assertEquals("[(NP-LOC null), (NP-TMP null)]", list.toString()); list = curr.getChildrenList(CTLib.matchCo("PP", "CC")); assertEquals("[(CC and), (PP-LOC-PRD null)]", list.toString()); list = curr.getChildrenList(CTLib.matchP(p)); assertEquals("[(CC and), (PP-LOC-PRD null)]", list.toString()); list = curr.getChildrenList(CTLib.matchFa("LOC", "PRD")); assertEquals("[(PP-LOC-PRD null)]", list.toString()); list = curr.getChildrenList(CTLib.matchFo("TMP", "PRD")); assertEquals("[(NP-TMP null), (PP-LOC-PRD null)]", list.toString()); list = curr.getChildrenList(CTLib.matchCFa("NP","LOC","PRD")); assertEquals("[]", list.toString()); list = curr.getChildrenList(CTLib.matchCFo("NP","LOC","PRD")); assertEquals("[(NP-LOC null)]", list.toString()); list = curr.getChildrenList(CTLib.matchPFa(p, "TMP","PRD")); assertEquals("[]", list.toString()); list = curr.getChildrenList(CTLib.matchPFo(p, "TMP","PRD")); assertEquals("[(PP-LOC-PRD null)]", list.toString()); assertEquals(null, curr.getChild(-1)); assertEquals(null, curr.getChild(4)); assertEquals(children[0], curr.getFirstChild()); assertEquals(children[3], curr.getLastChild()); } private void testGetAncestors(CTNode curr, CTNode[] children, CTNode gChild) { CTNode node; node = children[0].getParent(); assertEquals(curr, node); node = gChild.getNearestAncestor(CTLib.matchF("TMP")); assertEquals(children[2], node); node = gChild.getNearestAncestor(CTLib.matchF("LOC")); assertEquals(curr, node); node = gChild.getNearestAncestor(CTLib.matchF("BNF")); assertEquals(null, node); node = gChild.getHighestChainedAncestor(CTLib.matchF("LOC")); assertEquals(null, node); node = gChild.getHighestChainedAncestor(CTLib.matchF("TMP")); assertEquals(children[2], node); node = gChild.getHighestChainedAncestor(CTLib.matchFo("LOC","TMP")); assertEquals(curr, node); node = children[1].getLowestCommonAncestor(gChild); assertEquals(curr, node); node = curr.getLowestCommonAncestor(gChild); assertEquals(curr, node); node = gChild.getLowestCommonAncestor(curr); assertEquals(curr, node); } private void testGetSiblings(CTNode curr, CTNode[] children) { CTNode node; node = children[3].getLeftNearestSibling(CTLib.matchFo("TMP")); assertEquals(children[2], node); node = children[3].getLeftNearestSibling(CTLib.matchFo("LOC")); assertEquals(children[0], node); node = children[0].getRightNearestSibling(CTLib.matchFo("PRD")); assertEquals(children[3], node); } private void testGetDescendants(CTNode curr, CTNode[] children) { CTNode node; node = curr.getFirstDescendant(CTLib.matchC("NP")); assertEquals(children[0], node); node = curr.getFirstDescendant(CTLib.matchC("NNP")); assertEquals(children[2].getFirstChild(), node); node = curr.getFirstLowestChainedDescendant(CTLib.matchC("PP")); assertEquals(children[3].getFirstChild(), node); } private void testGetSubtree(CTNode curr) { List<CTNode> nodes; CTNode node; node = curr.getFirstTerminal(); assertEquals(curr.getFirstChild().getFirstChild(), node); node = curr.getLastTerminal(); assertEquals(curr.getLastChild().getLastChild(), node); nodes = curr.getTerminalList(); assertEquals("[(-NONE- *), (CC and), (NNP Jinho), (-NONE- *ICH*), (PP null)]", nodes.toString()); } private void testGetEmptyCategories(CTNode curr) { List<CTNode> nodes = curr.getEmptyCategoryListInSubtree(Pattern.compile("\\*ICH\\*")); assertEquals("[(-NONE- *ICH*)]", nodes.toString()); } @Test public void testSetters() { CTNode curr = new CTNode("NP"); CTNode A = new CTNode("A"); CTNode B = new CTNode("B"); CTNode C = new CTNode("C"); CTNode D = new CTNode("D"); CTNode E = new CTNode("E"); CTNode CC = new CTNode("CC"); CTNode DD = new CTNode("DD"); CTNode EE = new CTNode("EE"); // add child curr.addChild(A); curr.addChild(B); assertEquals(null, A.getLeftSibling()); assertEquals(B , A.getRightSibling()); assertEquals(A , B.getLeftSibling()); assertEquals(null, B.getRightSibling()); assertEquals("(NP (A null) (B null))", curr.toStringLine()); // add child with index curr.addChild(0, C); curr.addChild(3, D); curr.addChild(2, E); assertEquals(null, C.getLeftSibling()); assertEquals(A , C.getRightSibling()); assertEquals(C , A.getLeftSibling()); assertEquals(E , A.getRightSibling()); assertEquals(A , E.getLeftSibling()); assertEquals(B , E.getRightSibling()); assertEquals(E , B.getLeftSibling()); assertEquals(D , B.getRightSibling()); assertEquals(B , D.getLeftSibling()); assertEquals(null, D.getRightSibling()); assertEquals("(NP (C null) (A null) (E null) (B null) (D null))", curr.toStringLine()); assertTrue(A.isLeftSiblingOf(B)); assertTrue(A.isLeftSiblingOf(D)); assertFalse(A.isLeftSiblingOf(C)); assertTrue(B.isRightSiblingOf(A)); assertTrue(D.isRightSiblingOf(A)); assertFalse(C.isRightSiblingOf(A)); // set child curr.setChild(0, CC); curr.setChild(2, EE); curr.setChild(4, DD); assertEquals(null, CC.getLeftSibling()); assertEquals(A , CC.getRightSibling()); assertEquals(CC , A.getLeftSibling()); assertEquals(EE , A.getRightSibling()); assertEquals(A , EE.getLeftSibling()); assertEquals(B , EE.getRightSibling()); assertEquals(EE , B.getLeftSibling()); assertEquals(DD , B.getRightSibling()); assertEquals(B , DD.getLeftSibling()); assertEquals(null, DD.getRightSibling()); assertEquals("(NP (CC null) (A null) (EE null) (B null) (DD null))", curr.toStringLine()); // remove child curr.removeChild(0); assertEquals(null, A.getLeftSibling()); assertEquals("(NP (A null) (EE null) (B null) (DD null))", curr.toStringLine()); curr.removeChild(2); assertEquals(EE, DD.getLeftSibling()); assertEquals(DD, EE.getRightSibling()); assertEquals("(NP (A null) (EE null) (DD null))", curr.toStringLine()); curr.removeChild(2); assertEquals(null, EE.getRightSibling()); assertEquals("(NP (A null) (EE null))", curr.toStringLine()); } @Test public void testBooleans() { CTNode node = new CTNode("NP1"); CTNode none = new CTNode(CTTagEn.NONE); CTNode np2 = new CTNode("NP2"); node.addChild(none); node.addChild(np2); assertTrue(none.isTerminal()); assertTrue(none.isEmptyCategory()); assertFalse(np2.isEmptyCategory()); assertFalse(np2.isEmptyCategoryTerminal()); np2.addChild(new CTNode(CTTagEn.NONE)); assertTrue(np2.isEmptyCategoryTerminal()); } }