package org.xmind.core.runtime.test; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.xmind.core.Core; import org.xmind.core.IDeserializer; import org.xmind.core.ITopic; import org.xmind.core.IWorkbook; import org.xmind.core.internal.CoreAxisProvider; import org.xmind.core.internal.xpath.Evaluator; import org.xmind.core.internal.xpath.IAxisProvider; import org.xmind.core.io.BundleResourceInputSource; import org.xmind.core.io.IInputSource; import org.xmind.core.marker.IMarkerSheet; @SuppressWarnings({ "rawtypes" }) public class CoreEvaluatorTestCase { private IWorkbook workbook; private IAxisProvider axisProvider; private List<Object> eval(Object context, String expression) { return new Evaluator(expression, axisProvider).evaluate(context); } @Test public void testPrimitiveValues() { assertOrderedResultSet(eval(null, "")); assertOrderedResultSet(eval(null, "1"), Integer.valueOf(1)); assertOrderedResultSet(eval(null, "'asdf'"), "asdf"); assertOrderedResultSet(eval(null, "'as''df'"), "as'df"); assertOrderedResultSet(eval(null, "1=1"), Boolean.TRUE); assertOrderedResultSet(eval(null, "'asdf'='asdf'"), Boolean.TRUE); assertOrderedResultSet(eval(null, "1=2"), Boolean.FALSE); assertOrderedResultSet(eval(null, "'asdf'='qwer'"), Boolean.FALSE); } @Test public void testGetTitle() { ITopic ct = workbook.getPrimarySheet().getRootTopic(); ITopic mt1 = ct.getChildren(ITopic.ATTACHED).get(0); ITopic mt2 = ct.getChildren(ITopic.ATTACHED).get(1); ITopic mt3 = ct.getChildren(ITopic.ATTACHED).get(2); assertOrderedResultSet(eval(ct, "@title"), "Central Topic"); assertOrderedResultSet(eval(mt1, "@title"), "Main Topic 1"); assertOrderedResultSet(eval(mt2, "@title"), "Task"); assertOrderedResultSet(eval(mt3, "@title"), "Platform Expression Framework.txt"); assertOrderedResultSet(eval(ct, "@title='Central Topic'"), Boolean.TRUE); assertOrderedResultSet(eval(mt1, "@title='Main Topic 1'"), Boolean.TRUE); } @Test public void testGetFolded() { ITopic ct = workbook.getPrimarySheet().getRootTopic(); ITopic mt1 = ct.getChildren(ITopic.ATTACHED).get(0); ITopic mt2 = ct.getChildren(ITopic.ATTACHED).get(1); ITopic mt3 = ct.getChildren(ITopic.ATTACHED).get(2); assertOrderedResultSet(eval(ct, "@folded"), Boolean.FALSE); assertOrderedResultSet(eval(mt1, "@folded"), Boolean.FALSE); assertOrderedResultSet(eval(mt2, "@folded"), Boolean.FALSE); assertOrderedResultSet(eval(mt3, "@folded"), Boolean.TRUE); } @Test public void testGetType() { ITopic ct = workbook.getPrimarySheet().getRootTopic(); ITopic mt1 = ct.getChildren(ITopic.ATTACHED).get(0); ITopic mt2 = ct.getChildren(ITopic.ATTACHED).get(1); ITopic mt3 = ct.getChildren(ITopic.ATTACHED).get(2); ITopic ft1 = ct.getChildren(ITopic.DETACHED).get(0); ITopic st1 = ct.getChildren(ITopic.SUMMARY).get(0); assertOrderedResultSet(eval(ct, "@type"), ITopic.ROOT); assertOrderedResultSet(eval(mt1, "@type"), ITopic.ATTACHED); assertOrderedResultSet(eval(mt2, "@type"), ITopic.ATTACHED); assertOrderedResultSet(eval(mt3, "@type"), ITopic.ATTACHED); assertOrderedResultSet(eval(ft1, "@type"), ITopic.DETACHED); assertOrderedResultSet(eval(st1, "@type"), ITopic.SUMMARY); } @Test public void testGetMarkers() { ITopic ct = workbook.getPrimarySheet().getRootTopic(); ITopic mt1 = ct.getChildren(ITopic.ATTACHED).get(0); ITopic mt2 = ct.getChildren(ITopic.ATTACHED).get(1); ITopic mt3 = ct.getChildren(ITopic.ATTACHED).get(2); assertUnorderedResultSet(eval(ct, "marker"), ct.getMarkerRefs().toArray()); assertUnorderedResultSet(eval(mt1, "marker"), mt1.getMarkerRefs().toArray()); assertUnorderedResultSet(eval(mt2, "marker"), mt2.getMarkerRefs().toArray()); assertUnorderedResultSet(eval(mt3, "marker"), mt3.getMarkerRefs().toArray()); } @Test public void testGetMarkerIds() { ITopic ct = workbook.getPrimarySheet().getRootTopic(); ITopic mt1 = ct.getChildren(ITopic.ATTACHED).get(0); ITopic mt2 = ct.getChildren(ITopic.ATTACHED).get(1); ITopic mt3 = ct.getChildren(ITopic.ATTACHED).get(2); assertUnorderedResultSet(eval(ct, "marker/@id")); assertUnorderedResultSet(eval(mt1, "marker/@id"), "priority-2", "smiley-laugh"); assertUnorderedResultSet(eval(mt2, "marker/@id"), "task-3oct"); assertUnorderedResultSet(eval(mt3, "marker/@id")); assertOrderedResultSet(eval(mt2, "marker/@id='task-3oct'"), Boolean.TRUE); } @Test public void testGetCount() { ITopic ct = workbook.getPrimarySheet().getRootTopic(); ITopic mt1 = ct.getChildren(ITopic.ATTACHED).get(0); ITopic mt2 = ct.getChildren(ITopic.ATTACHED).get(1); ITopic mt3 = ct.getChildren(ITopic.ATTACHED).get(2); assertOrderedResultSet(eval(ct, "count(marker)"), Integer.valueOf(0)); assertOrderedResultSet(eval(mt1, "count(marker)"), Integer.valueOf(2)); assertOrderedResultSet(eval(mt2, "count(marker)"), Integer.valueOf(1)); assertOrderedResultSet(eval(mt3, "count(marker)"), Integer.valueOf(0)); assertOrderedResultSet(eval(ct, "count(marker)=0"), Boolean.TRUE); assertOrderedResultSet(eval(mt1, "count(marker)=2"), Boolean.TRUE); } @Test public void testGetChildTopics() { ITopic ct = workbook.getPrimarySheet().getRootTopic(); assertOrderedResultSet(eval(ct, "topic"), ct.getAllChildren().toArray()); assertOrderedResultSet(eval(ct, "topic[1]"), ct.getAllChildren().get(0)); assertOrderedResultSet(eval(ct, "topic[@type='attached']"), ct.getChildren(ITopic.ATTACHED).toArray()); assertOrderedResultSet(eval(ct, "topic[@type='detached']"), ct.getChildren(ITopic.DETACHED).toArray()); assertOrderedResultSet(eval(ct, "topic[@type='summary']"), ct.getChildren(ITopic.SUMMARY).toArray()); assertOrderedResultSet(eval(ct, "topic[matches(@type,'(at|de)tached')]"), concat(ct.getChildren(ITopic.ATTACHED), ct.getChildren(ITopic.DETACHED)).toArray()); } @Test public void testGetParent() { ITopic ct = workbook.getPrimarySheet().getRootTopic(); ITopic mt1 = ct.getChildren(ITopic.ATTACHED).get(0); ITopic mt2 = ct.getChildren(ITopic.ATTACHED).get(1); assertOrderedResultSet(eval(ct, "../"), ct.getOwnedSheet()); assertOrderedResultSet(eval(mt1, "../"), ct); assertOrderedResultSet(eval(mt1, "../@type='root'"), Boolean.TRUE); assertOrderedResultSet(eval(mt2, "../../"), ct.getOwnedSheet()); } @Test public void testCommonTopicTests() { ITopic ct = workbook.getPrimarySheet().getRootTopic(); ITopic mt1 = ct.getChildren(ITopic.ATTACHED).get(0); ITopic mt2 = ct.getChildren(ITopic.ATTACHED).get(1); ITopic mt3 = ct.getChildren(ITopic.ATTACHED).get(2); ITopic ft1 = ct.getChildren(ITopic.DETACHED).get(0); ITopic st1 = ct.getChildren(ITopic.SUMMARY).get(0); // topic has a specific title String test1 = "@title='Task'"; assertOrderedResultSet(eval(ct, test1), Boolean.FALSE); assertOrderedResultSet(eval(mt1, test1), Boolean.FALSE); assertOrderedResultSet(eval(mt2, test1), Boolean.TRUE); assertOrderedResultSet(eval(mt3, test1), Boolean.FALSE); assertOrderedResultSet(eval(ft1, test1), Boolean.FALSE); assertOrderedResultSet(eval(st1, test1), Boolean.FALSE); // topic is the root topic String test2 = "@type='root'"; assertOrderedResultSet(eval(ct, test2), Boolean.TRUE); assertOrderedResultSet(eval(mt1, test2), Boolean.FALSE); assertOrderedResultSet(eval(mt2, test2), Boolean.FALSE); assertOrderedResultSet(eval(mt3, test2), Boolean.FALSE); assertOrderedResultSet(eval(ft1, test2), Boolean.FALSE); assertOrderedResultSet(eval(st1, test2), Boolean.FALSE); // topic is a summary topic String test3 = "@type='summary'"; assertOrderedResultSet(eval(ct, test3), Boolean.FALSE); assertOrderedResultSet(eval(mt1, test3), Boolean.FALSE); assertOrderedResultSet(eval(mt2, test3), Boolean.FALSE); assertOrderedResultSet(eval(mt3, test3), Boolean.FALSE); assertOrderedResultSet(eval(ft1, test3), Boolean.FALSE); assertOrderedResultSet(eval(st1, test3), Boolean.TRUE); // topic is an attachment String test4 = "matches(@hyperlink,'^xap\\:.*')"; assertOrderedResultSet(eval(ct, test4), Boolean.FALSE); assertOrderedResultSet(eval(mt1, test4), Boolean.FALSE); assertOrderedResultSet(eval(mt2, test4), Boolean.FALSE); assertOrderedResultSet(eval(mt3, test4), Boolean.TRUE); assertOrderedResultSet(eval(ft1, test4), Boolean.FALSE); assertOrderedResultSet(eval(st1, test4), Boolean.FALSE); // topic has markers String test5 = "count(marker)>0"; assertOrderedResultSet(eval(ct, test5), Boolean.FALSE); assertOrderedResultSet(eval(mt1, test5), Boolean.TRUE); assertOrderedResultSet(eval(mt2, test5), Boolean.TRUE); assertOrderedResultSet(eval(mt3, test5), Boolean.FALSE); assertOrderedResultSet(eval(ft1, test5), Boolean.FALSE); assertOrderedResultSet(eval(st1, test5), Boolean.FALSE); // topic has image String test6 = "count(image[@source])>0"; assertOrderedResultSet(eval(ct, test6), Boolean.FALSE); assertOrderedResultSet(eval(mt1, test6), Boolean.FALSE); assertOrderedResultSet(eval(mt2, test6), Boolean.TRUE); assertOrderedResultSet(eval(mt3, test6), Boolean.FALSE); assertOrderedResultSet(eval(ft1, test6), Boolean.FALSE); assertOrderedResultSet(eval(st1, test6), Boolean.FALSE); // topic has markers belonging to a specific group String test7 = "count(marker[@groupId='priorityMarkers'])>0"; assertOrderedResultSet(eval(ct, test7), Boolean.FALSE); assertOrderedResultSet(eval(mt1, test7), Boolean.TRUE); assertOrderedResultSet(eval(mt2, test7), Boolean.FALSE); assertOrderedResultSet(eval(mt3, test7), Boolean.FALSE); assertOrderedResultSet(eval(ft1, test7), Boolean.FALSE); assertOrderedResultSet(eval(st1, test7), Boolean.FALSE); } private static List<Object> concat(Collection<?> c1, Collection<?> c2) { List<Object> results = new ArrayList<Object>(c1.size() + c2.size()); results.addAll(c1); results.addAll(c2); return results; } @Before public void setUp() throws Exception { IMarkerSheet globalMarkers; InputStream markerSheetStream = new URL("platform:/plugin/org.xmind.core.runtime.tests/samples/markers.xml") .openStream(); try { globalMarkers = Core.getMarkerSheetBuilder().loadFromStream(markerSheetStream, null); } finally { markerSheetStream.close(); } IInputSource source = new BundleResourceInputSource("org.xmind.core.runtime.tests", "/samples/sample1.xmind"); //$NON-NLS-2$ IDeserializer deserializer = Core.getWorkbookBuilder().newDeserializer(); deserializer.setInputSource(source); deserializer.deserialize(null); workbook = deserializer.getWorkbook(); workbook.getMarkerSheet().setParentSheet(globalMarkers); axisProvider = new CoreAxisProvider(); } @After public void tearDown() { axisProvider = null; workbook = null; } private static void assertUnorderedResultSet(List<Object> actual, Object... expected) { Set<Object> expectedSet = new HashSet<Object>(asList(expected)); assertEquals(expectedSet.size(), actual.size()); assertTrue(expectedSet.containsAll(actual)); assertTrue(actual.containsAll(expectedSet)); } private static void assertOrderedResultSet(List<Object> actual, Object... expected) { List<Object> expectedList = asList(expected); assertEquals(expectedList.size(), actual.size()); Iterator it1 = expectedList.iterator(); Iterator it2 = actual.iterator(); while (it1.hasNext() && it2.hasNext()) { assertEquals(it1.next(), it2.next()); } assertFalse(it1.hasNext()); assertFalse(it2.hasNext()); } }