package com.orgzly.android.misc; import android.database.Cursor; import com.orgzly.android.Book; import com.orgzly.android.BookName; import com.orgzly.android.Note; import com.orgzly.android.NotePosition; import com.orgzly.android.OrgzlyTest; import com.orgzly.android.provider.clients.NotesClient; import com.orgzly.android.ui.NotePlace; import com.orgzly.android.ui.Place; import com.orgzly.org.OrgHead; import org.junit.Test; import java.io.IOException; import java.util.HashSet; import java.util.Set; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotSame; import static junit.framework.Assert.assertTrue; public class StructureTest extends OrgzlyTest { @Test public void testNewNote() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n"); Note newNote = new Note(); newNote.getPosition().setBookId(book.getId()); newNote.getHead().setTitle("Note 2"); shelf.createNote(newNote, null); assertEquals("description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "* Note 2\n" , shelf.getBookContent("notebook", BookName.Format.ORG)); assertEquals(shelf.getNote("").getId(), shelf.getNote("Note 2").getPosition().getParentId()); } @Test public void testBookSetupTitles() { shelfTestUtils.setupBook("notebook", "" + "description\n" + "* Note #1.\n" + "* Note #2.\n" + "** Note #3.\n" + "** Note #4.\n" + "*** Note #5.\n" + "**** Note #6.\n" + "** Note #7.\n" + "* Note #8.\n" + "**** Note #9.\n" + "** Note #10.\n" + ""); assertEquals("Note #1.", NotesClient.getNote(context, 1).getHead().getTitle()); assertEquals("Note #2.", NotesClient.getNote(context, 7).getHead().getTitle()); assertEquals("Note #3.", NotesClient.getNote(context, 2).getHead().getTitle()); assertEquals("Note #4.", NotesClient.getNote(context, 5).getHead().getTitle()); assertEquals("Note #5.", NotesClient.getNote(context, 4).getHead().getTitle()); assertEquals("Note #6.", NotesClient.getNote(context, 3).getHead().getTitle()); assertEquals("Note #7.", NotesClient.getNote(context, 6).getHead().getTitle()); assertEquals("Note #8.", NotesClient.getNote(context, 10).getHead().getTitle()); assertEquals("Note #9.", NotesClient.getNote(context, 8).getHead().getTitle()); assertEquals("Note #10.", NotesClient.getNote(context, 9).getHead().getTitle()); } @Test public void testBookSetupLevels() { shelfTestUtils.setupBook("notebook", "" + "description\n" + "* Note #1.\n" + "* Note #2.\n" + "** Note #3.\n" + "** Note #4.\n" + "*** Note #5.\n" + "**** Note #6.\n" + "** Note #7.\n" + "* Note #8.\n" + "**** Note #9.\n" + "** Note #10.\n" + ""); assertEquals(0, NotesClient.getNote(context, 11).getPosition().getLevel()); assertEquals(1, NotesClient.getNote(context, 1).getPosition().getLevel()); assertEquals(1, NotesClient.getNote(context, 7).getPosition().getLevel()); assertEquals(2, NotesClient.getNote(context, 2).getPosition().getLevel()); assertEquals(2, NotesClient.getNote(context, 5).getPosition().getLevel()); assertEquals(3, NotesClient.getNote(context, 4).getPosition().getLevel()); assertEquals(4, NotesClient.getNote(context, 3).getPosition().getLevel()); assertEquals(2, NotesClient.getNote(context, 6).getPosition().getLevel()); assertEquals(1, NotesClient.getNote(context, 10).getPosition().getLevel()); assertEquals(4, NotesClient.getNote(context, 8).getPosition().getLevel()); assertEquals(2, NotesClient.getNote(context, 9).getPosition().getLevel()); } @Test public void testCut() { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "* Note #1.\n" + "* Note #2.\n" + "** Note #3.\n" + "** Note #4.\n" + "*** Note #5.\n" + "**** Note #6.\n" + "** Note #7.\n" + "* Note #8.\n" + "**** Note #9.\n" + "** Note #10.\n" + ""); Set<Long> ids = new HashSet<>(); ids.add(1L); ids.add(2L); shelf.cut(book.getId(), ids); assertEquals("There should be less notes in the book", 8, NotesClient.getCount(context, book.getId())); Cursor cursor = NotesClient.getCursorForBook(context, book.getName()); try { Note note; OrgHead head; cursor.moveToFirst(); note = NotesClient.fromCursor(cursor); head = note.getHead(); assertEquals("Title for book should match", "Note #2.", head.getTitle()); assertEquals("Level for book should match", 1, note.getPosition().getLevel()); cursor.moveToNext(); note = NotesClient.fromCursor(cursor); head = note.getHead(); assertEquals("Title for book should match", "Note #4.", head.getTitle()); assertEquals("Level for book should match", 2, note.getPosition().getLevel()); cursor.moveToNext(); note = NotesClient.fromCursor(cursor); head = note.getHead(); assertEquals("Title for book should match", "Note #5.", head.getTitle()); assertEquals("Level for book should match", 3, note.getPosition().getLevel()); } finally { cursor.close(); } } @Test public void testPasteToDifferentBook() throws IOException { shelfTestUtils.setupBook("notebook-1", "" + "description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "*** Note 1.1.1\n"); Book book2 = shelfTestUtils.setupBook("notebook-2", "" + "description\n" + "\n" + "* Note A\n" + "** Note A.A\n" + "*** Note A.A.A\n"); shelf.cut(book2.getId(), shelf.getNote("Note A.A").getId()); Note n = shelf.getNote("Note 1.1.1"); shelf.paste(n.getPosition().getBookId(), n.getId(), Place.UNDER); assertEquals("description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "*** Note 1.1.1\n" + "**** Note A.A\n" + "***** Note A.A.A\n", shelf.getBookContent("notebook-1", BookName.Format.ORG)); assertEquals("description\n" + "\n" + "* Note A\n", shelf.getBookContent("notebook-2", BookName.Format.ORG)); } @Test public void testPasteUnder() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "*** Note 1.1.1\n" + "** Note 1.2\n" + "*** Note 1.2.1\n" + "*** Note 1.2.2\n" + "* Note 2\n"); /* Cut & paste 1.1 under 1.2. */ shelf.cut(book.getId(), shelf.getNote("Note 1.1").getId()); Note n = shelf.getNote("Note 1.2"); shelf.paste(n.getPosition().getBookId(), n.getId(), Place.UNDER); assertEquals("description\n" + "\n" + "* Note 1\n" + "** Note 1.2\n" + "*** Note 1.2.1\n" + "*** Note 1.2.2\n" + "*** Note 1.1\n" + "**** Note 1.1.1\n" + "* Note 2\n", shelf.getBookContent("notebook", BookName.Format.ORG)); NotePosition n1 = shelf.getNote("Note 1").getPosition(); NotePosition n12 = shelf.getNote("Note 1.2").getPosition(); NotePosition n121 = shelf.getNote("Note 1.2.1").getPosition(); NotePosition n122 = shelf.getNote("Note 1.2.2").getPosition(); NotePosition n11 = shelf.getNote("Note 1.1").getPosition(); NotePosition n111 = shelf.getNote("Note 1.1.1").getPosition(); NotePosition n2 = shelf.getNote("Note 2").getPosition(); assertEquals(shelf.getNote("Note 1.2").getId(), n11.getParentId()); assertEquals(1, n1.getLevel()); assertEquals(2, n12.getLevel()); assertEquals(3, n121.getLevel()); assertEquals(3, n122.getLevel()); assertEquals(3, n11.getLevel()); assertEquals(4, n111.getLevel()); assertEquals(1, n2.getLevel()); assertTrue(n1.getLft() < n12.getLft()); assertTrue(n12.getLft() < n121.getLft()); assertTrue(n121.getLft() < n121.getRgt()); assertTrue(n121.getRgt() < n122.getLft()); assertTrue(n122.getLft() < n122.getRgt()); assertTrue(n122.getRgt() < n11.getLft()); assertTrue(n11.getLft() < n111.getLft()); assertTrue(n111.getLft() < n111.getRgt()); assertTrue(n111.getRgt() < n11.getRgt()); assertTrue(n11.getRgt() < n12.getRgt()); assertTrue(n12.getRgt() < n1.getRgt()); assertTrue(n1.getRgt() < n2.getLft()); assertTrue(n2.getLft() < n2.getRgt()); assertEquals(5, n1.getDescendantsCount()); assertEquals(4, n12.getDescendantsCount()); assertEquals(0, n121.getDescendantsCount()); assertEquals(0, n122.getDescendantsCount()); assertEquals(1, n11.getDescendantsCount()); assertEquals(0, n111.getDescendantsCount()); assertEquals(0, n2.getDescendantsCount()); } @Test public void testPasteUnderFolded() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "*** Note 1.1.1\n" + "*** Note 1.1.2\n" + "** Note 1.2\n" + "* Note 2\n"); /* Cut & paste 2 under folded 1.1. */ shelf.cut(book.getId(), shelf.getNote("Note 2").getId()); shelf.toggleFoldedState(shelf.getNote("Note 1.1").getId()); Note n = shelf.getNote("Note 1.1"); shelf.paste(n.getPosition().getBookId(), n.getId(), Place.UNDER); assertEquals("description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "*** Note 1.1.1\n" + "*** Note 1.1.2\n" + "*** Note 2\n" + "** Note 1.2\n" , shelf.getBookContent("notebook", BookName.Format.ORG)); NotePosition n1 = shelf.getNote("Note 1").getPosition(); NotePosition n11 = shelf.getNote("Note 1.1").getPosition(); NotePosition n111 = shelf.getNote("Note 1.1.1").getPosition(); NotePosition n112 = shelf.getNote("Note 1.1.2").getPosition(); NotePosition n2 = shelf.getNote("Note 2").getPosition(); NotePosition n12 = shelf.getNote("Note 1.2").getPosition(); assertEquals(shelf.getNote("Note 1.1").getId(), n2.getParentId()); assertEquals(1, n1.getLevel()); assertEquals(2, n11.getLevel()); assertEquals(3, n111.getLevel()); assertEquals(3, n112.getLevel()); assertEquals(3, n2.getLevel()); assertEquals(2, n12.getLevel()); assertTrue(n1.getLft() < n11.getLft()); assertTrue(n11.getLft() < n111.getLft()); assertTrue(n111.getLft() < n111.getRgt()); assertTrue(n111.getLft() < n111.getRgt()); assertTrue(n111.getRgt() < n112.getLft()); assertTrue(n112.getLft() < n112.getRgt()); assertTrue(n112.getRgt() < n2.getLft()); assertTrue(n2.getLft() < n2.getRgt()); assertTrue(n2.getRgt() < n11.getRgt()); assertTrue(n11.getRgt() < n12.getLft()); assertTrue(n12.getLft() < n12.getRgt()); assertTrue(n12.getRgt() < n1.getRgt()); assertEquals(5, n1.getDescendantsCount()); assertEquals(3, n11.getDescendantsCount()); assertEquals(0, n111.getDescendantsCount()); assertEquals(0, n112.getDescendantsCount()); assertEquals(0, n2.getDescendantsCount()); assertEquals(0, n12.getDescendantsCount()); assertEquals(0, n1.getFoldedUnderId()); assertEquals(0, n11.getFoldedUnderId()); assertEquals(shelf.getNote("Note 1.1").getId(), n111.getFoldedUnderId()); assertEquals(shelf.getNote("Note 1.1").getId(), n112.getFoldedUnderId()); assertEquals(shelf.getNote("Note 1.1").getId(), n2.getFoldedUnderId()); assertEquals(0, n12.getFoldedUnderId()); } @Test public void testCutNoteUnderFoldedThenPaste() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "*** Note 1.1.1\n"); /* Cut & paste hidden 1.1.1 */ shelf.toggleFoldedState(shelf.getNote("Note 1.1").getId()); shelf.cut(book.getId(), shelf.getNote("Note 1.1.1").getId()); Note n = shelf.getNote("Note 1"); shelf.paste(n.getPosition().getBookId(), n.getId(), Place.UNDER); assertEquals("description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "** Note 1.1.1\n" , shelf.getBookContent("notebook", BookName.Format.ORG)); NotePosition n1 = shelf.getNote("Note 1").getPosition(); NotePosition n11 = shelf.getNote("Note 1.1").getPosition(); NotePosition n111 = shelf.getNote("Note 1.1.1").getPosition(); assertEquals(0, n1.getFoldedUnderId()); assertEquals(0, n11.getFoldedUnderId()); assertEquals(0, n111.getFoldedUnderId()); } @Test public void testPromote() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "* Note 2\n"); Note note = shelf.getNote("Note 1.1"); /* TODO: Assert 0 if trying to promote level 1 note. */ assertEquals(1, shelf.promoteNotes(book.getId(), note.getId())); assertEquals("description\n" + "\n" + "* Note 1\n" + "* Note 1.1\n" + "* Note 2\n", shelf.getBookContent("notebook", BookName.Format.ORG)); NotePosition n1 = shelf.getNote("Note 1").getPosition(); NotePosition n11 = shelf.getNote("Note 1.1").getPosition(); NotePosition n2 = shelf.getNote("Note 2").getPosition(); assertEquals(0, n1.getDescendantsCount()); assertEquals(0, n11.getDescendantsCount()); assertEquals(0, n2.getDescendantsCount()); assertEquals(1, n1.getLevel()); assertEquals(1, n11.getLevel()); assertEquals(1, n2.getLevel()); assertTrue(n1.getLft() < n1.getRgt()); assertTrue(n1.getRgt() < n11.getLft()); assertTrue(n11.getLft() < n11.getRgt()); assertTrue(n11.getRgt() < n2.getLft()); assertTrue(n2.getLft() < n2.getRgt()); } @Test public void testPromote2() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "*** Note 1.1.1\n" + "** Note 1.2\n" + "* Note 2\n"); Note note = shelf.getNote("Note 1.1.1"); /* Promote 1.1.1 twice. */ assertEquals(1, shelf.promoteNotes(book.getId(), note.getId())); assertEquals(1, shelf.promoteNotes(book.getId(), note.getId())); assertEquals("description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "** Note 1.2\n" + "* Note 1.1.1\n" + "* Note 2\n", shelf.getBookContent("notebook", BookName.Format.ORG)); NotePosition n1 = shelf.getNote("Note 1").getPosition(); NotePosition n11 = shelf.getNote("Note 1.1").getPosition(); NotePosition n12 = shelf.getNote("Note 1.2").getPosition(); NotePosition n111 = shelf.getNote("Note 1.1.1").getPosition(); NotePosition n2 = shelf.getNote("Note 2").getPosition(); assertEquals(2, n1.getDescendantsCount()); assertEquals(0, n11.getDescendantsCount()); assertEquals(0, n12.getDescendantsCount()); assertEquals(0, n111.getDescendantsCount()); assertEquals(0, n2.getDescendantsCount()); assertEquals(1, n1.getLevel()); assertEquals(2, n11.getLevel()); assertEquals(2, n12.getLevel()); assertEquals(1, n111.getLevel()); assertEquals(1, n2.getLevel()); assertTrue(n1.getLft() < n11.getLft()); assertTrue(n11.getLft() < n11.getRgt()); assertTrue(n11.getRgt() < n12.getLft()); assertTrue(n12.getLft() < n12.getRgt()); assertTrue(n12.getRgt() < n1.getRgt()); assertTrue(n1.getRgt() < n111.getLft()); assertTrue(n111.getLft() < n111.getRgt()); assertTrue(n111.getRgt() < n2.getLft()); assertTrue(n2.getLft() < n2.getRgt()); } @Test public void testPromoteFolded() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "*** Note 1.1.1\n" + "** Note 1.2\n" + "* Note 2\n"); Note note = shelf.getNote("Note 1.1"); /* Promote folded 1.1 */ shelf.toggleFoldedState(note.getId()); assertEquals(1, shelf.promoteNotes(book.getId(), note.getId())); assertEquals("description\n" + "\n" + "* Note 1\n" + "** Note 1.2\n" + "* Note 1.1\n" + "** Note 1.1.1\n" + "* Note 2\n", shelf.getBookContent("notebook", BookName.Format.ORG)); NotePosition n1 = shelf.getNote("Note 1").getPosition(); NotePosition n12 = shelf.getNote("Note 1.2").getPosition(); NotePosition n11 = shelf.getNote("Note 1.1").getPosition(); NotePosition n111 = shelf.getNote("Note 1.1.1").getPosition(); NotePosition n2 = shelf.getNote("Note 2").getPosition(); assertEquals(1, n1.getDescendantsCount()); assertEquals(0, n12.getDescendantsCount()); assertEquals(1, n11.getDescendantsCount()); assertEquals(0, n111.getDescendantsCount()); assertEquals(0, n2.getDescendantsCount()); assertEquals(1, n1.getLevel()); assertEquals(2, n12.getLevel()); assertEquals(1, n11.getLevel()); assertEquals(2, n111.getLevel()); assertEquals(1, n2.getLevel()); assertEquals(0, n1.getFoldedUnderId()); assertEquals(0, n12.getFoldedUnderId()); assertEquals(0, n11.getFoldedUnderId()); assertEquals(shelf.getNote("Note 1.1").getId(), n111.getFoldedUnderId()); assertEquals(0, n2.getFoldedUnderId()); assertFalse(n1.isFolded()); assertFalse(n12.isFolded()); assertTrue(n11.isFolded()); assertFalse(n111.isFolded()); assertFalse(n2.isFolded()); assertTrue(n1.getLft() < n12.getLft()); assertTrue(n12.getLft() < n12.getRgt()); assertTrue(n12.getRgt() < n11.getRgt()); assertTrue(n1.getRgt() < n11.getLft()); assertTrue(n11.getLft() < n111.getLft()); assertTrue(n111.getLft() < n111.getRgt()); assertTrue(n111.getRgt() < n11.getRgt()); assertTrue(n11.getRgt() < n2.getLft()); assertTrue(n2.getLft() < n2.getRgt()); } @Test public void testDemote() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "* Note 2\n"); /* Demote 2. */ assertEquals(1, shelf.demoteNotes(book.getId(), shelf.getNote("Note 2").getId())); assertEquals("description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "** Note 2\n", shelf.getBookContent("notebook", BookName.Format.ORG)); NotePosition n1 = shelf.getNote("Note 1").getPosition(); NotePosition n11 = shelf.getNote("Note 1.1").getPosition(); NotePosition n2 = shelf.getNote("Note 2").getPosition(); assertEquals(2, n1.getDescendantsCount()); assertEquals(0, n11.getDescendantsCount()); assertEquals(0, n2.getDescendantsCount()); assertEquals(1, n1.getLevel()); assertEquals(2, n11.getLevel()); assertEquals(2, n2.getLevel()); assertTrue(n1.getLft() < n11.getLft()); assertTrue(n11.getLft() < n11.getRgt()); assertTrue(n11.getRgt() < n2.getLft()); assertTrue(n2.getLft() < n2.getRgt()); assertTrue(n2.getRgt() < n1.getRgt()); } @Test public void testNewBelowFoldable() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n"); Note newNote = new Note(); newNote.getPosition().setBookId(book.getId()); newNote.getHead().setTitle("Note 2"); shelf.createNote( newNote, new NotePlace(book.getId(), shelf.getNote("Note 1").getId(), Place.BELOW) ); assertEquals("description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "* Note 2\n", shelf.getBookContent("notebook", BookName.Format.ORG)); NotePosition n1 = shelf.getNote("Note 1").getPosition(); NotePosition n11 = shelf.getNote("Note 1.1").getPosition(); NotePosition n2 = shelf.getNote("Note 2").getPosition(); assertTrue(n1.getLft() < n11.getLft()); assertTrue(n11.getLft() < n11.getRgt()); assertTrue(n11.getRgt() < n1.getRgt()); assertTrue(n1.getRgt() < n2.getLft()); assertTrue(n2.getLft() < n2.getRgt()); assertEquals(0, n2.getDescendantsCount()); assertEquals(shelf.getNote("").getId(), n2.getParentId()); } @Test public void testPasteFolded() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "* Note 2\n"); shelf.toggleFoldedState(shelf.getNote("Note 1").getId()); shelf.cut(book.getId(), shelf.getNote("Note 1").getId()); Note n = shelf.getNote("Note 2"); shelf.paste(n.getPosition().getBookId(), n.getId(), Place.ABOVE); /* Remains folded. */ assertTrue(shelf.getNote("Note 1").getPosition().isFolded()); assertNotSame(0, shelf.getNote("Note 1.1").getPosition().getFoldedUnderId()); } @Test public void testPasteUnderHidden() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "* Note 2\n"); shelf.toggleFoldedState(shelf.getNote("Note 1").getId()); shelf.cut(book.getId(), shelf.getNote("Note 2").getId()); Note n = shelf.getNote("Note 1.1"); shelf.paste(n.getPosition().getBookId(), n.getId(), Place.UNDER); assertEquals("description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "*** Note 2\n", shelf.getBookContent("notebook", BookName.Format.ORG)); assertTrue(shelf.getNote("Note 1").getPosition().isFolded()); assertEquals(shelf.getNote("Note 1").getId(), shelf.getNote("Note 1.1").getPosition().getFoldedUnderId()); assertEquals(shelf.getNote("Note 1").getId(), shelf.getNote("Note 2").getPosition().getFoldedUnderId()); } @Test public void testDemoteNoChanges() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "*** Note 1.1.1\n" + "* Note 2\n" + "** Note 2.1\n" + "*** Note 2.1.1\n"); /* Demote 2.1. */ assertEquals(0, shelf.demoteNotes(book.getId(), shelf.getNote("Note 2.1").getId())); assertEquals("description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "*** Note 1.1.1\n" + "* Note 2\n" + "** Note 2.1\n" + "*** Note 2.1.1\n", shelf.getBookContent("notebook", BookName.Format.ORG)); } @Test public void testNewNoteUnder() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "description\n" + "* Note 1\n" + "** Note 1.1\n" + "*** Note 1.1.1\n" + "** Note 1.2\n"); NotePosition note1, note11, note111, note12, note112; note1 = shelf.getNote("Note 1").getPosition(); note11 = shelf.getNote("Note 1.1").getPosition(); note111 = shelf.getNote("Note 1.1.1").getPosition(); note12 = shelf.getNote("Note 1.2").getPosition(); assertTrue(note1.getLft() < note11.getLft()); assertTrue(note11.getLft() < note111.getLft()); assertTrue(note111.getLft() < note111.getRgt()); assertTrue(note111.getRgt() < note11.getRgt()); assertTrue(note11.getRgt() < note12.getLft()); assertTrue(note12.getLft() < note12.getRgt()); assertTrue(note12.getRgt() < note1.getRgt()); assertEquals(3, note1.getDescendantsCount()); assertEquals(1, note11.getDescendantsCount()); assertEquals(0, note111.getDescendantsCount()); assertEquals(0, note12.getDescendantsCount()); /* Create new note under Note 1.1. */ Note n = new Note(); n.getPosition().setBookId(book.getId()); n.getHead().setTitle("Note 1.1.2"); NotePlace target = new NotePlace(book.getId(), shelf.getNote("Note 1.1").getId(), Place.UNDER); shelf.createNote(n, target); note1 = shelf.getNote("Note 1").getPosition(); note11 = shelf.getNote("Note 1.1").getPosition(); note111 = shelf.getNote("Note 1.1.1").getPosition(); note112 = shelf.getNote("Note 1.1.2").getPosition(); note12 = shelf.getNote("Note 1.2").getPosition(); assertTrue(note1.getLft() < note11.getLft()); assertTrue(note11.getLft() < note111.getLft()); assertTrue(note111.getLft() < note111.getRgt()); assertTrue(note111.getRgt() < note112.getLft()); assertTrue(note112.getLft() < note112.getRgt()); assertTrue(note112.getRgt() < note11.getRgt()); assertTrue(note11.getRgt() < note12.getLft()); assertTrue(note12.getLft() < note12.getRgt()); assertTrue(note12.getRgt() < note1.getRgt()); assertEquals(4, note1.getDescendantsCount()); assertEquals(2, note11.getDescendantsCount()); assertEquals(0, note111.getDescendantsCount()); assertEquals(0, note112.getDescendantsCount()); assertEquals(0, note12.getDescendantsCount()); } @Test public void testNewNoteAbove() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "description\n" + "* Note 1\n" + // ** Note 1.0 "** Note 1.1\n" + "*** Note 1.1.1\n" + "** Note 1.2\n"); NotePosition note1, note11, note111, note12, note10; /* Create new note above Note 1.1. */ Note n = new Note(); n.getPosition().setBookId(book.getId()); n.getHead().setTitle("Note 1.0"); NotePlace target = new NotePlace(book.getId(), shelf.getNote("Note 1.1").getId(), Place.ABOVE); shelf.createNote(n, target); note1 = shelf.getNote("Note 1").getPosition(); note10 = shelf.getNote("Note 1.0").getPosition(); note11 = shelf.getNote("Note 1.1").getPosition(); note111 = shelf.getNote("Note 1.1.1").getPosition(); note12 = shelf.getNote("Note 1.2").getPosition(); assertTrue(note1.getLft() < note10.getLft()); assertTrue(note10.getLft() < note10.getRgt()); assertTrue(note10.getRgt() < note11.getLft()); assertTrue(note11.getLft() < note111.getLft()); assertTrue(note111.getLft() < note111.getRgt()); assertTrue(note111.getRgt() < note11.getRgt()); assertTrue(note11.getRgt() < note12.getLft()); assertTrue(note12.getLft() < note12.getRgt()); assertTrue(note12.getRgt() < note1.getRgt()); } @Test public void testCyclingFreshlyImportedNotebook() { Book book = shelfTestUtils.setupBook("booky", "Notebook\n" + "* Note 1\n" + "** Note 2\n" + "*** Note 3\n" + "** Note 4\n" + "* Note 5"); /* Fold all. */ shelf.cycleVisibility(book); assertTrue(shelf.getNote("Note 1").getPosition().isFolded()); assertTrue(shelf.getNote("Note 2").getPosition().isFolded()); assertTrue(shelf.getNote("Note 3").getPosition().isFolded()); assertTrue(shelf.getNote("Note 4").getPosition().isFolded()); assertTrue(shelf.getNote("Note 5").getPosition().isFolded()); /* Unfold all. */ shelf.cycleVisibility(book); assertFalse(shelf.getNote("Note 1").getPosition().isFolded()); assertFalse(shelf.getNote("Note 2").getPosition().isFolded()); assertFalse(shelf.getNote("Note 3").getPosition().isFolded()); assertFalse(shelf.getNote("Note 4").getPosition().isFolded()); assertFalse(shelf.getNote("Note 5").getPosition().isFolded()); } @Test public void testCyclingFoldedState() { Book book = shelfTestUtils.setupBook("booky", "" + "Notebook\n" + "* Note 1\n" + "** Note 2\n" + "*** Note 3\n" + "** Note 4\n" + "* Note 5\n" + "** Note 6"); /* Fold all. */ shelf.cycleVisibility(book); /* Unfold Note 1. */ shelf.toggleFoldedState(shelf.getNote("Note 1").getId()); assertEquals(0, shelf.getNote("Note 2").getPosition().getFoldedUnderId()); assertEquals(0, shelf.getNote("Note 4").getPosition().getFoldedUnderId()); /* Fold all. */ shelf.cycleVisibility(book); /* Unfold all. */ shelf.cycleVisibility(book); /* Fold Note 1. */ shelf.toggleFoldedState(shelf.getNote("Note 1").getId()); /* Fold all. */ shelf.cycleVisibility(book); /* Unfold Note 1. */ shelf.toggleFoldedState(shelf.getNote("Note 1").getId()); assertFalse(shelf.getNote("Note 1").getPosition().isFolded()); assertTrue(shelf.getNote("Note 2").getPosition().isFolded()); } @Test public void testCutChildCutParentThenPaste() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "\n" + "* Note 1\n" + "** Note 1.1\n" + "* Note 2\n"); shelf.cut(book.getId(), shelf.getNote("Note 1.1").getId()); shelf.cut(book.getId(), shelf.getNote("Note 1").getId()); Note n = shelf.getNote("Note 2"); shelf.paste(n.getPosition().getBookId(), n.getId(), Place.UNDER); assertEquals("description\n" + "\n" + "* Note 2\n" + "** Note 1\n", shelf.getBookContent("notebook", BookName.Format.ORG)); } @Test public void testParentIds() throws IOException { shelfTestUtils.setupBook("notebook", "description\n" + "* Note 1\n" + "** Note 1.1\n" + "*** Note 1.1.1\n" + "** Note 1.2\n"); assertEquals(0, shelf.getNote("").getPosition().getParentId()); assertEquals(shelf.getNote("").getId(), shelf.getNote("Note 1").getPosition().getParentId()); assertEquals(shelf.getNote("Note 1").getId(), shelf.getNote("Note 1.1").getPosition().getParentId()); assertEquals(shelf.getNote("Note 1.1").getId(), shelf.getNote("Note 1.1.1").getPosition().getParentId()); assertEquals(shelf.getNote("Note 1").getId(), shelf.getNote("Note 1.2").getPosition().getParentId()); } @Test public void testParentIdForCreatedNote() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "\n" + "* Note 1\n"); Note newNote = new Note(); newNote.getPosition().setBookId(book.getId()); newNote.getHead().setTitle("Note 1.1"); shelf.createNote( newNote, new NotePlace(book.getId(), shelf.getNote("Note 1").getId(), Place.UNDER) ); assertEquals(1, shelf.getNote("Note 1").getPosition().getDescendantsCount()); assertEquals(shelf.getNote("Note 1").getId(), shelf.getNote("Note 1.1").getPosition().getParentId()); } @Test public void testFoldingAllWhenContentOnlyIsFolded() { Book book = shelfTestUtils.setupBook("notebook", "" + "description\n" + "* Note 1\n" + "** Note 2\n" + "* Note 3\n" + "Content"); /* Fold all. */ shelf.cycleVisibility(book); /* Unfold Note 3's content. */ shelf.toggleFoldedState(shelf.getNote("Note 3").getId()); /* Fold all. */ shelf.cycleVisibility(book); assertTrue(shelf.getNote("Note 1").getPosition().isFolded()); assertTrue(shelf.getNote("Note 2").getPosition().isFolded()); assertTrue(shelf.getNote("Note 3").getPosition().isFolded()); } @Test public void testInheritedTagsAfterCutAndPaste() { Book book = shelfTestUtils.setupBook("notebook", "* A :a:\n" + "** B :b:\n" + "*** C :c:\n" + "* D :d:\n"); shelf.cut(book.getId(), shelf.getNote("B").getId()); shelf.paste(book.getId(), shelf.getNote("D").getId(), Place.UNDER); assertEquals(1, shelf.getNote("B").getInheritedTags().size()); assertEquals(2, shelf.getNote("C").getInheritedTags().size()); } /* Make sure root node's rgt is larger then notes'. */ @Test public void testCutAndPaste() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "* Note 1\n* Note 2"); shelf.cut(book.getId(), shelf.getNote("Note 1").getId()); shelf.paste(book.getId(), shelf.getNote("Note 2").getId(), Place.BELOW); // Note with ID 3 is root note assertTrue(shelf.getNote(3).getPosition().getRgt() > shelf.getNote("Note 1").getPosition().getRgt()); assertTrue(shelf.getNote(3).getPosition().getRgt() > shelf.getNote("Note 2").getPosition().getRgt()); } /* After moving one note under another, test lft and rgt od third newly created note. */ @Test public void testNewNoteAfterMovingUnder() throws IOException { Book book = shelfTestUtils.setupBook("notebook", "* Note 1\n* Note 2"); shelf.cut(book.getId(), shelf.getNote("Note 1").getId()); shelf.paste(book.getId(), shelf.getNote("Note 2").getId(), Place.UNDER); Note newNote = new Note(); newNote.getPosition().setBookId(book.getId()); newNote.getHead().setTitle("Note 3"); shelf.createNote(newNote, null); assertTrue(shelf.getNote("Note 2").getPosition().getRgt() < shelf.getNote("Note 3").getPosition().getLft()); } }