mirror of
https://github.com/iSoron/uhabits.git
synced 2025-12-06 01:08:50 -06:00
Implement JDBC database
This commit is contained in:
@@ -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,33 +49,17 @@ 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,
|
|
||||||
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 = context.getAssets().open(fname);
|
|
||||||
for (String command : SQLParser.parse(stream))
|
|
||||||
db.execSQL(command);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -82,4 +67,17 @@ public class BaseSQLiteOpenHelper extends SQLiteOpenHelper
|
|||||||
{
|
{
|
||||||
throw new UnsupportedDatabaseVersionException();
|
throw new UnsupportedDatabaseVersionException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InputStream open(String filename)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return context.getAssets().open(filename);
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
3
uhabits-core/src/main/resources/migrations/10.sql
Normal file
3
uhabits-core/src/main/resources/migrations/10.sql
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
delete from Score;
|
||||||
|
delete from Streak;
|
||||||
|
delete from Checkmarks;
|
||||||
1
uhabits-core/src/main/resources/migrations/11.sql
Normal file
1
uhabits-core/src/main/resources/migrations/11.sql
Normal file
@@ -0,0 +1 @@
|
|||||||
|
alter table Habits add column reminder_days integer not null default 127;
|
||||||
3
uhabits-core/src/main/resources/migrations/12.sql
Normal file
3
uhabits-core/src/main/resources/migrations/12.sql
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
delete from Score;
|
||||||
|
delete from Streak;
|
||||||
|
delete from Checkmarks;
|
||||||
4
uhabits-core/src/main/resources/migrations/13.sql
Normal file
4
uhabits-core/src/main/resources/migrations/13.sql
Normal file
@@ -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);
|
||||||
14
uhabits-core/src/main/resources/migrations/14.sql
Normal file
14
uhabits-core/src/main/resources/migrations/14.sql
Normal file
@@ -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;
|
||||||
3
uhabits-core/src/main/resources/migrations/15.sql
Normal file
3
uhabits-core/src/main/resources/migrations/15.sql
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
delete from Score;
|
||||||
|
delete from Streak;
|
||||||
|
delete from Checkmarks;
|
||||||
2
uhabits-core/src/main/resources/migrations/16.sql
Normal file
2
uhabits-core/src/main/resources/migrations/16.sql
Normal file
@@ -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;
|
||||||
11
uhabits-core/src/main/resources/migrations/17.sql
Normal file
11
uhabits-core/src/main/resources/migrations/17.sql
Normal file
@@ -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;
|
||||||
3
uhabits-core/src/main/resources/migrations/18.sql
Normal file
3
uhabits-core/src/main/resources/migrations/18.sql
Normal file
@@ -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 "";
|
||||||
6
uhabits-core/src/main/resources/migrations/19.sql
Normal file
6
uhabits-core/src/main/resources/migrations/19.sql
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
create table Events (
|
||||||
|
id integer primary key autoincrement,
|
||||||
|
timestamp integer,
|
||||||
|
message text,
|
||||||
|
server_id integer
|
||||||
|
);
|
||||||
3
uhabits-core/src/main/resources/migrations/20.sql
Normal file
3
uhabits-core/src/main/resources/migrations/20.sql
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
drop table checkmarks;
|
||||||
|
drop table streak;
|
||||||
|
drop table score;
|
||||||
12
uhabits-core/src/main/resources/migrations/21.sql
Normal file
12
uhabits-core/src/main/resources/migrations/21.sql
Normal file
@@ -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;
|
||||||
41
uhabits-core/src/main/resources/migrations/9.sql
Normal file
41
uhabits-core/src/main/resources/migrations/9.sql
Normal file
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user