/*
* 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.espresso;
import android.support.test.espresso.*;
import android.support.test.espresso.contrib.*;
import org.hamcrest.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.models.*;
import java.util.*;
import static android.support.test.espresso.Espresso.*;
import static android.support.test.espresso.Espresso.pressBack;
import static android.support.test.espresso.action.ViewActions.*;
import static android.support.test.espresso.assertion.ViewAssertions.*;
import static android.support.test.espresso.matcher.RootMatchers.*;
import static android.support.test.espresso.matcher.ViewMatchers.Visibility.*;
import static android.support.test.espresso.matcher.ViewMatchers.*;
import static org.hamcrest.Matchers.*;
public class MainActivityActions
{
public static String addHabit()
{
return addHabit(false);
}
public static String addHabit(boolean openDialogs)
{
String name = "New Habit " + new Random().nextInt(1000000);
String description = "Did you perform your new habit today?";
String num = "4";
String den = "8";
onView(withId(R.id.actionAdd)).perform(click());
typeHabitData(name, description, num, den);
if (openDialogs)
{
onView(withId(R.id.buttonPickColor)).perform(click());
pressBack();
onView(withId(R.id.tvReminderTime)).perform(click());
onView(withText("Done")).perform(click());
onView(withId(R.id.tvReminderDays)).perform(click());
onView(withText("OK")).perform(click());
}
onView(withId(R.id.buttonSave)).perform(click());
onData(Matchers.allOf(is(instanceOf(Habit.class)),
HabitMatchers.withName(name))).onChildView(withId(R.id.label));
return name;
}
public static void assertHabitExists(String name)
{
List<String> names = new LinkedList<>();
names.add(name);
assertHabitsExist(names);
}
public static void assertHabitsDontExist(List<String> names)
{
for (String name : names)
onView(withId(R.id.listView)).check(matches(Matchers.not(
HabitMatchers.containsHabit(HabitMatchers.withName(name)))));
}
public static void assertHabitsExist(List<String> names)
{
for (String name : names)
onData(Matchers.allOf(is(instanceOf(Habit.class)),
HabitMatchers.withName(name))).check(matches(isDisplayed()));
}
private static void clickHiddenMenuItem(int stringId)
{
try
{
// Try the ActionMode overflow menu first
onView(allOf(withContentDescription("More options"), withParent(
withParent(withClassName(containsString("Action")))))).perform(
click());
}
catch (Exception e1)
{
// Try the toolbar overflow menu
onView(allOf(withContentDescription("More options"), withParent(
withParent(withClassName(containsString("Toolbar")))))).perform(
click());
}
onView(withText(stringId)).perform(click());
}
public static void clickMenuItem(int stringId)
{
try
{
onView(withText(stringId)).perform(click());
}
catch (Exception e1)
{
try
{
onView(withContentDescription(stringId)).perform(click());
}
catch (Exception e2)
{
clickHiddenMenuItem(stringId);
}
}
}
public static void clickSettingsItem(String text)
{
onView(withClassName(containsString("RecyclerView"))).perform(
RecyclerViewActions.actionOnItem(
hasDescendant(withText(containsString(text))), click()));
}
public static void deleteHabit(String name)
{
deleteHabits(Collections.singletonList(name));
}
public static void deleteHabits(List<String> names)
{
selectHabits(names);
clickMenuItem(R.string.delete);
onView(withText("OK")).perform(click());
assertHabitsDontExist(names);
}
public static void selectHabit(String name)
{
selectHabits(Collections.singletonList(name));
}
public static void selectHabits(List<String> names)
{
boolean first = true;
for (String name : names)
{
onData(Matchers.allOf(is(instanceOf(Habit.class)),
HabitMatchers.withName(name)))
.onChildView(withId(R.id.label))
.perform(first ? longClick() : click());
first = false;
}
}
public static void typeHabitData(String name,
String description,
String num,
String den)
{
onView(withId(R.id.tvName)).perform(replaceText(name));
onView(withId(R.id.tvDescription)).perform(replaceText(description));
try
{
onView(allOf(withId(R.id.sFrequency),
withEffectiveVisibility(VISIBLE))).perform(click());
onData(allOf(instanceOf(String.class), startsWith("Custom")))
.inRoot(isPlatformPopup())
.perform(click());
}
catch (NoMatchingViewException e)
{
// ignored
}
onView(withId(R.id.tvFreqNum)).perform(replaceText(num));
onView(withId(R.id.tvFreqDen)).perform(replaceText(den));
}
}