Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 027fbd52 authored by Isaac_Chen's avatar Isaac_Chen
Browse files

Add more tests for NotesDatabase

parents d7b0352f b0849a52
Loading
Loading
Loading
Loading
+37 −8
Original line number Original line Diff line number Diff line
@@ -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) {
@@ -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);
@@ -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()));
+3 −9
Original line number Original line Diff line number Diff line
@@ -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);
@@ -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()) {
@@ -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
+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()));