mirror of
https://github.com/iSoron/uhabits.git
synced 2025-12-06 09:08:52 -06:00
Write tests for ListHabits controller, menu and screen
This commit is contained in:
@@ -51,7 +51,7 @@ public class MainActivityActions
|
|||||||
String num = "4";
|
String num = "4";
|
||||||
String den = "8";
|
String den = "8";
|
||||||
|
|
||||||
onView(withId(R.id.action_add)).perform(click());
|
onView(withId(R.id.actionAdd)).perform(click());
|
||||||
|
|
||||||
typeHabitData(name, description, num, den);
|
typeHabitData(name, description, num, den);
|
||||||
|
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ public class MainTest
|
|||||||
@Test
|
@Test
|
||||||
public void testAddInvalidHabit()
|
public void testAddInvalidHabit()
|
||||||
{
|
{
|
||||||
onView(withId(R.id.action_add)).perform(click());
|
onView(withId(R.id.actionAdd)).perform(click());
|
||||||
|
|
||||||
typeHabitData("", "", "15", "7");
|
typeHabitData("", "", "15", "7");
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ import android.support.annotation.*;
|
|||||||
import com.activeandroid.*;
|
import com.activeandroid.*;
|
||||||
|
|
||||||
import org.isoron.uhabits.notifications.*;
|
import org.isoron.uhabits.notifications.*;
|
||||||
|
import org.isoron.uhabits.preferences.*;
|
||||||
|
import org.isoron.uhabits.tasks.*;
|
||||||
import org.isoron.uhabits.utils.*;
|
import org.isoron.uhabits.utils.*;
|
||||||
import org.isoron.uhabits.widgets.*;
|
import org.isoron.uhabits.widgets.*;
|
||||||
|
|
||||||
@@ -107,6 +109,16 @@ public class HabitsApplication extends Application
|
|||||||
notificationTray = component.getNotificationTray();
|
notificationTray = component.getNotificationTray();
|
||||||
notificationTray.startListening();
|
notificationTray.startListening();
|
||||||
|
|
||||||
|
Preferences prefs = component.getPreferences();
|
||||||
|
prefs.initialize();
|
||||||
|
prefs.updateLastAppVersion();
|
||||||
|
|
||||||
|
TaskRunner taskRunner = component.getTaskRunner();
|
||||||
|
taskRunner.execute(() -> {
|
||||||
|
reminderScheduler.scheduleAll();
|
||||||
|
widgetUpdater.updateWidgets();
|
||||||
|
});
|
||||||
|
|
||||||
DatabaseUtils.initializeActiveAndroid();
|
DatabaseUtils.initializeActiveAndroid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ import android.view.*;
|
|||||||
|
|
||||||
import org.isoron.uhabits.*;
|
import org.isoron.uhabits.*;
|
||||||
|
|
||||||
|
import static android.R.anim.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for all activities in the application.
|
* Base class for all activities in the application.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -75,6 +77,17 @@ abstract public class BaseActivity extends AppCompatActivity
|
|||||||
return baseMenu.onItemSelected(item);
|
return baseMenu.onItemSelected(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void restartWithFade()
|
||||||
|
{
|
||||||
|
new Handler().postDelayed(() -> {
|
||||||
|
Intent intent = new Intent(this, MainActivity.class);
|
||||||
|
finish();
|
||||||
|
overridePendingTransition(fade_in, fade_out);
|
||||||
|
startActivity(intent);
|
||||||
|
|
||||||
|
}, 500); // HACK: Let the menu disappear first
|
||||||
|
}
|
||||||
|
|
||||||
public void setBaseMenu(@Nullable BaseMenu baseMenu)
|
public void setBaseMenu(@Nullable BaseMenu baseMenu)
|
||||||
{
|
{
|
||||||
this.baseMenu = baseMenu;
|
this.baseMenu = baseMenu;
|
||||||
|
|||||||
@@ -66,6 +66,17 @@ public class ThemeSwitcher
|
|||||||
return getTheme() == THEME_DARK;
|
return getTheme() == THEME_DARK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void refreshTheme()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void toggleNightMode()
|
||||||
|
{
|
||||||
|
if (isNightMode()) setTheme(THEME_LIGHT);
|
||||||
|
else setTheme(THEME_DARK);
|
||||||
|
}
|
||||||
|
|
||||||
private void applyDarkTheme()
|
private void applyDarkTheme()
|
||||||
{
|
{
|
||||||
if (preferences.isPureBlackEnabled())
|
if (preferences.isPureBlackEnabled())
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
|
|
||||||
package org.isoron.uhabits.activities.habits.list;
|
package org.isoron.uhabits.activities.habits.list;
|
||||||
|
|
||||||
import android.os.*;
|
|
||||||
import android.support.annotation.*;
|
import android.support.annotation.*;
|
||||||
|
|
||||||
import org.isoron.uhabits.*;
|
import org.isoron.uhabits.*;
|
||||||
@@ -69,6 +68,8 @@ public class ListHabitsController
|
|||||||
|
|
||||||
private ImportDataTaskFactory importTaskFactory;
|
private ImportDataTaskFactory importTaskFactory;
|
||||||
|
|
||||||
|
private ExportCSVTaskFactory exportCSVFactory;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public ListHabitsController(@NonNull BaseSystem system,
|
public ListHabitsController(@NonNull BaseSystem system,
|
||||||
@NonNull CommandRunner commandRunner,
|
@NonNull CommandRunner commandRunner,
|
||||||
@@ -79,7 +80,8 @@ public class ListHabitsController
|
|||||||
@NonNull ReminderScheduler reminderScheduler,
|
@NonNull ReminderScheduler reminderScheduler,
|
||||||
@NonNull TaskRunner taskRunner,
|
@NonNull TaskRunner taskRunner,
|
||||||
@NonNull WidgetUpdater widgetUpdater,
|
@NonNull WidgetUpdater widgetUpdater,
|
||||||
@NonNull ImportDataTaskFactory importTaskFactory)
|
@NonNull ImportDataTaskFactory importTaskFactory,
|
||||||
|
@NonNull ExportCSVTaskFactory exportCSVFactory)
|
||||||
{
|
{
|
||||||
this.adapter = adapter;
|
this.adapter = adapter;
|
||||||
this.commandRunner = commandRunner;
|
this.commandRunner = commandRunner;
|
||||||
@@ -91,6 +93,7 @@ public class ListHabitsController
|
|||||||
this.reminderScheduler = reminderScheduler;
|
this.reminderScheduler = reminderScheduler;
|
||||||
this.widgetUpdater = widgetUpdater;
|
this.widgetUpdater = widgetUpdater;
|
||||||
this.importTaskFactory = importTaskFactory;
|
this.importTaskFactory = importTaskFactory;
|
||||||
|
this.exportCSVFactory = exportCSVFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onExportCSV()
|
public void onExportCSV()
|
||||||
@@ -98,7 +101,7 @@ public class ListHabitsController
|
|||||||
List<Habit> selected = new LinkedList<>();
|
List<Habit> selected = new LinkedList<>();
|
||||||
for (Habit h : habitList) selected.add(h);
|
for (Habit h : habitList) selected.add(h);
|
||||||
|
|
||||||
taskRunner.execute(new ExportCSVTask(habitList, selected, filename -> {
|
taskRunner.execute(exportCSVFactory.create(selected, filename -> {
|
||||||
if (filename != null) screen.showSendFileScreen(filename);
|
if (filename != null) screen.showSendFileScreen(filename);
|
||||||
else screen.showMessage(R.string.could_not_export);
|
else screen.showMessage(R.string.could_not_export);
|
||||||
}));
|
}));
|
||||||
@@ -179,15 +182,8 @@ public class ListHabitsController
|
|||||||
|
|
||||||
public void onStartup()
|
public void onStartup()
|
||||||
{
|
{
|
||||||
prefs.initialize();
|
|
||||||
prefs.incrementLaunchCount();
|
prefs.incrementLaunchCount();
|
||||||
prefs.updateLastAppVersion();
|
|
||||||
if (prefs.isFirstRun()) onFirstRun();
|
if (prefs.isFirstRun()) onFirstRun();
|
||||||
|
|
||||||
new Handler().postDelayed(() -> taskRunner.execute(() -> {
|
|
||||||
reminderScheduler.scheduleAll();
|
|
||||||
widgetUpdater.updateWidgets();
|
|
||||||
}), 1000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -67,10 +67,10 @@ public class ListHabitsMenu extends BaseMenu
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate(@NonNull Menu menu)
|
public void onCreate(@NonNull Menu menu)
|
||||||
{
|
{
|
||||||
MenuItem nightModeItem = menu.findItem(R.id.action_night_mode);
|
MenuItem nightModeItem = menu.findItem(R.id.actionToggleNightMode);
|
||||||
nightModeItem.setChecked(themeSwitcher.isNightMode());
|
nightModeItem.setChecked(themeSwitcher.isNightMode());
|
||||||
|
|
||||||
MenuItem showArchivedItem = menu.findItem(R.id.action_show_archived);
|
MenuItem showArchivedItem = menu.findItem(R.id.actionShowArchived);
|
||||||
showArchivedItem.setChecked(showArchived);
|
showArchivedItem.setChecked(showArchived);
|
||||||
|
|
||||||
MenuItem showCompletedItem = menu.findItem(R.id.actionShowCompleted);
|
MenuItem showCompletedItem = menu.findItem(R.id.actionShowCompleted);
|
||||||
@@ -82,27 +82,27 @@ public class ListHabitsMenu extends BaseMenu
|
|||||||
{
|
{
|
||||||
switch (item.getItemId())
|
switch (item.getItemId())
|
||||||
{
|
{
|
||||||
case R.id.action_night_mode:
|
case R.id.actionToggleNightMode:
|
||||||
screen.toggleNightMode();
|
screen.toggleNightMode();
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case R.id.action_add:
|
case R.id.actionAdd:
|
||||||
screen.showCreateHabitScreen();
|
screen.showCreateHabitScreen();
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case R.id.action_faq:
|
case R.id.actionFAQ:
|
||||||
screen.showFAQScreen();
|
screen.showFAQScreen();
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case R.id.action_about:
|
case R.id.actionAbout:
|
||||||
screen.showAboutScreen();
|
screen.showAboutScreen();
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case R.id.action_settings:
|
case R.id.actionSettings:
|
||||||
screen.showSettingsScreen();
|
screen.showSettingsScreen();
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case R.id.action_show_archived:
|
case R.id.actionShowArchived:
|
||||||
toggleShowArchived();
|
toggleShowArchived();
|
||||||
invalidate();
|
invalidate();
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -20,7 +20,6 @@
|
|||||||
package org.isoron.uhabits.activities.habits.list;
|
package org.isoron.uhabits.activities.habits.list;
|
||||||
|
|
||||||
import android.content.*;
|
import android.content.*;
|
||||||
import android.os.*;
|
|
||||||
import android.support.annotation.*;
|
import android.support.annotation.*;
|
||||||
|
|
||||||
import org.isoron.uhabits.*;
|
import org.isoron.uhabits.*;
|
||||||
@@ -233,23 +232,7 @@ public class ListHabitsScreen extends BaseScreen
|
|||||||
|
|
||||||
public void toggleNightMode()
|
public void toggleNightMode()
|
||||||
{
|
{
|
||||||
if (themeSwitcher.isNightMode())
|
themeSwitcher.toggleNightMode();
|
||||||
themeSwitcher.setTheme(ThemeSwitcher.THEME_LIGHT);
|
activity.restartWithFade();
|
||||||
else themeSwitcher.setTheme(ThemeSwitcher.THEME_DARK);
|
|
||||||
|
|
||||||
refreshTheme();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void refreshTheme()
|
|
||||||
{
|
|
||||||
new Handler().postDelayed(() -> {
|
|
||||||
Intent intent = new Intent(activity, MainActivity.class);
|
|
||||||
|
|
||||||
activity.finish();
|
|
||||||
activity.overridePendingTransition(android.R.anim.fade_in,
|
|
||||||
android.R.anim.fade_out);
|
|
||||||
activity.startActivity(intent);
|
|
||||||
|
|
||||||
}, 500); // HACK: Let the menu disappear first
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import android.support.annotation.*;
|
|||||||
|
|
||||||
import org.isoron.uhabits.commands.*;
|
import org.isoron.uhabits.commands.*;
|
||||||
import org.isoron.uhabits.models.*;
|
import org.isoron.uhabits.models.*;
|
||||||
|
import org.isoron.uhabits.notifications.*;
|
||||||
|
|
||||||
import javax.inject.*;
|
import javax.inject.*;
|
||||||
|
|
||||||
@@ -32,10 +33,14 @@ public class WidgetController
|
|||||||
@NonNull
|
@NonNull
|
||||||
private final CommandRunner commandRunner;
|
private final CommandRunner commandRunner;
|
||||||
|
|
||||||
|
private NotificationTray notificationTray;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public WidgetController(@NonNull CommandRunner commandRunner)
|
public WidgetController(@NonNull CommandRunner commandRunner,
|
||||||
|
@NonNull NotificationTray notificationTray)
|
||||||
{
|
{
|
||||||
this.commandRunner = commandRunner;
|
this.commandRunner = commandRunner;
|
||||||
|
this.notificationTray = notificationTray;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onAddRepetition(@NonNull Habit habit, long timestamp)
|
public void onAddRepetition(@NonNull Habit habit, long timestamp)
|
||||||
@@ -43,6 +48,7 @@ public class WidgetController
|
|||||||
Repetition rep = habit.getRepetitions().getByTimestamp(timestamp);
|
Repetition rep = habit.getRepetitions().getByTimestamp(timestamp);
|
||||||
if (rep != null) return;
|
if (rep != null) return;
|
||||||
performToggle(habit, timestamp);
|
performToggle(habit, timestamp);
|
||||||
|
notificationTray.cancel(habit);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onRemoveRepetition(@NonNull Habit habit, long timestamp)
|
public void onRemoveRepetition(@NonNull Habit habit, long timestamp)
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ package org.isoron.uhabits.tasks;
|
|||||||
|
|
||||||
import android.support.annotation.*;
|
import android.support.annotation.*;
|
||||||
|
|
||||||
|
import com.google.auto.factory.*;
|
||||||
|
|
||||||
import org.isoron.uhabits.io.*;
|
import org.isoron.uhabits.io.*;
|
||||||
import org.isoron.uhabits.models.*;
|
import org.isoron.uhabits.models.*;
|
||||||
import org.isoron.uhabits.utils.*;
|
import org.isoron.uhabits.utils.*;
|
||||||
@@ -28,6 +30,7 @@ import org.isoron.uhabits.utils.*;
|
|||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
@AutoFactory(allowSubclasses = true)
|
||||||
public class ExportCSVTask implements Task
|
public class ExportCSVTask implements Task
|
||||||
{
|
{
|
||||||
private String archiveFilename;
|
private String archiveFilename;
|
||||||
@@ -41,7 +44,7 @@ public class ExportCSVTask implements Task
|
|||||||
@NonNull
|
@NonNull
|
||||||
private final HabitList habitList;
|
private final HabitList habitList;
|
||||||
|
|
||||||
public ExportCSVTask(@NonNull HabitList habitList,
|
public ExportCSVTask(@Provided @NonNull HabitList habitList,
|
||||||
@NonNull List<Habit> selectedHabits,
|
@NonNull List<Habit> selectedHabits,
|
||||||
@NonNull Listener listener)
|
@NonNull Listener listener)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import org.isoron.uhabits.io.*;
|
|||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|
||||||
@AutoFactory
|
@AutoFactory(allowSubclasses = true)
|
||||||
public class ImportDataTask implements Task
|
public class ImportDataTask implements Task
|
||||||
{
|
{
|
||||||
public static final int FAILED = 3;
|
public static final int FAILED = 3;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
tools:context=".MainActivity">
|
tools:context=".MainActivity">
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_add"
|
android:id="@+id/actionAdd"
|
||||||
android:icon="?iconAdd"
|
android:icon="?iconAdd"
|
||||||
android:title="@string/add_habit"
|
android:title="@string/add_habit"
|
||||||
app:showAsAction="ifRoom"/>
|
app:showAsAction="ifRoom"/>
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
app:showAsAction="ifRoom">
|
app:showAsAction="ifRoom">
|
||||||
<menu>
|
<menu>
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_show_archived"
|
android:id="@+id/actionShowArchived"
|
||||||
android:checkable="true"
|
android:checkable="true"
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:title="@string/show_archived"/>
|
android:title="@string/show_archived"/>
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
</item>
|
</item>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_night_mode"
|
android:id="@+id/actionToggleNightMode"
|
||||||
android:checkable="true"
|
android:checkable="true"
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:orderInCategory="50"
|
android:orderInCategory="50"
|
||||||
@@ -57,19 +57,19 @@
|
|||||||
app:showAsAction="never"/>
|
app:showAsAction="never"/>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_settings"
|
android:id="@+id/actionSettings"
|
||||||
android:orderInCategory="100"
|
android:orderInCategory="100"
|
||||||
android:title="@string/action_settings"
|
android:title="@string/action_settings"
|
||||||
app:showAsAction="never"/>
|
app:showAsAction="never"/>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_faq"
|
android:id="@+id/actionFAQ"
|
||||||
android:orderInCategory="100"
|
android:orderInCategory="100"
|
||||||
android:title="@string/help"
|
android:title="@string/help"
|
||||||
app:showAsAction="never"/>
|
app:showAsAction="never"/>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_about"
|
android:id="@+id/actionAbout"
|
||||||
android:orderInCategory="100"
|
android:orderInCategory="100"
|
||||||
android:title="@string/about"
|
android:title="@string/about"
|
||||||
app:showAsAction="never"/>
|
app:showAsAction="never"/>
|
||||||
|
|||||||
@@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 Á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.activities.habits.list;
|
||||||
|
|
||||||
|
import org.isoron.uhabits.*;
|
||||||
|
import org.isoron.uhabits.activities.*;
|
||||||
|
import org.isoron.uhabits.activities.habits.list.model.*;
|
||||||
|
import org.isoron.uhabits.commands.*;
|
||||||
|
import org.isoron.uhabits.models.*;
|
||||||
|
import org.isoron.uhabits.preferences.*;
|
||||||
|
import org.isoron.uhabits.tasks.*;
|
||||||
|
import org.isoron.uhabits.utils.*;
|
||||||
|
import org.isoron.uhabits.widgets.*;
|
||||||
|
import org.junit.*;
|
||||||
|
|
||||||
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
|
public class ListHabitsControllerTest extends BaseUnitTest
|
||||||
|
{
|
||||||
|
|
||||||
|
private ListHabitsController controller;
|
||||||
|
|
||||||
|
private ImportDataTaskFactory importTaskFactory;
|
||||||
|
|
||||||
|
private BaseSystem system;
|
||||||
|
|
||||||
|
private CommandRunner commandRunner;
|
||||||
|
|
||||||
|
private HabitCardListAdapter adapter;
|
||||||
|
|
||||||
|
private ListHabitsScreen screen;
|
||||||
|
|
||||||
|
private Preferences prefs;
|
||||||
|
|
||||||
|
private ReminderScheduler reminderScheduler;
|
||||||
|
|
||||||
|
private SingleThreadTaskRunner taskRunner;
|
||||||
|
|
||||||
|
private WidgetUpdater widgetUpdater;
|
||||||
|
|
||||||
|
private ExportCSVTaskFactory exportCSVFactory;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUp()
|
||||||
|
{
|
||||||
|
super.setUp();
|
||||||
|
|
||||||
|
habitList = mock(HabitList.class);
|
||||||
|
system = mock(BaseSystem.class);
|
||||||
|
commandRunner = mock(CommandRunner.class);
|
||||||
|
adapter = mock(HabitCardListAdapter.class);
|
||||||
|
screen = mock(ListHabitsScreen.class);
|
||||||
|
prefs = mock(Preferences.class);
|
||||||
|
reminderScheduler = mock(ReminderScheduler.class);
|
||||||
|
taskRunner = new SingleThreadTaskRunner();
|
||||||
|
widgetUpdater = mock(WidgetUpdater.class);
|
||||||
|
importTaskFactory = mock(ImportDataTaskFactory.class);
|
||||||
|
exportCSVFactory = mock(ExportCSVTaskFactory.class);
|
||||||
|
|
||||||
|
controller =
|
||||||
|
spy(new ListHabitsController(system, commandRunner, habitList,
|
||||||
|
adapter, screen, prefs, reminderScheduler, taskRunner,
|
||||||
|
widgetUpdater, importTaskFactory, exportCSVFactory));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnHabitClick()
|
||||||
|
{
|
||||||
|
Habit h = mock(Habit.class);
|
||||||
|
controller.onHabitClick(h);
|
||||||
|
verify(screen).showHabitScreen(h);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnHabitReorder()
|
||||||
|
{
|
||||||
|
Habit from = mock(Habit.class);
|
||||||
|
Habit to = mock(Habit.class);
|
||||||
|
controller.onHabitReorder(from, to);
|
||||||
|
verify(habitList).reorder(from, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onInvalidToggle()
|
||||||
|
{
|
||||||
|
controller.onInvalidToggle();
|
||||||
|
verify(screen).showMessage(R.string.long_press_to_toggle);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onStartup_notFirstLaunch()
|
||||||
|
{
|
||||||
|
when(prefs.isFirstRun()).thenReturn(false);
|
||||||
|
controller.onStartup();
|
||||||
|
verify(prefs).incrementLaunchCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onStartup_firstLaunch()
|
||||||
|
{
|
||||||
|
long today = DateUtils.getStartOfToday();
|
||||||
|
|
||||||
|
when(prefs.isFirstRun()).thenReturn(true);
|
||||||
|
controller.onStartup();
|
||||||
|
verify(prefs).setFirstRun(false);
|
||||||
|
verify(prefs).updateLastHint(-1, today);
|
||||||
|
verify(screen).showIntroScreen();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,174 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 Á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.activities.habits.list;
|
||||||
|
|
||||||
|
import android.view.*;
|
||||||
|
|
||||||
|
import org.isoron.uhabits.*;
|
||||||
|
import org.isoron.uhabits.activities.*;
|
||||||
|
import org.isoron.uhabits.activities.habits.list.model.*;
|
||||||
|
import org.isoron.uhabits.models.*;
|
||||||
|
import org.isoron.uhabits.preferences.*;
|
||||||
|
import org.junit.*;
|
||||||
|
import org.mockito.*;
|
||||||
|
|
||||||
|
import static junit.framework.Assert.*;
|
||||||
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
|
public class ListHabitsMenuTest extends BaseUnitTest
|
||||||
|
{
|
||||||
|
private BaseActivity activity;
|
||||||
|
|
||||||
|
private ListHabitsScreen screen;
|
||||||
|
|
||||||
|
private HabitCardListAdapter adapter;
|
||||||
|
|
||||||
|
private Preferences preferences;
|
||||||
|
|
||||||
|
private ThemeSwitcher themeSwitcher;
|
||||||
|
|
||||||
|
private ListHabitsMenu menu;
|
||||||
|
|
||||||
|
private ArgumentCaptor<HabitMatcher> matcherCaptor;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUp()
|
||||||
|
{
|
||||||
|
super.setUp();
|
||||||
|
|
||||||
|
activity = mock(BaseActivity.class);
|
||||||
|
screen = mock(ListHabitsScreen.class);
|
||||||
|
adapter = mock(HabitCardListAdapter.class);
|
||||||
|
preferences = mock(Preferences.class);
|
||||||
|
themeSwitcher = mock(ThemeSwitcher.class);
|
||||||
|
|
||||||
|
when(preferences.getShowArchived()).thenReturn(false);
|
||||||
|
when(preferences.getShowCompleted()).thenReturn(false);
|
||||||
|
when(themeSwitcher.isNightMode()).thenReturn(false);
|
||||||
|
|
||||||
|
menu = new ListHabitsMenu(activity, screen, adapter, preferences,
|
||||||
|
themeSwitcher);
|
||||||
|
|
||||||
|
matcherCaptor = ArgumentCaptor.forClass(HabitMatcher.class);
|
||||||
|
|
||||||
|
reset(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnCreate()
|
||||||
|
{
|
||||||
|
MenuItem nightModeItem = mock(MenuItem.class);
|
||||||
|
MenuItem showArchivedItem = mock(MenuItem.class);
|
||||||
|
MenuItem showCompletedItem = mock(MenuItem.class);
|
||||||
|
Menu androidMenu = mock(Menu.class);
|
||||||
|
when(androidMenu.findItem(R.id.actionToggleNightMode)).thenReturn(
|
||||||
|
nightModeItem);
|
||||||
|
when(androidMenu.findItem(R.id.actionShowArchived)).thenReturn
|
||||||
|
(showArchivedItem);
|
||||||
|
when(androidMenu.findItem(R.id.actionShowCompleted)).thenReturn
|
||||||
|
(showCompletedItem);
|
||||||
|
|
||||||
|
menu.onCreate(androidMenu);
|
||||||
|
verify(nightModeItem).setChecked(false);
|
||||||
|
verify(showArchivedItem).setChecked(false);
|
||||||
|
verify(showCompletedItem).setChecked(false);
|
||||||
|
reset(nightModeItem, showArchivedItem, showCompletedItem);
|
||||||
|
|
||||||
|
when(themeSwitcher.isNightMode()).thenReturn(true);
|
||||||
|
menu.onCreate(androidMenu);
|
||||||
|
verify(nightModeItem).setChecked(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnSelected_about()
|
||||||
|
{
|
||||||
|
onItemSelected(R.id.actionAbout);
|
||||||
|
verify(screen).showAboutScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnSelected_add()
|
||||||
|
{
|
||||||
|
onItemSelected(R.id.actionAdd);
|
||||||
|
verify(screen).showCreateHabitScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnSelected_faq()
|
||||||
|
{
|
||||||
|
onItemSelected(R.id.actionFAQ);
|
||||||
|
verify(screen).showFAQScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnSelected_nightMode()
|
||||||
|
{
|
||||||
|
onItemSelected(R.id.actionToggleNightMode);
|
||||||
|
verify(screen).toggleNightMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnSelected_settings()
|
||||||
|
{
|
||||||
|
onItemSelected(R.id.actionSettings);
|
||||||
|
verify(screen).showSettingsScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnSelected_showArchived()
|
||||||
|
{
|
||||||
|
onItemSelected(R.id.actionShowArchived);
|
||||||
|
verify(preferences).setShowArchived(true);
|
||||||
|
verify(adapter).setFilter(matcherCaptor.capture());
|
||||||
|
verify(adapter).refresh();
|
||||||
|
assertTrue(matcherCaptor.getValue().isArchivedAllowed());
|
||||||
|
reset(adapter);
|
||||||
|
|
||||||
|
onItemSelected(R.id.actionShowArchived);
|
||||||
|
verify(preferences).setShowArchived(false);
|
||||||
|
verify(adapter).setFilter(matcherCaptor.capture());
|
||||||
|
verify(adapter).refresh();
|
||||||
|
assertFalse(matcherCaptor.getValue().isArchivedAllowed());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnSelected_showCompleted()
|
||||||
|
{
|
||||||
|
onItemSelected(R.id.actionShowCompleted);
|
||||||
|
verify(preferences).setShowCompleted(true);
|
||||||
|
verify(adapter).setFilter(matcherCaptor.capture());
|
||||||
|
verify(adapter).refresh();
|
||||||
|
assertTrue(matcherCaptor.getValue().isCompletedAllowed());
|
||||||
|
reset(adapter);
|
||||||
|
|
||||||
|
onItemSelected(R.id.actionShowCompleted);
|
||||||
|
verify(preferences).setShowCompleted(false);
|
||||||
|
verify(adapter).setFilter(matcherCaptor.capture());
|
||||||
|
verify(adapter).refresh();
|
||||||
|
assertFalse(matcherCaptor.getValue().isCompletedAllowed());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onItemSelected(int actionId)
|
||||||
|
{
|
||||||
|
MenuItem item = mock(MenuItem.class);
|
||||||
|
when(item.getItemId()).thenReturn(actionId);
|
||||||
|
menu.onItemSelected(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -76,6 +76,8 @@ public class ListHabitsScreenTest extends BaseUnitTest
|
|||||||
|
|
||||||
private ThemeSwitcher themeSwitcher;
|
private ThemeSwitcher themeSwitcher;
|
||||||
|
|
||||||
|
private ListHabitsScreen baseScreen;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@Override
|
@Override
|
||||||
public void setUp()
|
public void setUp()
|
||||||
@@ -94,11 +96,12 @@ public class ListHabitsScreenTest extends BaseUnitTest
|
|||||||
colorPickerDialogFactory = mock(ColorPickerDialogFactory.class);
|
colorPickerDialogFactory = mock(ColorPickerDialogFactory.class);
|
||||||
editHabitDialogFactory = mock(EditHabitDialogFactory.class);
|
editHabitDialogFactory = mock(EditHabitDialogFactory.class);
|
||||||
|
|
||||||
screen =
|
screen = spy(new ListHabitsScreen(activity, commandRunner, dirFinder,
|
||||||
new ListHabitsScreen(activity, commandRunner, dirFinder, rootView,
|
rootView, intentFactory, themeSwitcher, confirmDeleteDialogFactory,
|
||||||
intentFactory, themeSwitcher, confirmDeleteDialogFactory,
|
createHabitDialogFactory, filePickerDialogFactory,
|
||||||
createHabitDialogFactory, filePickerDialogFactory,
|
colorPickerDialogFactory, editHabitDialogFactory));
|
||||||
colorPickerDialogFactory, editHabitDialogFactory);
|
|
||||||
|
doNothing().when(screen).showMessage(anyInt());
|
||||||
|
|
||||||
controller = mock(ListHabitsController.class);
|
controller = mock(ListHabitsController.class);
|
||||||
screen.setController(controller);
|
screen.setController(controller);
|
||||||
@@ -139,12 +142,12 @@ public class ListHabitsScreenTest extends BaseUnitTest
|
|||||||
verify(controller).onExportDB();
|
verify(controller).onExportDB();
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Test
|
@Test
|
||||||
// public void testOnResult_importData()
|
public void testOnResult_importData()
|
||||||
// {
|
{
|
||||||
// screen.onResult(0, ListHabitsScreen.RESULT_IMPORT_DATA, null);
|
screen.onResult(0, ListHabitsScreen.RESULT_IMPORT_DATA, null);
|
||||||
// testShowImportScreen();
|
testShowImportScreen();
|
||||||
// }
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testShowAboutScreen() throws Exception
|
public void testShowAboutScreen() throws Exception
|
||||||
@@ -225,12 +228,13 @@ public class ListHabitsScreenTest extends BaseUnitTest
|
|||||||
verify(activity).showDialog(dialog);
|
verify(activity).showDialog(dialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Test
|
@Test
|
||||||
// public void testShowImportScreen_withInvalidPath()
|
public void testShowImportScreen_withInvalidPath()
|
||||||
// {
|
{
|
||||||
// when(dirFinder.findStorageDir(any())).thenReturn(null);
|
when(dirFinder.findStorageDir(any())).thenReturn(null);
|
||||||
// screen.showImportScreen();
|
screen.showImportScreen();
|
||||||
// }
|
verify(screen).showMessage(R.string.could_not_import);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testShowIntroScreen()
|
public void testShowIntroScreen()
|
||||||
@@ -247,4 +251,35 @@ public class ListHabitsScreenTest extends BaseUnitTest
|
|||||||
screen.showSettingsScreen();
|
screen.showSettingsScreen();
|
||||||
verify(activity).startActivityForResult(eq(intent), anyInt());
|
verify(activity).startActivityForResult(eq(intent), anyInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testToggleNightMode()
|
||||||
|
{
|
||||||
|
screen.toggleNightMode();
|
||||||
|
verify(themeSwitcher).toggleNightMode();
|
||||||
|
verify(activity).restartWithFade();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnAttached()
|
||||||
|
{
|
||||||
|
screen.onAttached();
|
||||||
|
verify(commandRunner).addListener(screen);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnDetach()
|
||||||
|
{
|
||||||
|
screen.onDettached();
|
||||||
|
verify(commandRunner).removeListener(screen);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnCommand()
|
||||||
|
{
|
||||||
|
Command c = mock(Command.class);
|
||||||
|
when(c.getExecuteStringId()).thenReturn(R.string.toast_habit_deleted);
|
||||||
|
screen.onCommandExecuted(c, null);
|
||||||
|
verify(screen).showMessage(R.string.toast_habit_deleted);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -22,6 +22,7 @@ package org.isoron.uhabits.receivers;
|
|||||||
import org.isoron.uhabits.*;
|
import org.isoron.uhabits.*;
|
||||||
import org.isoron.uhabits.commands.*;
|
import org.isoron.uhabits.commands.*;
|
||||||
import org.isoron.uhabits.models.*;
|
import org.isoron.uhabits.models.*;
|
||||||
|
import org.isoron.uhabits.notifications.*;
|
||||||
import org.isoron.uhabits.utils.*;
|
import org.isoron.uhabits.utils.*;
|
||||||
import org.junit.*;
|
import org.junit.*;
|
||||||
|
|
||||||
@@ -40,6 +41,8 @@ public class WidgetControllerTest extends BaseUnitTest
|
|||||||
|
|
||||||
private long today;
|
private long today;
|
||||||
|
|
||||||
|
private NotificationTray notificationTray;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setUp()
|
public void setUp()
|
||||||
{
|
{
|
||||||
@@ -48,7 +51,8 @@ public class WidgetControllerTest extends BaseUnitTest
|
|||||||
today = DateUtils.getStartOfToday();
|
today = DateUtils.getStartOfToday();
|
||||||
habit = fixtures.createEmptyHabit();
|
habit = fixtures.createEmptyHabit();
|
||||||
commandRunner = mock(CommandRunner.class);
|
commandRunner = mock(CommandRunner.class);
|
||||||
controller = new WidgetController(commandRunner);
|
notificationTray = mock(NotificationTray.class);
|
||||||
|
controller = new WidgetController(commandRunner, notificationTray);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -68,6 +72,7 @@ public class WidgetControllerTest extends BaseUnitTest
|
|||||||
assertThat(todayValue, equalTo(UNCHECKED));
|
assertThat(todayValue, equalTo(UNCHECKED));
|
||||||
controller.onAddRepetition(habit, today);
|
controller.onAddRepetition(habit, today);
|
||||||
verify(commandRunner).execute(any(), anyLong());
|
verify(commandRunner).execute(any(), anyLong());
|
||||||
|
verify(notificationTray).cancel(habit);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user