Please conduct the following tasks alone. For implementation details you can refer to the lecture slides or the Android developer website. Please do not hesitate to ask me or the tutor if you have any questions.
Use this android ids for each row:
Example Layout:
Use this data to fill out your rows:
title | year | actor |
---|---|---|
Dr. No | 1962 | Sean Connery |
From Russia with Love | 1963 | Sean Connery |
Goldfinger | 1964 | Sean Connery |
Thunderball | 1965 | Sean Connery |
You Only Live Twice | 1967 | Sean Connery |
package de.hdmstuttgart.movietracker;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import androidx.test.espresso.contrib.RecyclerViewActions;
import androidx.test.espresso.matcher.BoundedMatcher;
import androidx.test.ext.junit.rules.ActivityScenarioRule;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.core.internal.deps.guava.base.Preconditions.checkNotNull;
import static androidx.test.espresso.matcher.ViewMatchers.hasDescendant;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
@LargeTest
@RunWith(AndroidJUnit4.class)
public class Assignment2Test {
@Rule
public ActivityScenarioRule<MainActivity> activityScenarioRule
= new ActivityScenarioRule<>(MainActivity.class);
@Test
public void mainActivityTest() {
onView(withId(R.id.homeRecyclerView))
.check(matches(atPosition(0, hasDescendant(withText("Dr. No")))));
onView(withId(R.id.homeRecyclerView))
.check(matches(atPosition(1, hasDescendant(withText("From Russia with Love")))));
onView(withId(R.id.homeRecyclerView))
.check(matches(atPosition(2, hasDescendant(withText("Goldfinger")))));
onView(withId(R.id.homeRecyclerView))
.check(matches(atPosition(3, hasDescendant(withText("Thunderball")))));
onView(withId(R.id.homeRecyclerView))
.check(matches(atPosition(4, hasDescendant(withText("You Only Live Twice")))));
onView(withId(R.id.homeRecyclerView))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
onView(withId(R.id.homeRecyclerView))
.check(matches(atPosition(0, hasDescendant(withText("From Russia with Love")))));
onView(withId(R.id.homeRecyclerView))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
onView(withId(R.id.homeRecyclerView))
.check(matches(atPosition(0, hasDescendant(withText("Goldfinger")))));
}
public static Matcher<View> atPosition(final int position, @NonNull final Matcher<View> itemMatcher) {
checkNotNull(itemMatcher);
return new BoundedMatcher<View, RecyclerView>(RecyclerView.class) {
@Override
public void describeTo(Description description) {
description.appendText("has item at position " + position + ": ");
itemMatcher.describeTo(description);
}
@Override
protected boolean matchesSafely(final RecyclerView view) {
RecyclerView.ViewHolder viewHolder = view.findViewHolderForAdapterPosition(position);
if (viewHolder == null) {
// has no item on such position
return false;
}
return itemMatcher.matches(viewHolder.itemView);
}
};
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
implementation "androidx.recyclerview:recyclerview:1.2.1"
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.4.0'
}