public void testDeleteConversationEvents() { ObservableConversationBlip outerBlip = target.getRootThread().appendBlip(); ObservableConversationThread inlineThread = outerBlip.addReplyThread(locateAfterLineElement(outerBlip.getContent())); ObservableConversationBlip innerBlip = inlineThread.appendBlip(); target.addListener(convListener); target.delete(); assertBlipInvalid(outerBlip); assertBlipInvalid(innerBlip); assertThreadInvalid(inlineThread); verify(convListener).onBlipDeleted(innerBlip); verify(convListener).onThreadDeleted(inlineThread); verify(convListener).onBlipDeleted(outerBlip); verifyNoMoreInteractions(convListener); }
public void testDeleteConversationEvents() { ObservableConversationBlip outerBlip = target.getRootThread().appendBlip(); ObservableConversationThread inlineThread = outerBlip.addReplyThread(locateAfterLineElement(outerBlip.getContent())); ObservableConversationBlip innerBlip = inlineThread.appendBlip(); target.addListener(convListener); target.delete(); assertBlipInvalid(outerBlip); assertBlipInvalid(innerBlip); assertThreadInvalid(inlineThread); verify(convListener).onBlipDeleted(innerBlip); verify(convListener).onThreadDeleted(inlineThread); verify(convListener).onBlipDeleted(outerBlip); verifyNoMoreInteractions(convListener); }
public <N, E extends N, T extends N> void exec(MutableDocument<N, E, T> doc) { Point<N> startText = doc.locate(locateAfterLineElement(doc)); doc.insertText(startText, "cd"); // Insert reply between c|d. N bodyNode = DocHelper.getElementWithTagName(doc, Blips.BODY_TAGNAME); N textNode = doc.getFirstChild(bodyNode); textNode = doc.getNextSibling(textNode); int replyLocation = doc.getLocation(Point.inText(textNode, 1)); blip.addReplyThread(replyLocation); // Insert text to give abc|d startText = Point.before(doc, textNode); doc.insertText(startText, "ab"); int newLocation = blip.locateReplyThreads().iterator().next().getLocation(); assertEquals(replyLocation + 2, newLocation); } });
public <N, E extends N, T extends N> void exec(MutableDocument<N, E, T> doc) { Point<N> startText = doc.locate(locateAfterLineElement(doc)); doc.insertText(startText, "cd"); // Insert reply between c|d. N bodyNode = DocHelper.getElementWithTagName(doc, Blips.BODY_TAGNAME); N textNode = doc.getFirstChild(bodyNode); textNode = doc.getNextSibling(textNode); int replyLocation = doc.getLocation(Point.inText(textNode, 1)); blip.addReplyThread(replyLocation); // Insert text to give abc|d startText = Point.before(doc, textNode); doc.insertText(startText, "ab"); int newLocation = blip.locateReplyThreads().iterator().next().getLocation(); assertEquals(replyLocation + 2, newLocation); } });
public <N, E extends N, T extends N> void exec(MutableDocument<N, E, T> doc) { Point<N> startText = doc.locate(locateAfterLineElement(doc)); doc.insertText(startText, "cd"); // Insert reply between c|d. N bodyNode = DocHelper.getElementWithTagName(doc, Blips.BODY_TAGNAME); N textNode = doc.getFirstChild(bodyNode); textNode = doc.getNextSibling(textNode); int replyLocation = doc.getLocation(Point.inText(textNode, 1)); ConversationThread replyThread = blip.addReplyThread(replyLocation); // Delete text and anchor. doc.deleteRange(Point.before(doc, textNode), Point.inElement(bodyNode, null)); int newLocation = blip.locateReplyThreads().iterator().next().getLocation(); assertEquals(Blips.INVALID_INLINE_LOCATION, newLocation); } });
public <N, E extends N, T extends N> void exec(MutableDocument<N, E, T> doc) { Point<N> startText = doc.locate(locateAfterLineElement(doc)); doc.insertText(startText, "cd"); // Insert reply between c|d. N bodyNode = DocHelper.getElementWithTagName(doc, Blips.BODY_TAGNAME); N textNode = doc.getFirstChild(bodyNode); textNode = doc.getNextSibling(textNode); int replyLocation = doc.getLocation(Point.inText(textNode, 1)); ConversationThread replyThread = blip.addReplyThread(replyLocation); // Delete text and anchor. doc.deleteRange(Point.before(doc, textNode), Point.inElement(bodyNode, null)); int newLocation = blip.locateReplyThreads().iterator().next().getLocation(); assertEquals(Blips.INVALID_INLINE_LOCATION, newLocation); } });
public void testInlineReplyWithMultipleAnchorsUsesFirst() { ConversationBlip blip = target.getRootThread().appendBlip(); MutableDocument<?, ?, ?> doc = blip.getContent(); final int location = locateAfterLineElement(doc); ConversationThread thread = blip.addReplyThread(location); // Duplicate the anchor. doc.with(new Action() { public <N, E extends N, T extends N> void exec(MutableDocument<N, E, T> doc) { E anchor = Point.elementAfter(doc, doc.locate(location)); E anchorParent = doc.getParentElement(anchor); doc.createChildElement(anchorParent, doc.getTagName(anchor), doc.getAttributes(anchor)); } }); assertEquals(Collections.singletonList(LocatedReplyThread.of(thread, location)), blip.locateReplyThreads()); }
public void testAppendInlineReplyCreatesInlineThread() { ConversationBlip blip = target.getRootThread().appendBlip(); MutableDocument<?, ?, ?> doc = blip.getContent(); int location = locateAfterLineElement(doc); ConversationThread thread = blip.addReplyThread(location); assertSame(blip, thread.getParentBlip()); assertEquals(Collections.singletonList(LocatedReplyThread.of(thread, location)), blip.locateReplyThreads()); assertThreadChildrenConsistent(blip); }
private static <N, E extends N, T extends N> int locateAfterLineElementInner( MutableDocument<N, E, T> doc) { for (E el : DocIterate.deepElementsReverse(doc, doc.getDocumentElement(), null)) { if (LineContainers.isLineContainer(doc, el)) { Point<N> point = Point.inElement((N) el, null); return doc.getLocation(point); } } LineContainers.appendLine(doc, XmlStringBuilder.createEmpty()); return locateAfterLineElement(doc); }
public void testInlineReplyWithMultipleAnchorsUsesFirst() { ConversationBlip blip = target.getRootThread().appendBlip(); MutableDocument<?, ?, ?> doc = blip.getContent(); final int location = locateAfterLineElement(doc); ConversationThread thread = blip.addReplyThread(location); // Duplicate the anchor. doc.with(new Action() { public <N, E extends N, T extends N> void exec(MutableDocument<N, E, T> doc) { E anchor = Point.elementAfter(doc, doc.locate(location)); E anchorParent = doc.getParentElement(anchor); doc.createChildElement(anchorParent, doc.getTagName(anchor), doc.getAttributes(anchor)); } }); assertEquals(Collections.singletonList(LocatedReplyThread.of(thread, location)), blip.locateReplyThreads()); }
public void testAppendInlineReplyCreatesInlineThread() { ConversationBlip blip = target.getRootThread().appendBlip(); MutableDocument<?, ?, ?> doc = blip.getContent(); int location = locateAfterLineElement(doc); ConversationThread thread = blip.addReplyThread(location); assertSame(blip, thread.getParentBlip()); assertEquals(Collections.singletonList(LocatedReplyThread.of(thread, location)), blip.locateReplyThreads()); assertThreadChildrenConsistent(blip); }
private static <N, E extends N, T extends N> int locateAfterLineElementInner( MutableDocument<N, E, T> doc) { for (E el : DocIterate.deepElementsReverse(doc, doc.getDocumentElement(), null)) { if (LineContainers.isLineContainer(doc, el)) { Point<N> point = Point.inElement((N) el, null); return doc.getLocation(point); } } LineContainers.appendLine(doc, XmlStringBuilder.createEmpty()); return locateAfterLineElement(doc); }
public void testDeleteConversationInvalidatesNonRootThreads() { ObservableConversationBlip outerBlip = target.getRootThread().appendBlip(); ObservableConversationThread inlineThread = outerBlip.addReplyThread(locateAfterLineElement(outerBlip.getContent())); ObservableConversationBlip innerBlip = inlineThread.appendBlip(); target.addListener(convListener); target.delete(); assertBlipInvalid(outerBlip); assertBlipInvalid(innerBlip); assertThreadInvalid(inlineThread); }
public void testDeleteConversationInvalidatesNonRootThreads() { ObservableConversationBlip outerBlip = target.getRootThread().appendBlip(); ObservableConversationThread inlineThread = outerBlip.addReplyThread(locateAfterLineElement(outerBlip.getContent())); ObservableConversationBlip innerBlip = inlineThread.appendBlip(); target.addListener(convListener); target.delete(); assertBlipInvalid(outerBlip); assertBlipInvalid(innerBlip); assertThreadInvalid(inlineThread); }
public void testDeleteBlipWithInlineReplyDeletesReply() { ConversationBlip blip = target.getRootThread().appendBlip(); MutableDocument<?, ?, ?> doc = blip.getContent(); ConversationThread reply = blip.addReplyThread(locateAfterLineElement(doc)); ConversationBlip replyBlip = reply.appendBlip(); blip.delete(); assertNull(target.getRootThread().getFirstBlip()); assertThreadInvalid(reply); assertBlipInvalid(replyBlip); }
public void testDeleteBlipWithInlineReplyDeletesReply() { ConversationBlip blip = target.getRootThread().appendBlip(); MutableDocument<?, ?, ?> doc = blip.getContent(); ConversationThread reply = blip.addReplyThread(locateAfterLineElement(doc)); ConversationBlip replyBlip = reply.appendBlip(); blip.delete(); assertNull(target.getRootThread().getFirstBlip()); assertThreadInvalid(reply); assertBlipInvalid(replyBlip); }
public void testDeleteInlineReplyDeletesAnchor() { ConversationBlip blip = target.getRootThread().appendBlip(); XmlStringBuilder xmlBefore = XmlStringBuilder.innerXml(blip.getContent()); ConversationThread inlineReply = blip.addReplyThread(locateAfterLineElement( blip.getContent())); ConversationBlip inlineReplyBlip = inlineReply.appendBlip(); inlineReplyBlip.delete(); assertBlipInvalid(inlineReplyBlip); assertThreadInvalid(inlineReply); assertStructureEquivalent(xmlBefore, blip.getContent()); }
public void testDeleteInlineReplyDeletesAnchor() { ConversationBlip blip = target.getRootThread().appendBlip(); XmlStringBuilder xmlBefore = XmlStringBuilder.innerXml(blip.getContent()); ConversationThread inlineReply = blip.addReplyThread(locateAfterLineElement( blip.getContent())); ConversationBlip inlineReplyBlip = inlineReply.appendBlip(); inlineReplyBlip.delete(); assertBlipInvalid(inlineReplyBlip); assertThreadInvalid(inlineReply); assertStructureEquivalent(xmlBefore, blip.getContent()); }
public void testDeleteBlipWithManyRepliesDeletesReplies() { ConversationBlip blip = target.getRootThread().appendBlip(); MutableDocument<?, ?, ?> doc = blip.getContent(); ConversationThread reply1 = blip.addReplyThread(); // Append blips to get a new ID for the next thread. reply1.appendBlip(); ConversationThread inlineReply1 = blip.addReplyThread(locateAfterLineElement(doc)); inlineReply1.appendBlip(); ConversationThread reply2 = blip.addReplyThread(); reply2.appendBlip(); ConversationThread inlineReply2 = blip.addReplyThread(locateAfterLineElement(doc)); inlineReply2.appendBlip(); blip.delete(); assertNull(target.getRootThread().getFirstBlip()); assertBlipInvalid(blip); assertThreadInvalid(reply1); assertThreadInvalid(reply2); assertThreadInvalid(inlineReply1); assertThreadInvalid(inlineReply2); }
/** * Tests that non-inline replies to an inline reply are deleted * completely when the inline reply's parent blip is deleted. No * tombstones remain. */ public void testDeleteBlipDeletesRepliesToInlineReply() { ConversationBlip blip = target.getRootThread().appendBlip(); ConversationThread inlineReply = blip.addReplyThread(locateAfterLineElement( blip.getContent())); ConversationBlip inlineReplyBlip = inlineReply.appendBlip(); ConversationThread nonInlineReplyToReply = inlineReplyBlip.addReplyThread(); ConversationBlip nonInlineReplyBlip = nonInlineReplyToReply.appendBlip(); blip.delete(); assertNull(target.getRootThread().getFirstBlip()); assertBlipInvalid(nonInlineReplyBlip); assertThreadInvalid(nonInlineReplyToReply); assertBlipInvalid(inlineReplyBlip); assertThreadInvalid(inlineReply); }