diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/HabitListTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/HabitListTest.java deleted file mode 100644 index 6e7daa279..000000000 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/HabitListTest.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright (C) 2016 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by the - * Free Software Foundation, either version 3 of the License, or (at your - * option) any later version. - * - * Loop Habit Tracker is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -package org.isoron.uhabits.models; - -import android.support.test.runner.*; -import android.test.suitebuilder.annotation.*; - -import org.hamcrest.*; -import org.isoron.uhabits.*; -import org.isoron.uhabits.core.models.*; -import org.junit.*; -import org.junit.runner.*; - -import java.io.*; -import java.util.*; - -import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.MatcherAssert.*; -import static org.hamcrest.core.IsEqual.equalTo; -import static org.isoron.uhabits.core.models.HabitList.Order.*; - -@RunWith(AndroidJUnit4.class) -@MediumTest -public class HabitListTest extends BaseAndroidTest -{ - private ArrayList habitsArray; - - private HabitList activeHabits; - - private HabitList reminderHabits; - - @Override - public void setUp() - { - super.setUp(); - habitList.removeAll(); - - habitsArray = new ArrayList<>(); - - for (int i = 0; i < 10; i++) - { - Habit habit = fixtures.createEmptyHabit((long) i); - habitsArray.add(habit); - - if (i % 3 == 0) - habit.setReminder(new Reminder(8, 30, WeekdayList.EVERY_DAY)); - - habitList.update(habit); - } - - habitsArray.get(0).setArchived(true); - habitsArray.get(1).setArchived(true); - habitsArray.get(4).setArchived(true); - habitsArray.get(7).setArchived(true); - - activeHabits = habitList.getFiltered(new HabitMatcherBuilder().build()); - - reminderHabits = habitList.getFiltered(new HabitMatcherBuilder() - .setArchivedAllowed(true) - .setReminderRequired(true) - .build()); - } - - @Test - public void test_size() - { - assertThat(habitList.size(), equalTo(10)); - } - - @Test - public void test_countActive() - { - assertThat(activeHabits.size(), equalTo(6)); - } - - @Test - public void test_getByPosition() - { - assertThat(habitList.getByPosition(0), equalTo(habitsArray.get(0))); - assertThat(habitList.getByPosition(3), equalTo(habitsArray.get(3))); - assertThat(habitList.getByPosition(9), equalTo(habitsArray.get(9))); - - assertThat(activeHabits.getByPosition(0), equalTo(habitsArray.get(2))); - } - - @Test - public void test_getHabitsWithReminder() - { - assertThat(reminderHabits.size(), equalTo(4)); - assertThat(reminderHabits.getByPosition(1), - equalTo(habitsArray.get(3))); - } - - @Test - public void test_get_withInvalidId() - { - assertThat(habitList.getById(100L), is(nullValue())); - } - - @Test - public void test_get_withValidId() - { - Habit habit1 = habitsArray.get(0); - Habit habit2 = habitList.getById(habit1.getId()); - assertThat(habit1, equalTo(habit2)); - } - - @Test - public void test_reorder() - { - int operations[][] = { - { 5, 2 }, { 3, 7 }, { 4, 4 }, { 3, 2 } - }; - - int expectedPosition[][] = { - { 0, 1, 3, 4, 5, 2, 6, 7, 8, 9 }, - { 0, 1, 7, 3, 4, 2, 5, 6, 8, 9 }, - { 0, 1, 7, 3, 4, 2, 5, 6, 8, 9 }, - { 0, 1, 7, 2, 4, 3, 5, 6, 8, 9 }, - }; - - for (int i = 0; i < operations.length; i++) - { - int from = operations[i][0]; - int to = operations[i][1]; - - Habit fromHabit = habitList.getByPosition(from); - Habit toHabit = habitList.getByPosition(to); - habitList.reorder(fromHabit, toHabit); - - int actualPositions[] = new int[10]; - - for (int j = 0; j < 10; j++) - { - Habit h = habitList.getById(j); - assertNotNull(h); - actualPositions[j] = habitList.indexOf(h); - } - - assertThat(actualPositions, equalTo(expectedPosition[i])); - } - } - - @Test - public void test_writeCSV() throws IOException - { - habitList.removeAll(); - - Habit h1 = fixtures.createEmptyHabit(); - h1.setName("Meditate"); - h1.setDescription("Did you meditate this morning?"); - h1.setFrequency(Frequency.DAILY); - h1.setColor(3); - - Habit h2 = fixtures.createEmptyHabit(); - h2.setName("Wake up early"); - h2.setDescription("Did you wake up before 6am?"); - h2.setFrequency(new Frequency(2, 3)); - h2.setColor(5); - - habitList.update(h1); - habitList.update(h2); - - String expectedCSV = - "Position,Name,Description,NumRepetitions,Interval,Color\n" + - "001,Meditate,Did you meditate this morning?,1,1,#FF8F00\n" + - "002,Wake up early,Did you wake up before 6am?,2,3,#AFB42B\n"; - - StringWriter writer = new StringWriter(); - habitList.writeCSV(writer); - - MatcherAssert.assertThat(writer.toString(), equalTo(expectedCSV)); - } - - @Test - public void test_ordering() - { - habitList.removeAll(); - - Habit h3 = fixtures.createEmptyHabit(); - h3.setName("C Habit"); - h3.setColor(0); - habitList.update(h3); - - Habit h1 = fixtures.createEmptyHabit(); - h1.setName("A Habit"); - h1.setColor(2); - habitList.update(h1); - - Habit h4 = fixtures.createEmptyHabit(); - h4.setName("D Habit"); - h4.setColor(1); - habitList.update(h4); - - Habit h2 = fixtures.createEmptyHabit(); - h2.setName("B Habit"); - h2.setColor(2); - habitList.update(h2); - - habitList.setOrder(BY_POSITION); - assertThat(habitList.getByPosition(0), equalTo(h3)); - assertThat(habitList.getByPosition(1), equalTo(h1)); - assertThat(habitList.getByPosition(2), equalTo(h4)); - assertThat(habitList.getByPosition(3), equalTo(h2)); - - habitList.setOrder(BY_NAME); - assertThat(habitList.getByPosition(0), equalTo(h1)); - assertThat(habitList.getByPosition(1), equalTo(h2)); - assertThat(habitList.getByPosition(2), equalTo(h3)); - assertThat(habitList.getByPosition(3), equalTo(h4)); - - habitList.remove(h1); - habitList.add(h1); - assertThat(habitList.getByPosition(0), equalTo(h1)); - - habitList.setOrder(BY_COLOR); - assertThat(habitList.getByPosition(0), equalTo(h3)); - assertThat(habitList.getByPosition(1), equalTo(h4)); - assertThat(habitList.getByPosition(2), equalTo(h1)); - assertThat(habitList.getByPosition(3), equalTo(h2)); - } -} \ No newline at end of file diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteRepetitionList.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteRepetitionList.java index 9ae44a15f..fcb75ad54 100644 --- a/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteRepetitionList.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteRepetitionList.java @@ -115,7 +115,7 @@ public class SQLiteRepetitionList extends RepetitionList check(habit.getId()); repository.execSQL( "delete from repetitions where habit = ? and timestamp = ?", - habit.getId()); + habit.getId(), repetition.getTimestamp()); observable.notifyListeners(); } diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/test/HabitFixtures.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/test/HabitFixtures.java index c5450fcb3..67a74c329 100644 --- a/uhabits-core/src/main/java/org/isoron/uhabits/core/test/HabitFixtures.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/test/HabitFixtures.java @@ -20,6 +20,7 @@ package org.isoron.uhabits.core.test; import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.models.sqlite.*; import org.isoron.uhabits.core.utils.*; public class HabitFixtures @@ -42,6 +43,8 @@ public class HabitFixtures habit.setDescription("Did you meditate this morning?"); habit.setColor(3); habit.setFrequency(Frequency.DAILY); + saveIfSQLite(habit); + return habit; } @@ -73,6 +76,7 @@ public class HabitFixtures habit.setTargetType(Habit.AT_LEAST); habit.setTargetValue(2.0); habit.setColor(1); + saveIfSQLite(habit); long day = DateUtils.millisecondsInOneDay; long today = DateUtils.getStartOfToday(); @@ -94,6 +98,7 @@ public class HabitFixtures habit.setName("Wake up early"); habit.setDescription("Did you wake up before 6am?"); habit.setFrequency(new Frequency(2, 3)); + saveIfSQLite(habit); long timestamp = DateUtils.getStartOfToday(); for (boolean c : NON_DAILY_HABIT_CHECKS) @@ -104,4 +109,10 @@ public class HabitFixtures return habit; } + + private void saveIfSQLite(Habit habit) + { + if (!(habit.getRepetitions() instanceof SQLiteRepetitionList)) return; + new SQLiteHabitList(modelFactory).add(habit); + } } diff --git a/uhabits-core/src/main/resources/migrations/9.sql b/uhabits-core/src/main/resources/migrations/9.sql deleted file mode 100644 index 5fb4502b4..000000000 --- a/uhabits-core/src/main/resources/migrations/9.sql +++ /dev/null @@ -1,41 +0,0 @@ -create table Habits ( - id integer primary key autoincrement, - archived integer, - color integer, - description text, - freq_den integer, - freq_num integer, - highlight integer, - name text, - position integer, - reminder_hour integer, - reminder_min integer -); - -create table Checkmarks ( - id integer primary key autoincrement, - habit integer references habits(id), - timestamp integer, - value integer -); - -create table Repetitions ( - id integer primary key autoincrement, - habit integer references habits(id), - timestamp integer -); - -create table Streak ( - id integer primary key autoincrement, - end integer, - habit integer references habits(id), - length integer, - start integer -); - -create table Score ( - id integer primary key autoincrement, - habit integer references habits(id), - score integer, - timestamp integer -); diff --git a/uhabits-core/src/test/java/org/isoron/uhabits/BaseUnitTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/BaseUnitTest.java index 4ab4b0afd..1d49f8860 100644 --- a/uhabits-core/src/test/java/org/isoron/uhabits/BaseUnitTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/BaseUnitTest.java @@ -47,7 +47,7 @@ public class BaseUnitTest protected HabitFixtures fixtures; - protected MemoryModelFactory modelFactory; + protected ModelFactory modelFactory; protected SingleThreadTaskRunner taskRunner; diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteRepositoryTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/db/RepositoryTest.java similarity index 82% rename from uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteRepositoryTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/db/RepositoryTest.java index d00dc9bdf..31247b6dc 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteRepositoryTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/db/RepositoryTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 Álinson Santos Xavier + * Copyright (C) 2017 Álinson Santos Xavier * * This file is part of Loop Habit Tracker. * @@ -17,42 +17,34 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models.sqlite; - -import android.database.sqlite.SQLiteDatabase; -import android.support.test.runner.*; -import android.test.suitebuilder.annotation.*; +package org.isoron.uhabits.core.db; import org.apache.commons.lang3.builder.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.core.db.*; -import org.isoron.uhabits.database.*; -import org.isoron.uhabits.utils.*; import org.junit.*; -import org.junit.runner.*; -import static org.hamcrest.core.IsEqual.*; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + -@RunWith(AndroidJUnit4.class) -@MediumTest -public class SQLiteRepositoryTest extends BaseAndroidTest +public class RepositoryTest extends BaseUnitTest { private Repository repository; - private SQLiteDatabase db; + private Database db; @Before @Override - public void setUp() + public void setUp() throws Exception { super.setUp(); - this.db = DatabaseUtils.openDatabase(); - repository = new Repository<>(ThingRecord.class, - new AndroidSQLiteDatabase((db))); + this.db = buildMemoryDatabase(); + repository = new Repository<>(ThingRecord.class, db); - db.execSQL("drop table if exists tests"); - db.execSQL("create table tests(" + + db.execute("drop table if exists tests"); + db.execute("create table tests(" + "id integer not null primary key autoincrement, " + "color_number integer not null, score float not null, " + "name string not null)"); @@ -61,7 +53,7 @@ public class SQLiteRepositoryTest extends BaseAndroidTest @Test public void testFind() throws Exception { - db.execSQL("insert into tests(id, color_number, name, score) " + + db.execute("insert into tests(id, color_number, name, score) " + "values (10, 20, 'hello', 8.0)"); ThingRecord record = repository.find(10L); diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteRepetitionListTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/sqlite/SQLiteRepetitionListTest.java similarity index 80% rename from uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteRepetitionListTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/models/sqlite/SQLiteRepetitionListTest.java index 14cf52255..6f56eab63 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteRepetitionListTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/sqlite/SQLiteRepetitionListTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 Álinson Santos Xavier + * Copyright (C) 2017 Álinson Santos Xavier * * This file is part of Loop Habit Tracker. * @@ -17,31 +17,27 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models.sqlite; +package org.isoron.uhabits.core.models.sqlite; import android.support.annotation.*; -import android.support.test.runner.*; -import android.test.suitebuilder.annotation.*; import org.isoron.uhabits.*; import org.isoron.uhabits.core.db.*; import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.core.models.sqlite.records.*; +import org.isoron.uhabits.core.test.*; import org.isoron.uhabits.core.utils.*; -import org.isoron.uhabits.database.*; -import org.isoron.uhabits.utils.*; import org.junit.*; -import org.junit.runner.*; import java.util.*; -import static android.support.test.espresso.matcher.ViewMatchers.assertThat; +import static junit.framework.TestCase.assertNotNull; +import static junit.framework.TestCase.assertNull; +import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.core.IsEqual.*; import static org.isoron.uhabits.core.models.Checkmark.CHECKED_EXPLICITLY; -@RunWith(AndroidJUnit4.class) -@MediumTest -public class SQLiteRepetitionListTest extends BaseAndroidTest +public class SQLiteRepetitionListTest extends BaseUnitTest { private Habit habit; @@ -51,19 +47,23 @@ public class SQLiteRepetitionListTest extends BaseAndroidTest private long day; - private Repository sqlite; + private Repository repository; @Override - public void setUp() + public void setUp() throws Exception { super.setUp(); + Database db = buildMemoryDatabase(); + modelFactory = new SQLModelFactory(db); + fixtures = new HabitFixtures(modelFactory); + habitList = modelFactory.buildHabitList(); + repository = new Repository<>(RepetitionRecord.class, db); habit = fixtures.createLongHabit(); + repetitions = habit.getRepetitions(); today = DateUtils.getStartOfToday(); day = DateUtils.millisecondsInOneDay; - sqlite = new Repository<>(RepetitionRecord.class, - new AndroidSQLiteDatabase(DatabaseUtils.openDatabase())); } @Test @@ -136,12 +136,10 @@ public class SQLiteRepetitionListTest extends BaseAndroidTest private RepetitionRecord getByTimestamp(long timestamp) { String query = "where habit = ? and timestamp = ?"; - String params[] = { - Long.toString(habit.getId()), - Long.toString(timestamp) + Long.toString(habit.getId()), Long.toString(timestamp) }; - return sqlite.findFirst(query, params); + return repository.findFirst(query, params); } }