mirror of https://github.com/iSoron/uhabits.git
parent
de44b48dba
commit
8341956a90
@ -1,128 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.activities.habits.list
|
|
||||||
|
|
||||||
import android.view.*
|
|
||||||
import org.isoron.androidbase.activities.*
|
|
||||||
import org.isoron.uhabits.*
|
|
||||||
import org.isoron.uhabits.core.preferences.*
|
|
||||||
import org.isoron.uhabits.core.ui.*
|
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.list.*
|
|
||||||
import org.junit.*
|
|
||||||
import org.mockito.*
|
|
||||||
import org.mockito.Mockito.*
|
|
||||||
|
|
||||||
class ListHabitsMenuTest : BaseAndroidJVMTest() {
|
|
||||||
@Mock lateinit var activity: BaseActivity
|
|
||||||
@Mock lateinit var preferences: Preferences
|
|
||||||
@Mock lateinit var themeSwitcher: ThemeSwitcher
|
|
||||||
@Mock lateinit var behavior: ListHabitsMenuBehavior
|
|
||||||
lateinit var menu: ListHabitsMenu
|
|
||||||
|
|
||||||
@Before
|
|
||||||
override fun setUp() {
|
|
||||||
super.setUp()
|
|
||||||
menu = ListHabitsMenu(activity, preferences,
|
|
||||||
themeSwitcher, behavior)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testOnCreate() {
|
|
||||||
val nightModeItem = mock(MenuItem::class.java)
|
|
||||||
val hideArchivedItem = mock(MenuItem::class.java)
|
|
||||||
val hideCompletedItem = mock(MenuItem::class.java)
|
|
||||||
val androidMenu = mock(Menu::class.java)
|
|
||||||
`when`(androidMenu.findItem(R.id.actionToggleNightMode)).thenReturn(
|
|
||||||
nightModeItem)
|
|
||||||
`when`(androidMenu.findItem(R.id.actionHideArchived)).thenReturn(
|
|
||||||
hideArchivedItem)
|
|
||||||
`when`(androidMenu.findItem(R.id.actionHideCompleted)).thenReturn(
|
|
||||||
hideCompletedItem)
|
|
||||||
|
|
||||||
`when`(preferences.showArchived).thenReturn(false)
|
|
||||||
`when`(preferences.showCompleted).thenReturn(false)
|
|
||||||
`when`(themeSwitcher.isNightMode).thenReturn(false)
|
|
||||||
|
|
||||||
menu.onCreate(androidMenu)
|
|
||||||
|
|
||||||
verify(nightModeItem).isChecked = false
|
|
||||||
verify(hideArchivedItem).isChecked = true
|
|
||||||
verify(hideCompletedItem).isChecked = true
|
|
||||||
reset(nightModeItem, hideArchivedItem, hideCompletedItem)
|
|
||||||
|
|
||||||
`when`(preferences.showArchived).thenReturn(true)
|
|
||||||
`when`(preferences.showCompleted).thenReturn(true)
|
|
||||||
`when`(themeSwitcher.isNightMode).thenReturn(true)
|
|
||||||
|
|
||||||
menu.onCreate(androidMenu)
|
|
||||||
|
|
||||||
verify(nightModeItem).isChecked = true
|
|
||||||
verify(hideArchivedItem).isChecked = false
|
|
||||||
verify(hideCompletedItem).isChecked = false
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testOnSelected_about() {
|
|
||||||
onItemSelected(R.id.actionAbout)
|
|
||||||
verify(behavior).onViewAbout()
|
|
||||||
}
|
|
||||||
|
|
||||||
// @Test
|
|
||||||
// fun testOnSelected_add() {
|
|
||||||
// onItemSelected(R.id.actionAdd)
|
|
||||||
// verify(behavior).onCreateHabit()
|
|
||||||
// }
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testOnSelected_faq() {
|
|
||||||
onItemSelected(R.id.actionFAQ)
|
|
||||||
verify(behavior).onViewFAQ()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testOnSelected_nightMode() {
|
|
||||||
onItemSelected(R.id.actionToggleNightMode)
|
|
||||||
verify(behavior).onToggleNightMode()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testOnSelected_settings() {
|
|
||||||
onItemSelected(R.id.actionSettings)
|
|
||||||
verify(behavior).onViewSettings()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testOnSelected_showArchived() {
|
|
||||||
onItemSelected(R.id.actionHideArchived)
|
|
||||||
verify(behavior).onToggleShowArchived()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testOnSelected_showCompleted() {
|
|
||||||
onItemSelected(R.id.actionHideCompleted)
|
|
||||||
verify(behavior).onToggleShowCompleted()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun onItemSelected(actionId: Int) {
|
|
||||||
val item = mock(MenuItem::class.java)
|
|
||||||
`when`(item.itemId).thenReturn(actionId)
|
|
||||||
menu.onItemSelected(item)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,213 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.activities.habits.list
|
|
||||||
|
|
||||||
import android.content.*
|
|
||||||
import dagger.*
|
|
||||||
import org.isoron.androidbase.activities.*
|
|
||||||
import org.isoron.uhabits.*
|
|
||||||
import org.isoron.uhabits.activities.common.dialogs.*
|
|
||||||
import org.isoron.uhabits.activities.habits.edit.*
|
|
||||||
import org.isoron.uhabits.activities.habits.list.views.*
|
|
||||||
import org.isoron.uhabits.core.commands.*
|
|
||||||
import org.isoron.uhabits.core.models.*
|
|
||||||
import org.isoron.uhabits.core.preferences.*
|
|
||||||
import org.isoron.uhabits.core.ui.*
|
|
||||||
import org.isoron.uhabits.core.ui.callbacks.*
|
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.list.*
|
|
||||||
import org.isoron.uhabits.intents.*
|
|
||||||
import org.isoron.uhabits.tasks.*
|
|
||||||
import org.junit.*
|
|
||||||
import org.junit.runner.*
|
|
||||||
import org.mockito.*
|
|
||||||
import org.mockito.ArgumentMatchers.*
|
|
||||||
import org.mockito.Mockito.`when`
|
|
||||||
import org.mockito.Mockito.doNothing
|
|
||||||
import org.mockito.Mockito.mock
|
|
||||||
import org.mockito.Mockito.spy
|
|
||||||
import org.mockito.Mockito.verify
|
|
||||||
import org.mockito.junit.*
|
|
||||||
|
|
||||||
@RunWith(MockitoJUnitRunner::class)
|
|
||||||
class ListHabitsScreenTest : BaseAndroidJVMTest() {
|
|
||||||
@Mock lateinit var activity: BaseActivity
|
|
||||||
@Mock lateinit var habit: Habit
|
|
||||||
@Mock lateinit var intent: Intent
|
|
||||||
@Mock lateinit var rootView: ListHabitsRootView
|
|
||||||
@Mock lateinit var confirmDeleteDialogFactory: ConfirmDeleteDialogFactory
|
|
||||||
@Mock lateinit var intentFactory: IntentFactory
|
|
||||||
@Mock lateinit var colorPickerDialogFactory: ColorPickerDialogFactory
|
|
||||||
@Mock lateinit var editHabitDialogFactory: EditHabitDialogFactory
|
|
||||||
@Mock lateinit var themeSwitcher: ThemeSwitcher
|
|
||||||
@Mock lateinit var prefs: Preferences
|
|
||||||
@Mock lateinit var menu: ListHabitsMenu
|
|
||||||
@Mock lateinit var selectionMenu: ListHabitsSelectionMenu
|
|
||||||
@Mock lateinit var adapter: HabitCardListAdapter
|
|
||||||
@Mock lateinit var behavior: ListHabitsBehavior
|
|
||||||
@Mock lateinit var exportDBFactory: ExportDBTaskFactory
|
|
||||||
@Mock lateinit var importTaskFactory: ImportDataTaskFactory
|
|
||||||
@Mock lateinit var numberPickerFactory: NumberPickerFactory
|
|
||||||
|
|
||||||
lateinit var screen: ListHabitsScreen
|
|
||||||
|
|
||||||
@Before
|
|
||||||
override fun setUp() {
|
|
||||||
super.setUp()
|
|
||||||
commandRunner = mock(CommandRunner::class.java)
|
|
||||||
screen = spy(ListHabitsScreen(
|
|
||||||
activity = activity,
|
|
||||||
rootView = rootView,
|
|
||||||
commandRunner = commandRunner,
|
|
||||||
intentFactory = intentFactory,
|
|
||||||
themeSwitcher = themeSwitcher,
|
|
||||||
preferences = prefs,
|
|
||||||
confirmDeleteDialogFactory = confirmDeleteDialogFactory,
|
|
||||||
colorPickerFactory = colorPickerDialogFactory,
|
|
||||||
editHabitDialogFactory = editHabitDialogFactory,
|
|
||||||
menu = Lazy { menu },
|
|
||||||
selectionMenu = Lazy { selectionMenu },
|
|
||||||
adapter = adapter,
|
|
||||||
behavior = Lazy { behavior },
|
|
||||||
taskRunner = taskRunner,
|
|
||||||
exportDBFactory = exportDBFactory,
|
|
||||||
importTaskFactory = importTaskFactory,
|
|
||||||
numberPickerFactory = numberPickerFactory))
|
|
||||||
|
|
||||||
doNothing().`when`(screen).showMessage(anyInt())
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testApplyTheme() {
|
|
||||||
screen.applyTheme()
|
|
||||||
verify(activity).restartWithFade(ListHabitsActivity::class.java)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testOnAttached() {
|
|
||||||
screen.onAttached()
|
|
||||||
verify(commandRunner).addListener(screen)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testOnCommand() {
|
|
||||||
val c = mock(DeleteHabitsCommand::class.java)
|
|
||||||
screen.onCommandExecuted(c, null)
|
|
||||||
verify(screen).showMessage(R.string.toast_habit_deleted)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testOnDetach() {
|
|
||||||
screen.onDettached()
|
|
||||||
verify(commandRunner).removeListener(screen)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testOnResult_bugReport() {
|
|
||||||
screen.onResult(REQUEST_SETTINGS, RESULT_BUG_REPORT, null)
|
|
||||||
verify(behavior).onSendBugReport()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testOnResult_exportCSV() {
|
|
||||||
screen.onResult(REQUEST_SETTINGS, RESULT_EXPORT_CSV, null)
|
|
||||||
verify(behavior).onExportCSV()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testOnResult_importData() {
|
|
||||||
screen.onResult(REQUEST_SETTINGS, RESULT_IMPORT_DATA, null)
|
|
||||||
testShowImportScreen()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Throws(Exception::class)
|
|
||||||
fun testShowAboutScreen() {
|
|
||||||
`when`(intentFactory.startAboutActivity(activity)).thenReturn(intent)
|
|
||||||
screen.showAboutScreen()
|
|
||||||
verify(activity).startActivity(eq(intent))
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testShowColorPicker() {
|
|
||||||
val picker = mock(ColorPickerDialog::class.java)
|
|
||||||
`when`(colorPickerDialogFactory.create(999)).thenReturn(picker)
|
|
||||||
val callback = mock(OnColorPickedCallback::class.java)
|
|
||||||
|
|
||||||
screen.showColorPicker(999, callback)
|
|
||||||
|
|
||||||
verify(activity).showDialog(eq(picker), any())
|
|
||||||
verify(picker).setListener(callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testShowDeleteConfirmationScreen() {
|
|
||||||
val callback = mock(OnConfirmedCallback::class.java)
|
|
||||||
val dialog = mock(ConfirmDeleteDialog::class.java)
|
|
||||||
`when`(confirmDeleteDialogFactory.create(callback)).thenReturn(dialog)
|
|
||||||
|
|
||||||
screen.showDeleteConfirmationScreen(callback)
|
|
||||||
|
|
||||||
verify(activity).showDialog(dialog)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testShowEditHabitScreen() {
|
|
||||||
val dialog = mock(EditHabitDialog::class.java)
|
|
||||||
`when`(editHabitDialogFactory.edit(habit)).thenReturn(dialog)
|
|
||||||
screen.showEditHabitsScreen(listOf(habit))
|
|
||||||
verify(activity).showDialog(eq(dialog), any())
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testShowFAQScreen() {
|
|
||||||
`when`(intentFactory.viewFAQ(activity)).thenReturn(intent)
|
|
||||||
screen.showFAQScreen()
|
|
||||||
verify(activity).startActivity(intent)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testShowHabitScreen() {
|
|
||||||
`when`(intentFactory.startShowHabitActivity(activity, habit))
|
|
||||||
.thenReturn(intent)
|
|
||||||
screen.showHabitScreen(habit)
|
|
||||||
verify(activity).startActivity(intent)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testShowImportScreen() {
|
|
||||||
`when`(intentFactory.openDocument()).thenReturn(intent)
|
|
||||||
screen.showImportScreen()
|
|
||||||
verify(activity).startActivityForResult(intent, REQUEST_OPEN_DOCUMENT)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testShowIntroScreen() {
|
|
||||||
`when`(intentFactory.startIntroActivity(activity)).thenReturn(intent)
|
|
||||||
screen.showIntroScreen()
|
|
||||||
verify(activity).startActivity(intent)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testShowSettingsScreen() {
|
|
||||||
`when`(intentFactory.startSettingsActivity(activity)).thenReturn(intent)
|
|
||||||
screen.showSettingsScreen()
|
|
||||||
verify(activity).startActivityForResult(eq(intent), anyInt())
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,122 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2017 Álinson Santos Xavier
|
|
||||||
*
|
|
||||||
* This file is part of Loop Habit Tracker.
|
|
||||||
*
|
|
||||||
* Loop Habit Tracker is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by the
|
|
||||||
* Free Software Foundation, either version 3 of the License, or (at your
|
|
||||||
* option) any later version.
|
|
||||||
*
|
|
||||||
* Loop Habit Tracker is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
||||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program. If not, see .
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.isoron.uhabits.activities.habits.list.controllers
|
|
||||||
|
|
||||||
import dagger.*
|
|
||||||
import org.isoron.uhabits.*
|
|
||||||
import org.isoron.uhabits.activities.habits.list.*
|
|
||||||
import org.isoron.uhabits.activities.habits.list.views.*
|
|
||||||
import org.isoron.uhabits.core.models.*
|
|
||||||
import org.isoron.uhabits.core.ui.screens.habits.list.*
|
|
||||||
import org.junit.*
|
|
||||||
import org.mockito.*
|
|
||||||
import org.mockito.Mockito.*
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
class HabitCardListControllerTest : BaseAndroidJVMTest() {
|
|
||||||
private val habits = LinkedList<Habit>()
|
|
||||||
private lateinit var controller: HabitCardListController
|
|
||||||
|
|
||||||
@Mock lateinit var adapter: HabitCardListAdapter
|
|
||||||
@Mock lateinit var behavior: ListHabitsBehavior
|
|
||||||
@Mock lateinit var selectionMenu: ListHabitsSelectionMenu
|
|
||||||
|
|
||||||
@Before
|
|
||||||
override fun setUp() {
|
|
||||||
super.setUp()
|
|
||||||
`when`(adapter.observable).thenReturn(ModelObservable())
|
|
||||||
controller = HabitCardListController(adapter,
|
|
||||||
behavior,
|
|
||||||
Lazy { selectionMenu })
|
|
||||||
|
|
||||||
repeat(10) { habits.add(fixtures.createEmptyHabit()) }
|
|
||||||
for(i in 0..9) `when`(adapter.getItem(i)).thenReturn(habits[i])
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testClick_withSelection() {
|
|
||||||
controller.onItemLongClick(0)
|
|
||||||
verify(adapter).toggleSelection(0)
|
|
||||||
verify(selectionMenu).onSelectionStart()
|
|
||||||
reset(adapter, selectionMenu)
|
|
||||||
|
|
||||||
controller.onItemClick(1)
|
|
||||||
verify(adapter).toggleSelection(1)
|
|
||||||
verify(selectionMenu).onSelectionChange()
|
|
||||||
reset(adapter, selectionMenu)
|
|
||||||
|
|
||||||
controller.onItemClick(1)
|
|
||||||
verify(adapter).toggleSelection(1)
|
|
||||||
verify(selectionMenu).onSelectionChange()
|
|
||||||
reset(adapter, selectionMenu)
|
|
||||||
|
|
||||||
doReturn(true).`when`(adapter).isSelectionEmpty
|
|
||||||
controller.onItemClick(0)
|
|
||||||
verify(adapter).toggleSelection(0)
|
|
||||||
verify(selectionMenu).onSelectionFinish()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testClick_withoutSelection() {
|
|
||||||
controller.onItemClick(0)
|
|
||||||
verify(behavior).onClickHabit(habits[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testDragAndDrop_withSelection() {
|
|
||||||
controller.onItemLongClick(0)
|
|
||||||
verify(adapter).toggleSelection(0)
|
|
||||||
verify(selectionMenu).onSelectionStart()
|
|
||||||
|
|
||||||
controller.startDrag(1)
|
|
||||||
verify(selectionMenu).onSelectionChange()
|
|
||||||
verify(adapter).toggleSelection(1)
|
|
||||||
|
|
||||||
controller.drop(1, 3)
|
|
||||||
verify(behavior).onReorderHabit(habits[1], habits[3])
|
|
||||||
verify(selectionMenu).onSelectionFinish()
|
|
||||||
verify(adapter).performReorder(1, 3)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testDragAndDrop_withoutSelection_distinctPlace() {
|
|
||||||
controller.startDrag(0)
|
|
||||||
verify(selectionMenu).onSelectionStart()
|
|
||||||
verify(adapter).toggleSelection(0)
|
|
||||||
|
|
||||||
controller.drop(0, 3)
|
|
||||||
verify(behavior).onReorderHabit(habits[0], habits[3])
|
|
||||||
verify(selectionMenu).onSelectionFinish()
|
|
||||||
verify(adapter).performReorder(0, 3)
|
|
||||||
verify(adapter).clearSelection()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testLongClick_withSelection() {
|
|
||||||
controller.onItemLongClick(0)
|
|
||||||
verify(adapter).toggleSelection(0)
|
|
||||||
verify(selectionMenu).onSelectionStart()
|
|
||||||
|
|
||||||
controller.onItemLongClick(1)
|
|
||||||
verify(adapter).toggleSelection(1)
|
|
||||||
verify(selectionMenu).onSelectionChange()
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in new issue