@@ -2,9 +2,11 @@ package com.example.util.simpletimetracker
22
33import android.view.View
44import androidx.test.espresso.Espresso.onView
5+ import androidx.test.espresso.contrib.PickerActions.setDate
56import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
67import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed
78import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA
9+ import androidx.test.espresso.matcher.ViewMatchers.withClassName
810import androidx.test.espresso.matcher.ViewMatchers.withId
911import androidx.test.espresso.matcher.ViewMatchers.withSubstring
1012import androidx.test.espresso.matcher.ViewMatchers.withText
@@ -22,12 +24,18 @@ import com.example.util.simpletimetracker.GoalsTestUtils.getMonthlyDurationGoal
2224import com.example.util.simpletimetracker.GoalsTestUtils.getSessionDurationGoal
2325import com.example.util.simpletimetracker.GoalsTestUtils.getWeeklyCountGoal
2426import com.example.util.simpletimetracker.GoalsTestUtils.getWeeklyDurationGoal
27+ import com.example.util.simpletimetracker.domain.daysOfWeek.model.DayOfWeek
2528import com.example.util.simpletimetracker.domain.recordType.extension.value
2629import com.example.util.simpletimetracker.domain.recordType.model.RecordTypeGoal
27- import com.example.util.simpletimetracker.feature_change_record.R
30+ import com.example.util.simpletimetracker.domain.statistics.model.RangeLength
31+ import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomDatePicker
2832import com.example.util.simpletimetracker.utils.BaseUiTest
2933import com.example.util.simpletimetracker.utils.NavUtils
3034import com.example.util.simpletimetracker.utils.checkViewIsDisplayed
35+ import com.example.util.simpletimetracker.utils.clickOnCurrentDate
36+ import com.example.util.simpletimetracker.utils.clickOnCurrentSelectedDate
37+ import com.example.util.simpletimetracker.utils.clickOnNextDate
38+ import com.example.util.simpletimetracker.utils.clickOnPrevDate
3139import com.example.util.simpletimetracker.utils.clickOnView
3240import com.example.util.simpletimetracker.utils.clickOnViewWithId
3341import com.example.util.simpletimetracker.utils.clickOnViewWithText
@@ -39,6 +47,7 @@ import com.example.util.simpletimetracker.utils.tryAction
3947import dagger.hilt.android.testing.HiltAndroidTest
4048import kotlinx.coroutines.runBlocking
4149import org.hamcrest.CoreMatchers.allOf
50+ import org.hamcrest.CoreMatchers.equalTo
4251import org.hamcrest.Matcher
4352import org.junit.Test
4453import org.junit.runner.RunWith
@@ -48,6 +57,8 @@ import com.example.util.simpletimetracker.feature_change_record_type.R as change
4857import com.example.util.simpletimetracker.feature_goals.R as goalsR
4958import com.example.util.simpletimetracker.feature_main.R as mainR
5059import com.example.util.simpletimetracker.feature_statistics_detail.R as featureStatisticsDetailR
60+ import java.util.Calendar
61+ import java.util.concurrent.TimeUnit
5162
5263@HiltAndroidTest
5364@RunWith(AndroidJUnit4 ::class )
@@ -346,6 +357,103 @@ class GoalsTabTest : BaseUiTest() {
346357 checkStatisticsMark(goalMonthlyCountFinished, isVisible = true )
347358 }
348359
360+ @Test
361+ fun dateSelection () {
362+ val typeName = " typeName"
363+
364+ // Add data
365+ testUtils.addActivity(
366+ name = typeName,
367+ goals = listOf (
368+ getDailyDurationGoal(durationInSeconds),
369+ getMonthlyDurationGoal(2 * durationInSeconds),
370+ ),
371+ )
372+
373+ val goalHint = getString(coreR.string.change_record_type_goal_time_hint).lowercase()
374+ val dailyGoalValue = " $goalHint - 10$minuteString "
375+ val monthlyGoalValue = " $goalHint - 20$minuteString "
376+
377+ val startOfDayShift = runBlocking { prefsInteractor.getStartOfDayShift() }
378+ val firstDayOfWeek = runBlocking { prefsInteractor.getFirstDayOfWeek() }
379+
380+ fun getRangeTitle (shift : Int , goalRange : RecordTypeGoal .Range ): String {
381+ return getRangeTitle(shift, goalRange, startOfDayShift, firstDayOfWeek)
382+ }
383+
384+ val firstDayCalendar = Calendar .getInstance().apply {
385+ set(Calendar .DAY_OF_MONTH , 1 )
386+ set(Calendar .HOUR_OF_DAY , 12 )
387+ set(Calendar .MINUTE , 0 )
388+ set(Calendar .SECOND , 0 )
389+ set(Calendar .MILLISECOND , 0 )
390+ }
391+ val firstDay = firstDayCalendar.timeInMillis
392+ val prevDay = Calendar .getInstance().apply {
393+ timeInMillis = firstDay
394+ add(Calendar .DATE , - 1 )
395+ }.timeInMillis
396+
397+ val shiftToFirstDay = timeMapper.toTimestampShift(
398+ toTime = firstDay,
399+ range = RangeLength .Day ,
400+ firstDayOfWeek = firstDayOfWeek,
401+ ).toInt()
402+
403+ val todayTitle = getRangeTitle(shift = shiftToFirstDay, goalRange = RecordTypeGoal .Range .Daily )
404+ val prevTitle = getRangeTitle(shift = shiftToFirstDay - 1 , goalRange = RecordTypeGoal .Range .Daily )
405+ val todayMonthTitle = getRangeTitle(shift = 0 , goalRange = RecordTypeGoal .Range .Monthly )
406+ val prevMonthTitle = getRangeTitle(shift = - 1 , goalRange = RecordTypeGoal .Range .Monthly )
407+
408+ testUtils.addRecord(
409+ typeName = typeName,
410+ timeStarted = firstDay,
411+ timeEnded = firstDay + TimeUnit .MINUTES .toMillis(1 ),
412+ )
413+ testUtils.addRecord(
414+ typeName = typeName,
415+ timeStarted = prevDay,
416+ timeEnded = prevDay + TimeUnit .MINUTES .toMillis(2 ),
417+ )
418+
419+ // Open goals
420+ NavUtils .openGoalsScreen()
421+ clickOnCurrentSelectedDate()
422+ onView(withClassName(equalTo(CustomDatePicker ::class .java.name))).perform(
423+ setDate(
424+ firstDayCalendar.get(Calendar .YEAR ),
425+ firstDayCalendar.get(Calendar .MONTH ) + 1 ,
426+ firstDayCalendar.get(Calendar .DAY_OF_MONTH ),
427+ ),
428+ )
429+ clickOnViewWithId(R .id.btnDateTimeDialogPositive)
430+
431+ // Check first day
432+ tryAction {
433+ checkViewIsDisplayed(
434+ allOf(withId(baseR.id.tvHintItemText), withText(todayTitle)),
435+ )
436+ }
437+ checkViewIsDisplayed(
438+ allOf(withId(baseR.id.tvHintItemText), withText(todayMonthTitle)),
439+ )
440+ checkStatisticsGoal(typeName, " 1$minuteString " , dailyGoalValue)
441+ checkStatisticsGoal(typeName, " 1$minuteString " , monthlyGoalValue)
442+
443+ // Check prev day
444+ clickOnCurrentDate(shiftToFirstDay - 1 )
445+ tryAction {
446+ checkViewIsDisplayed(
447+ allOf(withId(baseR.id.tvHintItemText), withText(prevTitle)),
448+ )
449+ }
450+ checkViewIsDisplayed(
451+ allOf(withId(baseR.id.tvHintItemText), withText(prevMonthTitle)),
452+ )
453+ checkStatisticsGoal(typeName, " 2$minuteString " , dailyGoalValue)
454+ checkStatisticsGoal(typeName, " 2$minuteString " , monthlyGoalValue)
455+ }
456+
349457 @Test
350458 fun goalNavigation () {
351459 val typeName = " typeName"
@@ -387,4 +495,18 @@ class GoalsTabTest : BaseUiTest() {
387495
388496 tryAction { scrollRecyclerToView(goalsR.id.rvGoalsList, allOf(matchers)) }
389497 }
498+
499+ private fun getRangeTitle (
500+ shift : Int ,
501+ goalRange : RecordTypeGoal .Range ,
502+ startOfDayShift : Long ,
503+ firstDayOfWeek : DayOfWeek ,
504+ ): String {
505+ return when (goalRange) {
506+ is RecordTypeGoal .Range .Session -> " "
507+ is RecordTypeGoal .Range .Daily -> timeMapper.toDayDateTitle(shift, startOfDayShift)
508+ is RecordTypeGoal .Range .Weekly -> timeMapper.toWeekDateTitle(shift, startOfDayShift, firstDayOfWeek)
509+ is RecordTypeGoal .Range .Monthly -> timeMapper.toMonthDateTitle(shift, startOfDayShift)
510+ }
511+ }
390512}
0 commit comments