Loading app/src/androidTest/java/it/niedermann/owncloud/notes/persistence/NotesDatabaseTest.java +37 −8 Original line number Original line Diff line number Diff line Loading @@ -156,6 +156,7 @@ public class NotesDatabaseTest { } } assertTrue(exitFlag); assertTrue(exitFlag); // TODO: The second parameter is annotated as @NonNull. This test is invalid. Please remove it categories = db.searchCategories(account.getId(), null); categories = db.searchCategories(account.getId(), null); exitFlag = false; exitFlag = false; for (NavigationAdapter.NavigationItem categoryItem : categories) { for (NavigationAdapter.NavigationItem categoryItem : categories) { Loading Loading @@ -531,9 +532,18 @@ public class NotesDatabaseTest { @Test @Test public void test_14_getCategoryIdsByTitle() { public void test_14_getCategoryIdsByTitle() { try { try { // long noteID = db.addNote(account.getId(), new CloudNote(1, Calendar.getInstance(), long noteID = db.addNote(account.getId(), new CloudNote(1, Calendar.getInstance(), // "woc", getCurDate() + " woc nmd testing", "hello1", getCurDate() + " Mike you look so cool.", // true, "aha", null)); true, "Diary", null)); long noteID2 = db.addNote(account.getId(), new CloudNote(1, Calendar.getInstance(), "hello2", getCurDate() + " I'm so cool.", true, "Mike's Diary", null)); long noteID3 = db.addNote(account.getId(), new CloudNote(1, Calendar.getInstance(), "hello3", getCurDate() + " Why Mike so cool.", true, "Andy's Diary", null)); long noteID4 = db.addNote(account.getId(), new CloudNote(1, Calendar.getInstance(), "hello4", getCurDate() + " no person cooler than Mike.", true, "Peter's Diary", null)); Method method_ids_by_title = NotesDatabase.class.getDeclaredMethod("getCategoryIdsByTitle", long.class, String.class); Method method_ids_by_title = NotesDatabase.class.getDeclaredMethod("getCategoryIdsByTitle", long.class, String.class); method_ids_by_title.setAccessible(true); method_ids_by_title.setAccessible(true); Loading @@ -544,29 +554,48 @@ public class NotesDatabaseTest { List<NavigationAdapter.NavigationItem> categories = db.getCategories(account.getId()); List<NavigationAdapter.NavigationItem> categories = db.getCategories(account.getId()); Log.i("Test_14_getCategoryIdsByTitle", "size: " + categories.size()); Log.i("Test_14_getCategoryIdsByTitle", "size: " + categories.size()); // Log.i("Test_14_getCategoryIdsByTitle", "item: "+ categories.get(0).label); // Log.i("Test_14_getCategoryIdsByTitle", "item: "+ categories.get(0).label); String pattern = "Dia"; String pattern = "'s Dia"; List<Integer> matchList = new ArrayList<>(); List<Integer> matchList = new ArrayList<>(); for (NavigationAdapter.NavigationItem categoryItem : categories) { for (NavigationAdapter.NavigationItem categoryItem : categories) { String catTitle = categoryItem.label; String catTitle = categoryItem.label; if (pattern.length() > catTitle.length()) { continue; } Log.i("Test_14_getCategoryIdsByTitle", catTitle); Log.i("Test_14_getCategoryIdsByTitle", catTitle); if (catTitle.contains(pattern)) { boolean contain = true; for (int i = 0; i < pattern.length(); i++) { if (pattern.charAt(i) != catTitle.charAt(i)) { contain = false; } } if (contain) { Log.e("###", catTitle); // She will be matched, store ID // She will be matched, store ID int catId = (int) method_id_by_title.invoke(db, account.getId(), catTitle, false); int catId = (int) method_id_by_title.invoke(db, account.getId(), catTitle, false); matchList.add(catId); matchList.add(catId); } } // if (catTitle.contains(pattern)) { // // She will be matched, store ID // int catId = (int) method_id_by_title.invoke(db, account.getId(), catTitle, false); // matchList.add(catId); // } } } // Now use our testing method // Now use our testing method List<Integer> testList = (List<Integer>) method_ids_by_title.invoke(db, account.getId(), pattern); List<Integer> testList = (List<Integer>) method_ids_by_title.invoke(db, account.getId(), pattern); Log.e("###", testList.size() + ""); // Compare (Sort to make sure the generated strings are equal to each other) // Compare (Sort to make sure the generated strings are equal to each other) Collections.sort(matchList); Collections.sort(matchList); Collections.sort(testList); Collections.sort(testList); Log.i("Test_14_getCategoryIdsByTitle", matchList.toString()); Log.i("Test_14_getCategoryIdsByTitle", matchList.toString()); Log.i("Test_14_getCategoryIdsByTitle", testList.toString()); Log.i("Test_14_getCategoryIdsByTitle", testList.toString()); assertEquals(matchList.toString(), testList.toString()); // db.deleteNote(noteID, DBStatus.VOID); db.deleteNote(noteID, DBStatus.VOID); db.deleteNote(noteID2, DBStatus.VOID); db.deleteNote(noteID3, DBStatus.VOID); db.deleteNote(noteID4, DBStatus.VOID); assertEquals(matchList.toString(), testList.toString()); } catch (Exception e) { } catch (Exception e) { fail(Arrays.toString(e.getStackTrace())); fail(Arrays.toString(e.getStackTrace())); Log.e("Test_14_getCategoryIdsByTitle", Arrays.toString(e.getStackTrace())); Log.e("Test_14_getCategoryIdsByTitle", Arrays.toString(e.getStackTrace())); Loading app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java +3 −9 Original line number Original line Diff line number Diff line Loading @@ -379,6 +379,7 @@ public class NotesDatabase extends AbstractNotesDatabase { // TODO: test // TODO: test @NonNull @NonNull @WorkerThread @WorkerThread // the categories without note will not be returned public List<NavigationAdapter.NavigationItem> getCategories(long accountId) { public List<NavigationAdapter.NavigationItem> getCategories(long accountId) { validateAccountId(accountId); validateAccountId(accountId); String category_title = String.format("%s.%s", table_category, key_title); String category_title = String.format("%s.%s", table_category, key_title); Loading @@ -386,17 +387,9 @@ public class NotesDatabase extends AbstractNotesDatabase { String category_id = String.format("%s.%s", table_category, key_id); String category_id = String.format("%s.%s", table_category, key_id); String category_accountId = String.format("%s.%s", table_category, key_account_id); String category_accountId = String.format("%s.%s", table_category, key_account_id); String note_status = String.format("%s.%s", table_notes, key_status); String note_status = String.format("%s.%s", table_notes, key_status); // Weird problem: If I use ? instead of concat directly, there is no result in the join table // TODO: Find a way to use ? instead of concat. // TODO: a bug here // when no notes and have cat, inner join will not return this cat String rawQuery = "SELECT " + category_title + ", COUNT(*) FROM " + table_category + String rawQuery = "SELECT " + category_title + ", COUNT(*) FROM " + table_category + " INNER JOIN " + table_notes + " ON " + category_id + " = " + note_title + " INNER JOIN " + table_notes + " ON " + category_id + " = " + note_title + " WHERE " + category_accountId + " = ? AND " + note_status + " != ? GROUP BY " + category_id; " WHERE " + category_accountId + " = ? AND " + note_status + " != ? GROUP BY " + category_id; // String rawQuery = "SELECT " + category_title + ", COUNT(*) FROM " + table_category + " INNER JOIN " + table_notes + // " ON " + category_id + " = " + note_title + " WHERE " + category_accountId + " = " + accountId + // " GROUP BY " + category_id; Cursor cursor = getReadableDatabase().rawQuery(rawQuery, new String[]{String.valueOf(accountId), DBStatus.LOCAL_DELETED.getTitle()}); Cursor cursor = getReadableDatabase().rawQuery(rawQuery, new String[]{String.valueOf(accountId), DBStatus.LOCAL_DELETED.getTitle()}); List<NavigationAdapter.NavigationItem> categories = new ArrayList<>(cursor.getCount()); List<NavigationAdapter.NavigationItem> categories = new ArrayList<>(cursor.getCount()); while (cursor.moveToNext()) { while (cursor.moveToNext()) { Loading Loading @@ -918,13 +911,14 @@ public class NotesDatabase extends AbstractNotesDatabase { } } // TODO: test // TODO: test // TODO: not fuzzy search by testing bug? private List<Integer> getCategoryIdsByTitle(long accountId, @NonNull String title) { private List<Integer> getCategoryIdsByTitle(long accountId, @NonNull String title) { validateAccountId(accountId); validateAccountId(accountId); Cursor cursor = getReadableDatabase().query( Cursor cursor = getReadableDatabase().query( table_category, table_category, new String[]{key_id}, new String[]{key_id}, key_title + " = ? OR " + key_title + " LIKE ? AND " + key_account_id + " = ? ", key_title + " = ? OR " + key_title + " LIKE ? AND " + key_account_id + " = ? ", new String[]{title, title + "/%", String.valueOf(accountId)}, new String[]{title, title + "%", String.valueOf(accountId)}, key_id, key_id, null, null, key_id key_id Loading app/src/test/java/it/niedermann/owncloud/notes/android/fragment/SearchableBaseNoteFragmentTest.java +59 −3 Original line number Original line Diff line number Diff line package it.niedermann.owncloud.notes.android.fragment; package it.niedermann.owncloud.notes.android.fragment; import it.niedermann.owncloud.notes.android.fragment.SearchableBaseNoteFragment; import android.util.Log; import android.util.Log; import org.junit.Test; import org.junit.Test; import java.lang.reflect.Method; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Arrays; import java.util.Random; import static org.junit.Assert.*; import static org.junit.Assert.*; public class SearchableBaseNoteFragmentTest { public class SearchableBaseNoteFragmentTest { @Test public void testCountOccurrencesFixed() { try { Method method = SearchableBaseNoteFragment.class.getDeclaredMethod("countOccurrences", String.class, String.class); method.setAccessible(true); for (int count = 0; count <= 15; ++count) { StringBuilder sb = new StringBuilder("Mike Chester Wang"); Random rand = new Random(); for (int i = 0; i < count; ++i) { sb.append(sb); } long startTime = System.currentTimeMillis(); int num = (int) method.invoke(null, sb.toString(), "Chester"); long endTime = System.currentTimeMillis(); System.out.println("Fixed Version"); System.out.println("Total Time: " + (endTime - startTime) + " ms"); System.out.println("Total Times: " + num); System.out.println("String Size: " + (sb.length() / 1024) + " K"); assertEquals((int) Math.pow(2, count), num); System.out.println(); if (endTime - startTime > 10) { fail("The algorithm spends too much time."); } } } catch (Exception e) { fail(Arrays.toString(e.getStackTrace())); Log.e("Test_12_getCategoryIdByTitle", Arrays.toString(e.getStackTrace())); } } @Test @Test public void testCountOccurrences() { public void testCountOccurrencesRandom() { try { try { Method method = SearchableBaseNoteFragment.class.getDeclaredMethod("countOccurrences", String.class, String.class); Method method = SearchableBaseNoteFragment.class.getDeclaredMethod("countOccurrences", String.class, String.class); method.setAccessible(true); method.setAccessible(true); for (int count = 10; count <= 15; ++count) { StringBuilder sb = new StringBuilder("Mike Chester Wang"); Random rand = new Random(); for (int i = 0; i < count * 100; ++i) { sb.append(rand.nextDouble()); if (i % 100 == 0) { sb.append("flag"); } } long startTime = System.currentTimeMillis(); int num = (int) method.invoke(null, sb.toString(), String.valueOf(rand.nextInt(100))); long endTime = System.currentTimeMillis(); System.out.println("Random Version"); System.out.println("Total Time: " + (endTime - startTime) + " ms"); System.out.println("Total Times: " + num); System.out.println("String Size: " + (sb.length() / 1024) + " K"); System.out.println(); if (endTime - startTime > 10) { fail("The algorithm spends too much time."); } } } catch (Exception e) { } catch (Exception e) { fail(Arrays.toString(e.getStackTrace())); fail(Arrays.toString(e.getStackTrace())); Loading Loading
app/src/androidTest/java/it/niedermann/owncloud/notes/persistence/NotesDatabaseTest.java +37 −8 Original line number Original line Diff line number Diff line Loading @@ -156,6 +156,7 @@ public class NotesDatabaseTest { } } assertTrue(exitFlag); assertTrue(exitFlag); // TODO: The second parameter is annotated as @NonNull. This test is invalid. Please remove it categories = db.searchCategories(account.getId(), null); categories = db.searchCategories(account.getId(), null); exitFlag = false; exitFlag = false; for (NavigationAdapter.NavigationItem categoryItem : categories) { for (NavigationAdapter.NavigationItem categoryItem : categories) { Loading Loading @@ -531,9 +532,18 @@ public class NotesDatabaseTest { @Test @Test public void test_14_getCategoryIdsByTitle() { public void test_14_getCategoryIdsByTitle() { try { try { // long noteID = db.addNote(account.getId(), new CloudNote(1, Calendar.getInstance(), long noteID = db.addNote(account.getId(), new CloudNote(1, Calendar.getInstance(), // "woc", getCurDate() + " woc nmd testing", "hello1", getCurDate() + " Mike you look so cool.", // true, "aha", null)); true, "Diary", null)); long noteID2 = db.addNote(account.getId(), new CloudNote(1, Calendar.getInstance(), "hello2", getCurDate() + " I'm so cool.", true, "Mike's Diary", null)); long noteID3 = db.addNote(account.getId(), new CloudNote(1, Calendar.getInstance(), "hello3", getCurDate() + " Why Mike so cool.", true, "Andy's Diary", null)); long noteID4 = db.addNote(account.getId(), new CloudNote(1, Calendar.getInstance(), "hello4", getCurDate() + " no person cooler than Mike.", true, "Peter's Diary", null)); Method method_ids_by_title = NotesDatabase.class.getDeclaredMethod("getCategoryIdsByTitle", long.class, String.class); Method method_ids_by_title = NotesDatabase.class.getDeclaredMethod("getCategoryIdsByTitle", long.class, String.class); method_ids_by_title.setAccessible(true); method_ids_by_title.setAccessible(true); Loading @@ -544,29 +554,48 @@ public class NotesDatabaseTest { List<NavigationAdapter.NavigationItem> categories = db.getCategories(account.getId()); List<NavigationAdapter.NavigationItem> categories = db.getCategories(account.getId()); Log.i("Test_14_getCategoryIdsByTitle", "size: " + categories.size()); Log.i("Test_14_getCategoryIdsByTitle", "size: " + categories.size()); // Log.i("Test_14_getCategoryIdsByTitle", "item: "+ categories.get(0).label); // Log.i("Test_14_getCategoryIdsByTitle", "item: "+ categories.get(0).label); String pattern = "Dia"; String pattern = "'s Dia"; List<Integer> matchList = new ArrayList<>(); List<Integer> matchList = new ArrayList<>(); for (NavigationAdapter.NavigationItem categoryItem : categories) { for (NavigationAdapter.NavigationItem categoryItem : categories) { String catTitle = categoryItem.label; String catTitle = categoryItem.label; if (pattern.length() > catTitle.length()) { continue; } Log.i("Test_14_getCategoryIdsByTitle", catTitle); Log.i("Test_14_getCategoryIdsByTitle", catTitle); if (catTitle.contains(pattern)) { boolean contain = true; for (int i = 0; i < pattern.length(); i++) { if (pattern.charAt(i) != catTitle.charAt(i)) { contain = false; } } if (contain) { Log.e("###", catTitle); // She will be matched, store ID // She will be matched, store ID int catId = (int) method_id_by_title.invoke(db, account.getId(), catTitle, false); int catId = (int) method_id_by_title.invoke(db, account.getId(), catTitle, false); matchList.add(catId); matchList.add(catId); } } // if (catTitle.contains(pattern)) { // // She will be matched, store ID // int catId = (int) method_id_by_title.invoke(db, account.getId(), catTitle, false); // matchList.add(catId); // } } } // Now use our testing method // Now use our testing method List<Integer> testList = (List<Integer>) method_ids_by_title.invoke(db, account.getId(), pattern); List<Integer> testList = (List<Integer>) method_ids_by_title.invoke(db, account.getId(), pattern); Log.e("###", testList.size() + ""); // Compare (Sort to make sure the generated strings are equal to each other) // Compare (Sort to make sure the generated strings are equal to each other) Collections.sort(matchList); Collections.sort(matchList); Collections.sort(testList); Collections.sort(testList); Log.i("Test_14_getCategoryIdsByTitle", matchList.toString()); Log.i("Test_14_getCategoryIdsByTitle", matchList.toString()); Log.i("Test_14_getCategoryIdsByTitle", testList.toString()); Log.i("Test_14_getCategoryIdsByTitle", testList.toString()); assertEquals(matchList.toString(), testList.toString()); // db.deleteNote(noteID, DBStatus.VOID); db.deleteNote(noteID, DBStatus.VOID); db.deleteNote(noteID2, DBStatus.VOID); db.deleteNote(noteID3, DBStatus.VOID); db.deleteNote(noteID4, DBStatus.VOID); assertEquals(matchList.toString(), testList.toString()); } catch (Exception e) { } catch (Exception e) { fail(Arrays.toString(e.getStackTrace())); fail(Arrays.toString(e.getStackTrace())); Log.e("Test_14_getCategoryIdsByTitle", Arrays.toString(e.getStackTrace())); Log.e("Test_14_getCategoryIdsByTitle", Arrays.toString(e.getStackTrace())); Loading
app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java +3 −9 Original line number Original line Diff line number Diff line Loading @@ -379,6 +379,7 @@ public class NotesDatabase extends AbstractNotesDatabase { // TODO: test // TODO: test @NonNull @NonNull @WorkerThread @WorkerThread // the categories without note will not be returned public List<NavigationAdapter.NavigationItem> getCategories(long accountId) { public List<NavigationAdapter.NavigationItem> getCategories(long accountId) { validateAccountId(accountId); validateAccountId(accountId); String category_title = String.format("%s.%s", table_category, key_title); String category_title = String.format("%s.%s", table_category, key_title); Loading @@ -386,17 +387,9 @@ public class NotesDatabase extends AbstractNotesDatabase { String category_id = String.format("%s.%s", table_category, key_id); String category_id = String.format("%s.%s", table_category, key_id); String category_accountId = String.format("%s.%s", table_category, key_account_id); String category_accountId = String.format("%s.%s", table_category, key_account_id); String note_status = String.format("%s.%s", table_notes, key_status); String note_status = String.format("%s.%s", table_notes, key_status); // Weird problem: If I use ? instead of concat directly, there is no result in the join table // TODO: Find a way to use ? instead of concat. // TODO: a bug here // when no notes and have cat, inner join will not return this cat String rawQuery = "SELECT " + category_title + ", COUNT(*) FROM " + table_category + String rawQuery = "SELECT " + category_title + ", COUNT(*) FROM " + table_category + " INNER JOIN " + table_notes + " ON " + category_id + " = " + note_title + " INNER JOIN " + table_notes + " ON " + category_id + " = " + note_title + " WHERE " + category_accountId + " = ? AND " + note_status + " != ? GROUP BY " + category_id; " WHERE " + category_accountId + " = ? AND " + note_status + " != ? GROUP BY " + category_id; // String rawQuery = "SELECT " + category_title + ", COUNT(*) FROM " + table_category + " INNER JOIN " + table_notes + // " ON " + category_id + " = " + note_title + " WHERE " + category_accountId + " = " + accountId + // " GROUP BY " + category_id; Cursor cursor = getReadableDatabase().rawQuery(rawQuery, new String[]{String.valueOf(accountId), DBStatus.LOCAL_DELETED.getTitle()}); Cursor cursor = getReadableDatabase().rawQuery(rawQuery, new String[]{String.valueOf(accountId), DBStatus.LOCAL_DELETED.getTitle()}); List<NavigationAdapter.NavigationItem> categories = new ArrayList<>(cursor.getCount()); List<NavigationAdapter.NavigationItem> categories = new ArrayList<>(cursor.getCount()); while (cursor.moveToNext()) { while (cursor.moveToNext()) { Loading Loading @@ -918,13 +911,14 @@ public class NotesDatabase extends AbstractNotesDatabase { } } // TODO: test // TODO: test // TODO: not fuzzy search by testing bug? private List<Integer> getCategoryIdsByTitle(long accountId, @NonNull String title) { private List<Integer> getCategoryIdsByTitle(long accountId, @NonNull String title) { validateAccountId(accountId); validateAccountId(accountId); Cursor cursor = getReadableDatabase().query( Cursor cursor = getReadableDatabase().query( table_category, table_category, new String[]{key_id}, new String[]{key_id}, key_title + " = ? OR " + key_title + " LIKE ? AND " + key_account_id + " = ? ", key_title + " = ? OR " + key_title + " LIKE ? AND " + key_account_id + " = ? ", new String[]{title, title + "/%", String.valueOf(accountId)}, new String[]{title, title + "%", String.valueOf(accountId)}, key_id, key_id, null, null, key_id key_id Loading
app/src/test/java/it/niedermann/owncloud/notes/android/fragment/SearchableBaseNoteFragmentTest.java +59 −3 Original line number Original line Diff line number Diff line package it.niedermann.owncloud.notes.android.fragment; package it.niedermann.owncloud.notes.android.fragment; import it.niedermann.owncloud.notes.android.fragment.SearchableBaseNoteFragment; import android.util.Log; import android.util.Log; import org.junit.Test; import org.junit.Test; import java.lang.reflect.Method; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Arrays; import java.util.Random; import static org.junit.Assert.*; import static org.junit.Assert.*; public class SearchableBaseNoteFragmentTest { public class SearchableBaseNoteFragmentTest { @Test public void testCountOccurrencesFixed() { try { Method method = SearchableBaseNoteFragment.class.getDeclaredMethod("countOccurrences", String.class, String.class); method.setAccessible(true); for (int count = 0; count <= 15; ++count) { StringBuilder sb = new StringBuilder("Mike Chester Wang"); Random rand = new Random(); for (int i = 0; i < count; ++i) { sb.append(sb); } long startTime = System.currentTimeMillis(); int num = (int) method.invoke(null, sb.toString(), "Chester"); long endTime = System.currentTimeMillis(); System.out.println("Fixed Version"); System.out.println("Total Time: " + (endTime - startTime) + " ms"); System.out.println("Total Times: " + num); System.out.println("String Size: " + (sb.length() / 1024) + " K"); assertEquals((int) Math.pow(2, count), num); System.out.println(); if (endTime - startTime > 10) { fail("The algorithm spends too much time."); } } } catch (Exception e) { fail(Arrays.toString(e.getStackTrace())); Log.e("Test_12_getCategoryIdByTitle", Arrays.toString(e.getStackTrace())); } } @Test @Test public void testCountOccurrences() { public void testCountOccurrencesRandom() { try { try { Method method = SearchableBaseNoteFragment.class.getDeclaredMethod("countOccurrences", String.class, String.class); Method method = SearchableBaseNoteFragment.class.getDeclaredMethod("countOccurrences", String.class, String.class); method.setAccessible(true); method.setAccessible(true); for (int count = 10; count <= 15; ++count) { StringBuilder sb = new StringBuilder("Mike Chester Wang"); Random rand = new Random(); for (int i = 0; i < count * 100; ++i) { sb.append(rand.nextDouble()); if (i % 100 == 0) { sb.append("flag"); } } long startTime = System.currentTimeMillis(); int num = (int) method.invoke(null, sb.toString(), String.valueOf(rand.nextInt(100))); long endTime = System.currentTimeMillis(); System.out.println("Random Version"); System.out.println("Total Time: " + (endTime - startTime) + " ms"); System.out.println("Total Times: " + num); System.out.println("String Size: " + (sb.length() / 1024) + " K"); System.out.println(); if (endTime - startTime > 10) { fail("The algorithm spends too much time."); } } } catch (Exception e) { } catch (Exception e) { fail(Arrays.toString(e.getStackTrace())); fail(Arrays.toString(e.getStackTrace())); Loading