Implement JDBC database

pull/312/head
Alinson S. Xavier 8 years ago
parent b96385c4a7
commit ecb5352134

@ -44,7 +44,7 @@ public class AndroidSQLiteDatabase implements Database
} }
@Override @Override
public void execSQL(String query, Object... params) public void execute(String query, Object... params)
{ {
db.execSQL(query, params); db.execSQL(query, params);
} }

@ -25,12 +25,13 @@ import android.content.*;
import android.database.sqlite.*; import android.database.sqlite.*;
import org.isoron.androidbase.*; import org.isoron.androidbase.*;
import org.isoron.uhabits.core.db.*;
import java.io.*; import java.io.*;
import java.util.*;
public class BaseSQLiteOpenHelper extends SQLiteOpenHelper public class BaseSQLiteOpenHelper extends SQLiteOpenHelper
implements MigrationHelper.FileOpener
{ {
private final Context context; private final Context context;
@ -48,38 +49,35 @@ public class BaseSQLiteOpenHelper extends SQLiteOpenHelper
@Override @Override
public void onCreate(SQLiteDatabase db) public void onCreate(SQLiteDatabase db)
{ {
executeMigrations(db, -1, version); MigrationHelper helper =
new MigrationHelper(this, new AndroidSQLiteDatabase(db));
helper.executeMigrations(-1, version);
} }
@Override @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{ {
executeMigrations(db, oldVersion, newVersion); MigrationHelper helper =
new MigrationHelper(this, new AndroidSQLiteDatabase(db));
helper.executeMigrations(oldVersion, newVersion);
} }
private void executeMigrations(SQLiteDatabase db, @Override
int oldVersion, public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)
int newVersion) {
throw new UnsupportedDatabaseVersionException();
}
@Override
public InputStream open(String filename)
{ {
try try
{ {
for (int v = oldVersion + 1; v <= newVersion; v++) return context.getAssets().open(filename);
{
String fname = String.format(Locale.US, "migrations/%d.sql", v);
InputStream stream = context.getAssets().open(fname);
for (String command : SQLParser.parse(stream))
db.execSQL(command);
}
} }
catch (Exception e) catch (IOException e)
{ {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
throw new UnsupportedDatabaseVersionException();
}
} }

@ -8,19 +8,24 @@ apply plugin: 'jacoco'
dependencies { dependencies {
apt 'com.google.auto.factory:auto-factory:1.0-beta3' apt 'com.google.auto.factory:auto-factory:1.0-beta3'
apt 'com.google.dagger:dagger:2.11-rc2' apt 'com.google.dagger:dagger:2.11-rc2'
compileOnly 'javax.annotation:jsr250-api:1.0' compileOnly 'javax.annotation:jsr250-api:1.0'
compileOnly 'org.jetbrains:annotations-java5:15.0' compileOnly 'org.jetbrains:annotations-java5:15.0'
compileOnly 'com.google.auto.factory:auto-factory:1.0-beta3' compileOnly 'com.google.auto.factory:auto-factory:1.0-beta3'
compileOnly 'com.google.dagger:dagger:2.11-rc2' compileOnly 'com.google.dagger:dagger:2.11-rc2'
implementation 'com.android.support:support-annotations:25.3.1' implementation 'com.android.support:support-annotations:25.3.1'
implementation 'com.google.code.findbugs:jsr305:3.0.2' implementation 'com.google.code.findbugs:jsr305:3.0.2'
implementation 'org.apache.commons:commons-lang3:3.5' implementation 'org.apache.commons:commons-lang3:3.5'
implementation 'com.google.code.gson:gson:2.7' implementation 'com.google.code.gson:gson:2.7'
testImplementation 'junit:junit:4+' testImplementation 'junit:junit:4+'
testImplementation 'org.hamcrest:hamcrest-library:1.4-atlassian-1' testImplementation 'org.hamcrest:hamcrest-library:1.4-atlassian-1'
testImplementation 'org.apache.commons:commons-io:1.3.2' testImplementation 'org.apache.commons:commons-io:1.3.2'
testImplementation 'org.mockito:mockito-core:2.8.9' testImplementation 'org.mockito:mockito-core:2.8.9'
testImplementation 'org.json:json:20160810' testImplementation 'org.json:json:20160810'
testImplementation 'org.xerial:sqlite-jdbc:3.18.0'
implementation('com.opencsv:opencsv:3.9') { implementation('com.opencsv:opencsv:3.9') {
exclude group: 'commons-logging', module: 'commons-logging' exclude group: 'commons-logging', module: 'commons-logging'
} }

@ -15,8 +15,6 @@
* *
* You should have received a copy of the GNU General Public License along * You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
*/ */
package org.isoron.uhabits.core.db; package org.isoron.uhabits.core.db;

@ -15,8 +15,6 @@
* *
* You should have received a copy of the GNU General Public License along * You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
*/ */
package org.isoron.uhabits.core.db; package org.isoron.uhabits.core.db;

@ -15,8 +15,6 @@
* *
* You should have received a copy of the GNU General Public License along * You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
*/ */
package org.isoron.uhabits.core.db; package org.isoron.uhabits.core.db;
@ -36,7 +34,7 @@ public interface Database
void delete(String tableName, String where, String... params); void delete(String tableName, String where, String... params);
void execSQL(String query, Object... params); void execute(String query, Object... params);
void beginTransaction(); void beginTransaction();

@ -0,0 +1,112 @@
/*
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*
*
*/
package org.isoron.uhabits.core.db;
import java.sql.*;
public class JdbcCursor implements Cursor
{
private ResultSet resultSet;
public JdbcCursor(ResultSet resultSet)
{
this.resultSet = resultSet;
}
@Override
public void close()
{
try
{
resultSet.close();
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
@Override
public boolean moveToNext()
{
try
{
return resultSet.next();
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
@Override
public Integer getInt(int index)
{
try
{
return resultSet.getInt(index);
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
@Override
public Long getLong(int index)
{
try
{
return resultSet.getLong(index);
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
@Override
public Double getDouble(int index)
{
try
{
return resultSet.getDouble(index);
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
@Override
public String getString(int index)
{
try
{
return resultSet.getString(index);
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
}

@ -0,0 +1,184 @@
/*
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.core.db;
import org.apache.commons.lang3.*;
import java.sql.*;
import java.util.*;
public class JdbcDatabase implements Database
{
private Connection connection;
private boolean transactionSuccessful;
public JdbcDatabase(Connection connection)
{
this.connection = connection;
}
@Override
public Cursor select(String query, String... params)
{
try
{
PreparedStatement st = buildStatement(query, params);
return new JdbcCursor(st.executeQuery());
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
@Override
public int update(String tableName,
Map<String, Object> map,
String where,
String... params)
{
try
{
ArrayList<String> fields = new ArrayList<>();
ArrayList<String> values = new ArrayList<>();
for (Map.Entry<String, Object> entry : map.entrySet())
{
if (entry.getValue() == null) continue;
fields.add(entry.getKey() + "=?");
values.add(entry.getValue().toString());
}
values.addAll(Arrays.asList(params));
String query = String.format("update %s set %s where %s", tableName,
StringUtils.join(fields, ", "), where);
System.out.println(query);
PreparedStatement st = buildStatement(query, values.toArray());
return st.executeUpdate();
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
@Override
public Long insert(String tableName, Map<String, Object> map)
{
try
{
ArrayList<String> fields = new ArrayList<>();
ArrayList<Object> params = new ArrayList<>();
ArrayList<String> questionMarks = new ArrayList<>();
for (Map.Entry<String, Object> entry : map.entrySet())
{
if (entry.getValue() == null) continue;
fields.add(entry.getKey());
params.add(entry.getValue());
questionMarks.add("?");
}
String query =
String.format("insert into %s(%s) values(%s)", tableName,
StringUtils.join(fields, ", "),
StringUtils.join(questionMarks, ", "));
PreparedStatement st = buildStatement(query, params.toArray());
st.execute();
Long id = null;
ResultSet keys = st.getGeneratedKeys();
if (keys.next()) id = keys.getLong(1);
return id;
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
@Override
public void delete(String tableName, String where, String... params)
{
String query =
String.format("delete from %s where %s", tableName, where);
execute(query, (Object[]) params);
}
@Override
public void execute(String query, Object... params)
{
try
{
buildStatement(query, params).execute();
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
private PreparedStatement buildStatement(String query, Object[] params)
throws SQLException
{
PreparedStatement st = connection.prepareStatement(query);
int index = 1;
for (Object param : params) st.setString(index++, param.toString());
return st;
}
@Override
public synchronized void beginTransaction()
{
try
{
connection.setAutoCommit(false);
transactionSuccessful = false;
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
@Override
public synchronized void setTransactionSuccessful()
{
transactionSuccessful = true;
}
@Override
public synchronized void endTransaction()
{
try
{
if (transactionSuccessful) connection.commit();
else connection.rollback();
connection.setAutoCommit(true);
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
}

@ -0,0 +1,61 @@
/*
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.core.db;
import android.support.annotation.*;
import java.io.*;
import java.util.*;
public class MigrationHelper
{
private final FileOpener opener;
private final Database db;
public MigrationHelper(@NonNull FileOpener opener, @NonNull Database db)
{
this.opener = opener;
this.db = db;
}
public void executeMigrations(int oldVersion, int newVersion)
{
try
{
for (int v = oldVersion + 1; v <= newVersion; v++)
{
String fname = String.format(Locale.US, "migrations/%d.sql", v);
InputStream stream = opener.open(fname);
for (String command : SQLParser.parse(stream))
db.execute(command);
}
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
public interface FileOpener
{
InputStream open(String filename);
}
}

@ -15,8 +15,6 @@
* *
* You should have received a copy of the GNU General Public License along * You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
*/ */
package org.isoron.uhabits.core.db; package org.isoron.uhabits.core.db;
@ -57,7 +55,7 @@ public class Repository<T>
/** /**
* Returns all records matching the given SQL query. * Returns all records matching the given SQL query.
* * <p>
* The query should only contain the "where" part of the SQL query, and * The query should only contain the "where" part of the SQL query, and
* optinally the "order by" part. "Group by" is not allowed. If no matching * optinally the "order by" part. "Group by" is not allowed. If no matching
* records are found, returns an empty list. * records are found, returns an empty list.
@ -87,19 +85,19 @@ public class Repository<T>
/** /**
* Executes the given SQL query on the repository. * Executes the given SQL query on the repository.
* * <p>
* The query can be of any kind. For example, complex deletes and updates * The query can be of any kind. For example, complex deletes and updates
* are allowed. The repository does not perform any checks to guarantee * are allowed. The repository does not perform any checks to guarantee
* that the query is valid, however the underlying database might. * that the query is valid, however the underlying database might.
*/ */
public void execSQL(String query, Object... params) public void execSQL(String query, Object... params)
{ {
db.execSQL(query, params); db.execute(query, params);
} }
/** /**
* Executes the given callback inside a database transaction. * Executes the given callback inside a database transaction.
* * <p>
* If the callback terminates without throwing any exceptions, the * If the callback terminates without throwing any exceptions, the
* transaction is considered successful. If any exceptions are thrown, * transaction is considered successful. If any exceptions are thrown,
* the transaction is aborted. Nesting transactions is not allowed. * the transaction is aborted. Nesting transactions is not allowed.
@ -124,12 +122,12 @@ public class Repository<T>
/** /**
* Saves the record on the database. * Saves the record on the database.
* * <p>
* If the id of the given record is null, it is assumed that the record has * If the id of the given record is null, it is assumed that the record has
* not been inserted in the repository yet. The record will be inserted, a * not been inserted in the repository yet. The record will be inserted, a
* new id will be automatically generated, and the id of the given record * new id will be automatically generated, and the id of the given record
* will be updated. * will be updated.
* * <p>
* If the given record has a non-null id, then an update will be performed * If the given record has a non-null id, then an update will be performed
* instead. That is, the previous record will be overwritten by the one * instead. That is, the previous record will be overwritten by the one
* provided. * provided.
@ -150,7 +148,7 @@ public class Repository<T>
if (id != null) affectedRows = if (id != null) affectedRows =
db.update(getTableName(), values, getIdName() + "=?", db.update(getTableName(), values, getIdName() + "=?",
new String[]{ id.toString() }); id.toString());
if (id == null || affectedRows == 0) if (id == null || affectedRows == 0)
{ {
@ -176,8 +174,7 @@ public class Repository<T>
Long id = (Long) getIdField().get(record); Long id = (Long) getIdField().get(record);
if (id == null) return; if (id == null) return;
db.delete(getTableName(), getIdName() + "=?", db.delete(getTableName(), getIdName() + "=?", id.toString());
new String[]{ id.toString() });
getIdField().set(record, null); getIdField().set(record, null);
} }
catch (Exception e) catch (Exception e)

@ -1,25 +1,20 @@
/* /*
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com> * Copyright (C) 2014 Markus Pfeiffer
* *
* This file is part of Loop Habit Tracker. * Licensed under the Apache License, Version 2.0 (the "License");
* * you may not use this file except in compliance with the License.
* Loop Habit Tracker is free software: you can redistribute it and/or modify * You may obtain a copy of the License at
* 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 <http://www.gnu.org/licenses/>.
* *
* http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ */
package org.isoron.uhabits.database; package org.isoron.uhabits.core.db;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.IOException; import java.io.IOException;

@ -15,8 +15,6 @@
* *
* You should have received a copy of the GNU General Public License along * You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
*/ */
package org.isoron.uhabits.core.db; package org.isoron.uhabits.core.db;

@ -0,0 +1,3 @@
delete from Score;
delete from Streak;
delete from Checkmarks;

@ -0,0 +1 @@
alter table Habits add column reminder_days integer not null default 127;

@ -0,0 +1,3 @@
delete from Score;
delete from Streak;
delete from Checkmarks;

@ -0,0 +1,4 @@
create index idx_score_habit_timestamp on Score(habit, timestamp);
create index idx_checkmark_habit_timestamp on Checkmarks(habit, timestamp);
create index idx_repetitions_habit_timestamp on Repetitions(habit, timestamp);
create index idx_streak_habit_end on Streak(habit, end);

@ -0,0 +1,14 @@
update habits set color=0 where color=-2937041;
update habits set color=1 where color=-1684967;
update habits set color=2 where color=-415707;
update habits set color=3 where color=-5262293;
update habits set color=4 where color=-13070788;
update habits set color=5 where color=-16742021;
update habits set color=6 where color=-16732991;
update habits set color=7 where color=-16540699;
update habits set color=8 where color=-10603087;
update habits set color=9 where color=-7461718;
update habits set color=10 where color=-2614432;
update habits set color=11 where color=-13619152;
update habits set color=12 where color=-5592406;
update habits set color=0 where color<0 or color>12;

@ -0,0 +1,3 @@
delete from Score;
delete from Streak;
delete from Checkmarks;

@ -0,0 +1,2 @@
alter table Habits add column type integer not null default 0;
alter table Repetitions add column value integer not null default 2;

@ -0,0 +1,11 @@
drop table Score;
create table Score (
id integer primary key autoincrement,
habit integer references habits(id),
score real,
timestamp integer);
create index idx_score_habit_timestamp on Score(habit, timestamp);
delete from streak;
delete from checkmarks;

@ -0,0 +1,3 @@
alter table Habits add column target_type integer not null default 0;
alter table Habits add column target_value real not null default 0;
alter table Habits add column unit text not null default "";

@ -0,0 +1,6 @@
create table Events (
id integer primary key autoincrement,
timestamp integer,
message text,
server_id integer
);

@ -0,0 +1,3 @@
drop table checkmarks;
drop table streak;
drop table score;

@ -0,0 +1,12 @@
update habits set color=19 where color=12;
update habits set color=17 where color=11;
update habits set color=15 where color=10;
update habits set color=14 where color=9;
update habits set color=13 where color=8;
update habits set color=10 where color=7;
update habits set color=9 where color=6;
update habits set color=8 where color=5;
update habits set color=7 where color=4;
update habits set color=5 where color=3;
update habits set color=4 where color=2;
update habits set color=0 where color<0 or color>19;

@ -0,0 +1,41 @@
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
);

@ -20,6 +20,7 @@
package org.isoron.uhabits; package org.isoron.uhabits;
import org.isoron.uhabits.core.commands.*; import org.isoron.uhabits.core.commands.*;
import org.isoron.uhabits.core.db.*;
import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.core.models.*;
import org.isoron.uhabits.core.models.memory.*; import org.isoron.uhabits.core.models.memory.*;
import org.isoron.uhabits.core.tasks.*; import org.isoron.uhabits.core.tasks.*;
@ -29,9 +30,11 @@ import org.junit.*;
import org.junit.runner.*; import org.junit.runner.*;
import org.mockito.junit.*; import org.mockito.junit.*;
import java.sql.*;
import java.util.*; import java.util.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.validateMockitoUsage;
@RunWith(MockitoJUnitRunner.class) @RunWith(MockitoJUnitRunner.class)
public class BaseUnitTest public class BaseUnitTest
@ -51,7 +54,7 @@ public class BaseUnitTest
protected static final long FIXED_LOCAL_TIME = 1422172800000L; protected static final long FIXED_LOCAL_TIME = 1422172800000L;
@Before @Before
public void setUp() public void setUp() throws Exception
{ {
DateUtils.setFixedLocalTime(FIXED_LOCAL_TIME); DateUtils.setFixedLocalTime(FIXED_LOCAL_TIME);
@ -81,4 +84,16 @@ public class BaseUnitTest
{ {
} }
protected Database buildMemoryDatabase()
{
try
{
return new JdbcDatabase(DriverManager.getConnection("jdbc:sqlite::memory:"));
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
} }

@ -37,7 +37,7 @@ public class ArchiveHabitsCommandTest extends BaseUnitTest
@Override @Override
@Before @Before
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();

@ -36,7 +36,7 @@ public class ChangeHabitColorCommandTest extends BaseUnitTest
@Override @Override
@Before @Before
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();

@ -42,7 +42,7 @@ public class CommandParserTest extends BaseUnitTest
@Override @Override
@Before @Before
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
parser = new CommandParser(habitList, modelFactory); parser = new CommandParser(habitList, modelFactory);

@ -35,7 +35,7 @@ public class CreateHabitCommandTest extends BaseUnitTest
@Override @Override
@Before @Before
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();

@ -39,7 +39,7 @@ public class CreateRepetitionCommandTest extends BaseUnitTest
@Override @Override
@Before @Before
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();

@ -40,7 +40,7 @@ public class DeleteHabitsCommandTest extends BaseUnitTest
@Override @Override
@Before @Before
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
selected = new LinkedList<>(); selected = new LinkedList<>();

@ -36,7 +36,7 @@ public class EditHabitCommandTest extends BaseUnitTest
@Override @Override
@Before @Before
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();

@ -37,7 +37,7 @@ public class ToggleRepetitionCommandTest extends BaseUnitTest
@Override @Override
@Before @Before
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();

@ -36,7 +36,7 @@ public class UnarchiveHabitsCommandTest extends BaseUnitTest
@Override @Override
@Before @Before
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();

@ -45,7 +45,7 @@ public class CheckmarkListTest extends BaseUnitTest
private Habit numericalHabit; private Habit numericalHabit;
@Override @Override
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();

@ -49,7 +49,7 @@ public class HabitListTest extends BaseUnitTest
private HabitList reminderHabits; private HabitList reminderHabits;
@Override @Override
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
habitsArray = new ArrayList<>(); habitsArray = new ArrayList<>();

@ -33,7 +33,7 @@ public class HabitTest extends BaseUnitTest
public final ExpectedException exception = ExpectedException.none(); public final ExpectedException exception = ExpectedException.none();
@Override @Override
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
} }

@ -52,7 +52,7 @@ public class RepetitionListTest extends BaseUnitTest
@Override @Override
@Before @Before
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
habit = fixtures.createEmptyHabit(); habit = fixtures.createEmptyHabit();

@ -38,7 +38,7 @@ public class ScoreListTest extends BaseUnitTest
@Override @Override
@Before @Before
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
habit = fixtures.createEmptyHabit(); habit = fixtures.createEmptyHabit();

@ -32,7 +32,7 @@ public class ScoreTest extends BaseUnitTest
@Override @Override
@Before @Before
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
} }

@ -42,7 +42,7 @@ public class StreakListTest extends BaseUnitTest
private ModelObservable.Listener listener; private ModelObservable.Listener listener;
@Override @Override
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
habit = fixtures.createLongHabit(); habit = fixtures.createLongHabit();

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com> * Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
* *
* This file is part of Loop Habit Tracker. * This file is part of Loop Habit Tracker.
* *
@ -15,59 +15,44 @@
* *
* You should have received a copy of the GNU General Public License along * You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
*/ */
package org.isoron.uhabits.models.sqlite; package org.isoron.uhabits.core.models.sqlite;
import android.support.test.runner.*;
import android.test.suitebuilder.annotation.*;
import com.google.common.collect.*;
import org.isoron.uhabits.*; import org.isoron.uhabits.*;
import org.isoron.uhabits.core.db.*; import org.isoron.uhabits.core.db.*;
import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.core.models.*;
import org.isoron.uhabits.core.models.sqlite.*;
import org.isoron.uhabits.core.models.sqlite.records.*; import org.isoron.uhabits.core.models.sqlite.records.*;
import org.isoron.uhabits.database.*;
import org.isoron.uhabits.utils.*;
import org.junit.*; import org.junit.*;
import org.junit.rules.*; import org.junit.rules.*;
import org.junit.runner.*;
import java.util.*;
import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.core.IsEqual.*; import static org.hamcrest.core.IsEqual.*;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
@SuppressWarnings("JavaDoc") public class SQLiteHabitListTest extends BaseUnitTest
@RunWith(AndroidJUnit4.class)
@MediumTest
public class SQLiteHabitListTest extends BaseAndroidTest
{ {
@Rule @Rule
public ExpectedException exception = ExpectedException.none(); public ExpectedException exception = ExpectedException.none();
private SQLiteHabitList habitList; private SQLiteHabitList habitList;
private ModelFactory modelFactory;
private Repository<HabitRecord> repository; private Repository<HabitRecord> repository;
private ModelObservable.Listener listener; private ModelObservable.Listener listener;
@Override @Override
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
this.habitList = (SQLiteHabitList) super.habitList; Database db = buildMemoryDatabase();
fixtures.purgeHabits(habitList); repository = new Repository<>(HabitRecord.class, db);
habitList = new SQLiteHabitList(new SQLModelFactory(db));
modelFactory = component.getModelFactory();
repository = new Repository<>(HabitRecord.class,
new AndroidSQLiteDatabase(DatabaseUtils.openDatabase()));
for (int i = 0; i < 10; i++) for (int i = 0; i < 10; i++)
{ {
@ -89,7 +74,7 @@ public class SQLiteHabitListTest extends BaseAndroidTest
} }
@Override @Override
protected void tearDown() throws Exception public void tearDown()
{ {
habitList.getObservable().removeListener(listener); habitList.getObservable().removeListener(listener);
super.tearDown(); super.tearDown();
@ -142,14 +127,6 @@ public class SQLiteHabitListTest extends BaseAndroidTest
assertThat(habitList.size(), equalTo(10)); assertThat(habitList.size(), equalTo(10));
} }
@Test
public void testGetAll_withArchived()
{
List<Habit> habits = Lists.newArrayList(habitList.iterator());
assertThat(habits.size(), equalTo(10));
assertThat(habits.get(3).getName(), equalTo("habit 3"));
}
@Test @Test
public void testGetById() public void testGetById()
{ {

@ -23,7 +23,6 @@ package org.isoron.uhabits.core.models.sqlite.records;
import org.isoron.uhabits.*; import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.core.models.*;
import org.isoron.uhabits.core.models.sqlite.records.*;
import org.junit.*; import org.junit.*;
import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.MatcherAssert.*;
@ -35,7 +34,7 @@ public class HabitRecordTest extends BaseUnitTest
@Before @Before
@Override @Override
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();

@ -43,7 +43,7 @@ public class ReminderSchedulerTest extends BaseUnitTest
@Before @Before
@Override @Override
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
habit = fixtures.createEmptyHabit(); habit = fixtures.createEmptyHabit();

@ -35,7 +35,7 @@ public class SingleThreadTaskRunnerTest extends BaseUnitTest
private Task task; private Task task;
@Override @Override
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
runner = new SingleThreadTaskRunner(); runner = new SingleThreadTaskRunner();

@ -39,8 +39,9 @@ public class AboutBehaviorTest extends BaseUnitTest
private AboutBehavior.Screen screen; private AboutBehavior.Screen screen;
@Before @Before
public void setUp() public void setUp() throws Exception
{ {
super.setUp();
behavior = new AboutBehavior(prefs, screen); behavior = new AboutBehavior(prefs, screen);
} }

@ -40,7 +40,7 @@ public class HabitCardListCacheTest extends BaseUnitTest
private HabitCardListCache.Listener listener; private HabitCardListCache.Listener listener;
@Override @Override
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
habitList.removeAll(); habitList.removeAll();

@ -46,7 +46,7 @@ public class HintListTest extends BaseUnitTest
private long yesterday; private long yesterday;
@Override @Override
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
today = DateUtils.getStartOfToday(); today = DateUtils.getStartOfToday();

@ -67,7 +67,7 @@ public class ListHabitsBehaviorTest extends BaseUnitTest
@Override @Override
@Before @Before
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
habit1 = fixtures.createShortHabit(); habit1 = fixtures.createShortHabit();

@ -55,7 +55,7 @@ public class ListHabitsMenuBehaviorTest extends BaseUnitTest
private ArgumentCaptor<HabitList.Order> orderCaptor; private ArgumentCaptor<HabitList.Order> orderCaptor;
@Override @Override
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
behavior = behavior =

@ -139,7 +139,7 @@ public class ListHabitsSelectionMenuBehaviorTest extends BaseUnitTest
} }
@Override @Override
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();

@ -42,7 +42,7 @@ public class ShowHabitMenuBehaviorTest extends BaseUnitTest
private ShowHabitMenuBehavior menu; private ShowHabitMenuBehavior menu;
@Override @Override
public void setUp() public void setUp() throws Exception
{ {
super.setUp(); super.setUp();
system = mock(ShowHabitMenuBehavior.System.class); system = mock(ShowHabitMenuBehavior.System.class);

Loading…
Cancel
Save