package org.exist.fluent; import static org.junit.Assert.*; import static org.hamcrest.Matchers.*; import java.util.EnumSet; import org.jmock.*; import org.jmock.integration.junit4.*; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(JMock.class) public class NodeTest extends DatabaseTestCase { private Mockery context = new JUnit4Mockery(); @Test(expected = UnsupportedOperationException.class) public void appendMemtree() { db.query().single("<foo/>").node().append(); } @Test(expected = UnsupportedOperationException.class) public void replaceMemtree() { db.query().single("<foo/>").node().replace(); } @Test(expected = UnsupportedOperationException.class) public void updateMemtree() { db.query().single("<foo/>").node().update(); } @Test(expected = DatabaseException.class) public void comparableValueMemtree() { db.query().single("<foo/>").comparableValue(); } @Test(expected = DatabaseException.class) public void comparableValue() { db.getFolder("/").documents().load(Name.generate(), Source.xml("<foo/>")).root().comparableValue(); } @Test public void equals1() { XMLDocument doc = db.createFolder("/test").documents().build(Name.create("foo")) .elem("top").elem("child").end("child").end("top").commit(); Object o1 = doc.query().single("//child"), o2 = doc.query().single("//child"); assertTrue(o1.equals(o2)); assertEquals(o1.hashCode(), o2.hashCode()); } @Test public void equals2() { XMLDocument doc = db.createFolder("/test").documents().build(Name.create("foo")) .elem("top").elem("child").end("child").end("top").commit(); Object o1 = doc.query().single("//child"), o2 = doc.query().single("//top"); assertFalse(o1.equals(o2)); // can't assert unequal hashCodes, they're allowed to be the same } @Test public void equals3() { Folder folder = db.createFolder("/test"); XMLDocument doc1 = folder.documents().build(Name.create("foo1")) .elem("top").elem("child").end("child").end("top").commit(); XMLDocument doc2 = folder.documents().build(Name.create("foo2")) .elem("top").elem("child").end("child").end("top").commit(); Object o1 = doc1.query().single("//top"), o2 = doc2.query().single("//top"); assertFalse(o1.equals(o2)); } @Test public void compareDocumentOrderTo1() { Node root = db.getFolder("/").documents().load(Name.generate(), Source.xml( "<root><a><aa/></a><b><bb/></b><c><cc/></c></root>")).root(); Node a = root.query().single("//a").node(), aa = root.query().single("//aa").node(); Node b = root.query().single("//b").node(), bb = root.query().single("//bb").node(); Node c = root.query().single("//c").node(), cc = root.query().single("//cc").node(); assertEquals(0, a.compareDocumentOrderTo(a)); assertEquals(0, a.compareDocumentOrderTo(root.query().single("//a").node())); assertThat(a.compareDocumentOrderTo(b), lessThan(0)); assertThat(c.compareDocumentOrderTo(b), greaterThan(0)); assertThat(aa.compareDocumentOrderTo(a), greaterThan(0)); assertThat(bb.compareDocumentOrderTo(cc), lessThan(0)); assertThat(root.compareDocumentOrderTo(c), lessThan(0)); } @Test public void compareDocumentOrderTo2() { ItemList nodes = db.query().all("let $x := <root><a><aa/></a><b><bb/></b><c><cc/></c></root> return ($x//a, $x//aa, $x//b, $x//bb, $x//c, $x//cc, $x)"); Node root = nodes.get(6).node(); Node a = nodes.get(0).node(), aa = nodes.get(1).node(); Node b = nodes.get(2).node(), bb = nodes.get(3).node(); Node c = nodes.get(4).node(), cc = nodes.get(5).node(); assertEquals(0, a.compareDocumentOrderTo(a)); assertThat(a.compareDocumentOrderTo(b), lessThan(0)); assertThat(c.compareDocumentOrderTo(b), greaterThan(0)); assertThat(aa.compareDocumentOrderTo(a), greaterThan(0)); assertThat(bb.compareDocumentOrderTo(cc), lessThan(0)); assertThat(root.compareDocumentOrderTo(c), lessThan(0)); } @Test(expected = DatabaseException.class) public void compareDocumentOrderTo3() { Node root1 = db.getFolder("/").documents().load(Name.generate(), Source.xml("<root1/>")).root(); Node root2 = db.getFolder("/").documents().load(Name.generate(), Source.xml("<root2/>")).root(); root1.compareDocumentOrderTo(root2); } @Test(expected = DatabaseException.class) public void compareDocumentOrderTo4() { Node root1 = db.getFolder("/").documents().load(Name.generate(), Source.xml("<root1/>")).root(); Node root2 = db.query().single("<root2/>").node(); root1.compareDocumentOrderTo(root2); } @Test(expected = DatabaseException.class) public void compareDocumentOrderTo5() { Node root1 = db.query().single("<root1/>").node(); Node root2 = db.query().single("<root2/>").node(); root1.compareDocumentOrderTo(root2); } @Test public void append1() { XMLDocument doc = db.createFolder("/test").documents().build(Name.create("foo")) .elem("top").end("top").commit(); Node node = doc.root().append().elem("child").end("child").commit(); assertNotNull(node); assertEquals("child", node.name()); assertEquals(1, doc.root().query().single("count(*)").intValue()); } @Test public void append2() { XMLDocument doc = db.createFolder("/test").documents().build(Name.create("foo")) .elem("top").end("top").commit(); Node node = doc.root().append() .elem("child").attr("blah", "ick").elem("subchild").end("subchild").end("child").commit(); assertNotNull(node); assertEquals("child", node.name()); assertEquals(1, doc.root().query().single("count(*)").intValue()); assertEquals("ick", node.query().single("@blah").value()); assertEquals("subchild", node.query().single("*").node().name()); } @Test(expected = DatabaseException.class) public void afterDelete1() { XMLDocument doc = db.createFolder("/test").documents().build(Name.create("foo")) .elem("top").end("top").commit(); Node node = doc.root().append().elem("child").end("child").commit(); node.delete(); doc.root().append().elem("newchild").end("newchild").commit(); node.update().attr("foo", "bar").commit(); } @Test(expected = DatabaseException.class) public void afterDelete2() { XMLDocument doc = db.createFolder("/test").documents().build(Name.create("foo")) .elem("top").end("top").commit(); Node node = doc.root(); doc.delete(); doc = null; db.createFolder("/test").documents().build(Name.create("bar")) .elem("ack").end("ack").commit(); node.update().attr("foo", "bar").commit(); } @Test(expected = DatabaseException.class) public void afterDelete3() { Folder folder = db.createFolder("/test"); XMLDocument doc = folder.documents().build(Name.create("foo")) .elem("top").end("top").commit(); Node node = doc.root(); folder.delete(); db.createFolder("/test").documents().build(Name.create("bar")) .elem("ack").end("ack").commit(); node.update().attr("foo", "bar").commit(); } @Test public void deleteRoot() { Node root = db.createFolder("/test").documents().load(Name.create("test"), Source.xml("<foo/>")).root(); root.delete(); assertFalse(db.getFolder("/test").documents().contains("test")); } @Test public void replaceRoot() { Node root = db.createFolder("/test").documents().load(Name.create("test"), Source.xml("<foo/>")).root(); root.replace().elem("bar").end("bar").commit(); assertEquals("bar", db.getFolder("/test").documents().get("test").xml().root().name()); } @Test public void appendTriggersListeners() { final XMLDocument doc = db.getFolder("/").documents().load(Name.create("foo"), Source.xml("<foo/>")); final Document.Listener listener = context.mock(Document.Listener.class); context.checking(new Expectations() {{ one(listener).handle(new Document.Event(Trigger.BEFORE_UPDATE, doc.path(), doc)); one(listener).handle(new Document.Event(Trigger.AFTER_UPDATE, doc.path(), doc)); }}); db.getFolder("/").listeners().add(EnumSet.of(Trigger.BEFORE_UPDATE, Trigger.AFTER_UPDATE), listener); try { doc.root().append().elem("bar").end("bar").commit(); } finally { db.getFolder("/").listeners().remove(listener); } } @Test public void deleteTriggersListeners() { final XMLDocument doc = db.getFolder("/").documents().load(Name.create("foo"), Source.xml("<foo><bar/></foo>")); final Document.Listener listener = context.mock(Document.Listener.class); context.checking(new Expectations() {{ one(listener).handle(new Document.Event(Trigger.BEFORE_UPDATE, doc.path(), doc)); one(listener).handle(new Document.Event(Trigger.AFTER_UPDATE, doc.path(), doc)); }}); db.getFolder("/").listeners().add(EnumSet.of(Trigger.BEFORE_UPDATE, Trigger.AFTER_UPDATE), listener); try { doc.root().query().single("bar").node().delete(); } finally { db.getFolder("/").listeners().remove(listener); } } @Test public void replaceTriggersListeners() { final XMLDocument doc = db.getFolder("/").documents().load(Name.create("foo"), Source.xml("<foo><bar/></foo>")); final Document.Listener listener = context.mock(Document.Listener.class); context.checking(new Expectations() {{ one(listener).handle(new Document.Event(Trigger.BEFORE_UPDATE, doc.path(), doc)); one(listener).handle(new Document.Event(Trigger.AFTER_UPDATE, doc.path(), doc)); }}); db.getFolder("/").listeners().add(EnumSet.of(Trigger.BEFORE_UPDATE, Trigger.AFTER_UPDATE), listener); try { doc.root().query().single("bar").node().replace().elem("baz").end("baz").commit(); } finally { db.getFolder("/").listeners().remove(listener); } } @Test public void updateTriggersListeners() { final XMLDocument doc = db.getFolder("/").documents().load(Name.create("foo"), Source.xml("<foo><bar/></foo>")); final Document.Listener listener = context.mock(Document.Listener.class); context.checking(new Expectations() {{ one(listener).handle(new Document.Event(Trigger.BEFORE_UPDATE, doc.path(), doc)); one(listener).handle(new Document.Event(Trigger.AFTER_UPDATE, doc.path(), doc)); }}); db.getFolder("/").listeners().add(EnumSet.of(Trigger.BEFORE_UPDATE, Trigger.AFTER_UPDATE), listener); try { doc.root().query().single("bar").node().update().attr("x", "y").commit(); } finally { db.getFolder("/").listeners().remove(listener); } } }