package com.orgzly.android.misc; import com.orgzly.android.SearchQuery; import com.orgzly.android.util.QuotedStringTokenizer; import com.orgzly.org.datetime.OrgInterval; import org.junit.Test; import static junit.framework.Assert.*; public class SearchQueryTest { @Test public void test1() { SearchQuery query = new SearchQuery("search string"); assertEquals(2, query.getTextSearch().size()); assertTrue(query.getTextSearch().contains("search")); assertTrue(query.getTextSearch().contains("string")); } @Test public void test2() { SearchQuery query = new SearchQuery("b.name"); assertEquals("name", query.getBookName()); } @Test public void test4() { SearchQuery query = new SearchQuery("s.today any b.name1 t.tag .tag2. i.todo tn.notetag string b.\"name 2\""); assertEquals("b.\"name 2\" i.todo tn.notetag t.tag s.today any .tag2. string", query.toString()); /* Free text. */ assertTrue(query.hasTextSearch()); assertEquals(3, query.getTextSearch().size()); assertTrue(query.getTextSearch().contains("any")); assertTrue(query.getTextSearch().contains("string")); assertTrue(query.getTextSearch().contains(".tag2.")); /* Book. */ assertEquals("name 2", query.getBookName()); /* State. */ assertEquals("TODO", query.getState()); /* Note tags. */ assertEquals(1, query.getNoteTags().size()); assertTrue(query.getNoteTags().contains("notetag")); /* Tags. */ assertEquals(1, query.getTags().size()); assertTrue(query.getTags().contains("tag")); /* Scheduled time. */ assertTrue(query.hasScheduled()); assertEquals(0, query.getScheduled().getValue()); assertEquals(OrgInterval.Unit.DAY, query.getScheduled().getUnit()); } @Test public void test5() { SearchQuery query = new SearchQuery("s.2w b.n1 t.tag .tag2. i.todo b.n2"); assertEquals("b.n2 i.todo t.tag s.2w .tag2.", query.toString()); /* Free text. */ assertTrue(query.hasTextSearch()); assertEquals(1, query.getTextSearch().size()); assertTrue(query.getTextSearch().contains(".tag2.")); /* Book. */ assertEquals("n2", query.getBookName()); /* State. */ assertEquals("TODO", query.getState()); /* Tags. */ assertEquals(1, query.getTags().size()); assertTrue(query.getTags().contains("tag")); /* Scheduled time. */ assertTrue(query.hasScheduled()); assertEquals(2, query.getScheduled().getValue()); assertEquals(OrgInterval.Unit.WEEK, query.getScheduled().getUnit()); } @Test public void testBookName1() { SearchQuery query = new SearchQuery("b.\"Org Manual\""); assertEquals("b.\"Org Manual\"", query.toString()); /* Free text. */ assertFalse(query.hasTextSearch()); /* Book. */ assertEquals("Org Manual", query.getBookName()); } @Test public void testBookName2() { SearchQuery query = new SearchQuery(); query.setBookName("Book \"Quote\" Book"); // Book "Quote" Book assertEquals("b.\"Book \\\"Quote\\\" Book\"", query.toString()); // b."Book \"Quote\" Book" /* Free text. */ assertFalse(query.hasTextSearch()); /* Book. */ assertEquals("Book \"Quote\" Book", query.getBookName()); } @Test public void testBookName3() { SearchQuery query = new SearchQuery(); query.setBookName("Book \\\"Quote\" Book"); // Book \"Quote" Book assertEquals("b.\"Book \\\\\\\"Quote\\\" Book\"", query.toString()); // b."Book \\\"Quote\" Book" /* Free text. */ assertFalse(query.hasTextSearch()); /* Book. */ assertEquals("Book \\\"Quote\" Book", query.getBookName()); } @Test public void testBookName4() { SearchQuery query = new SearchQuery(); query.setBookName("Book Book"); assertEquals("b.\"Book Book\"", query.toString()); /* Free text. */ assertFalse(query.hasTextSearch()); /* Book. */ assertEquals("Book Book", query.getBookName()); } @Test public void testBookName5() { SearchQuery query = new SearchQuery(); query.setBookName("Book\"Book"); // Book"Book assertEquals("b.\"Book\\\"Book\"", query.toString()); // b."Book\"Book" /* Free text. */ assertFalse(query.hasTextSearch()); /* Book. */ assertEquals("Book\"Book", query.getBookName()); } @Test public void testNotBookName() { SearchQuery query = new SearchQuery("t.tag1 .b.\"Book Name\" t.tag2 .b.bookname"); assertTrue(query.hasNotBookName()); assertEquals(2, query.getNotBookName().size()); assertTrue(query.getNotBookName().contains("bookname")); assertTrue(query.getNotBookName().contains("Book Name")); assertEquals(".b.\"Book Name\" .b.bookname t.tag1 t.tag2", query.toString()); } @Test public void testTokenizer() { assertTokens("i.done b.Word .t.tag", new String[] { "i.done", "b.Word", ".t.tag" }); assertTokens("i.done b.\"Some Words\" .t.tag", new String[] { "i.done", "b.\"Some Words\"", ".t.tag" }); assertTokens("i.done b.\"Some Words\" .t.tag", new String[] { "i.done", "b.\"Some Words\"", ".t.tag" }); assertTokens("i.done b.\"Some \\\"Quoted\\\" Words\" .t.tag", new String[] { "i.done", "b.\"Some \\\"Quoted\\\" Words\"", ".t.tag" }); assertTokens("i.done b.\\Some\\Quoted\\Words t.\"tag\"", new String[] { "i.done", "b.\\Some\\Quoted\\Words", "t.\"tag\"" }); assertTokens("( i.done OR b.\"Some \\\"Quoted\\\" Words\" ) AND .t.tag", new String[] { "(", "i.done", "OR", "b.\"Some \\\"Quoted\\\" Words\"", ")", "AND", ".t.tag" }); } private void assertTokens(String str, String[] expectedTokens) { QuotedStringTokenizer tokenizer = new QuotedStringTokenizer(str, " ", false, true); int i = 0; while (tokenizer.hasMoreTokens()) { assertEquals(expectedTokens[i++], tokenizer.nextToken()); } assertEquals(expectedTokens.length, i); } @Test public void testEmptyQueryString() { SearchQuery query = new SearchQuery(""); assertEquals("", query.toString()); assertFalse(query.hasTextSearch()); assertFalse(query.hasBookName()); assertFalse(query.hasTags()); assertFalse(query.hasNotState()); assertFalse(query.hasState()); assertFalse(query.hasScheduled()); } @Test public void testPriority() { SearchQuery query = new SearchQuery("p.A"); assertEquals("a", query.getPriority()); } @Test public void testScheduledTomorrow() { SearchQuery query = new SearchQuery("s.tom"); assertEquals("s.tomorrow", query.toString()); assertTrue(query.hasScheduled()); assertEquals(1, query.getScheduled().getValue()); assertEquals(OrgInterval.Unit.DAY, query.getScheduled().getUnit()); } @Test public void testScheduledDays() { SearchQuery query = new SearchQuery("s.5d"); assertEquals("s.5d", query.toString()); assertTrue(query.hasScheduled()); assertEquals(5, query.getScheduled().getValue()); assertEquals(OrgInterval.Unit.DAY, query.getScheduled().getUnit()); } @Test public void testDeadline() { SearchQuery query = new SearchQuery("s.1w d.2d"); assertEquals("s.1w d.2d", query.toString()); assertTrue(query.hasDeadline()); assertEquals(2, query.getDeadline().getValue()); assertEquals(OrgInterval.Unit.DAY, query.getDeadline().getUnit()); } @Test public void testScheduledNone() { SearchQuery query = new SearchQuery("s.none"); assertEquals("s.none", query.toString()); assertTrue(query.hasScheduled()); assertTrue(query.getScheduled().none()); } @Test public void testScheduledInvalid() { SearchQuery query = new SearchQuery("s.5z"); assertEquals("", query.toString()); assertFalse(query.hasScheduled()); } @Test public void testMultipleNotState() { SearchQuery query = new SearchQuery(".i.done .i.cancel i.today"); assertEquals("i.today .i.cancel .i.done", query.toString()); } @Test public void testSortOrderScheduled() { SearchQuery query = new SearchQuery("note o.scheduled"); assertEquals(1, query.getSortOrder().size()); SearchQuery.SortOrder sortOrder = query.getSortOrder().get(0); assertEquals(SearchQuery.SortOrder.Type.SCHEDULED, sortOrder.getType()); assertTrue(sortOrder.isAscending()); assertEquals("note o.scheduled", query.toString()); } @Test public void testSortOrderScheduledDesc() { SearchQuery query = new SearchQuery("note .o.scheduled"); assertEquals(1, query.getSortOrder().size()); SearchQuery.SortOrder sortOrder = query.getSortOrder().get(0); assertEquals(SearchQuery.SortOrder.Type.SCHEDULED, sortOrder.getType()); assertTrue(sortOrder.isDescending()); assertEquals("note .o.scheduled", query.toString()); } @Test public void testDotAsBookName() { assertNotNull(new SearchQuery("b..")); } @Test public void testSingleQuoteInBookName() { assertEquals("Book'Name", new SearchQuery("b.Book'Name").getBookName()); } }