/*
* Copyright 2017 Gabor Varadi
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.zhuinden.simplestack;
import android.os.Parcel;
import android.os.Parcelable;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class StateChangerTest {
private static class TestStateChanger
implements StateChanger {
private List<Object> originalState;
private List<Object> newState;
@Override
public void handleStateChange(StateChange stateChange, Callback completionCallback) {
originalState = stateChange.getPreviousState();
newState = stateChange.getNewState();
completionCallback.stateChangeComplete();
}
}
private static class A
implements Parcelable {
public A() {
}
protected A(Parcel in) {
}
public static final Creator<A> CREATOR = new Creator<A>() {
@Override
public A createFromParcel(Parcel in) {
return new A(in);
}
@Override
public A[] newArray(int size) {
return new A[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
}
@Override
public int hashCode() {
return A.class.hashCode();
}
@Override
public boolean equals(Object obj) {
if(obj == null) {
return false;
}
return obj instanceof A;
}
}
private static class B
implements Parcelable {
public B() {
}
protected B(Parcel in) {
}
public static final Creator<B> CREATOR = new Creator<B>() {
@Override
public B createFromParcel(Parcel in) {
return new B(in);
}
@Override
public B[] newArray(int size) {
return new B[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
}
@Override
public int hashCode() {
return B.class.hashCode();
}
@Override
public boolean equals(Object obj) {
if(obj == null) {
return false;
}
return obj instanceof B;
}
}
private static class C
implements Parcelable {
public C() {
}
protected C(Parcel in) {
}
public static final Creator<C> CREATOR = new Creator<C>() {
@Override
public C createFromParcel(Parcel in) {
return new C(in);
}
@Override
public C[] newArray(int size) {
return new C[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
}
@Override
public int hashCode() {
return C.class.hashCode();
}
@Override
public boolean equals(Object obj) {
if(obj == null) {
return false;
}
return obj instanceof C;
}
}
private static class D
implements Parcelable {
public D() {
}
protected D(Parcel in) {
}
public static final Creator<D> CREATOR = new Creator<D>() {
@Override
public D createFromParcel(Parcel in) {
return new D(in);
}
@Override
public D[] newArray(int size) {
return new D[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
}
@Override
public int hashCode() {
return D.class.hashCode();
}
@Override
public boolean equals(Object obj) {
if(obj == null) {
return false;
}
return obj instanceof D;
}
}
private static class E
implements Parcelable {
public E() {
}
protected E(Parcel in) {
}
public static final Creator<E> CREATOR = new Creator<E>() {
@Override
public E createFromParcel(Parcel in) {
return new E(in);
}
@Override
public E[] newArray(int size) {
return new E[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
}
@Override
public int hashCode() {
return E.class.hashCode();
}
@Override
public boolean equals(Object obj) {
if(obj == null) {
return false;
}
return obj instanceof E;
}
}
Backstack backstack;
TestStateChanger testStateChanger;
@Before
public void before() {
backstack = new Backstack(new A(), new B(), new C(), new D());
testStateChanger = new TestStateChanger();
backstack.setStateChanger(testStateChanger, Backstack.INITIALIZE);
}
@Test
public void initialStateIsABCD()
throws Exception {
assertThat(testStateChanger.originalState).isEmpty();
assertThat(testStateChanger.newState).containsExactly(new A(), new B(), new C(), new D());
assertThat(backstack.getHistory()).containsExactlyElementsOf(testStateChanger.newState);
}
@Test
public void goToBgoestoAB() {
backstack.goTo(new B());
assertThat(testStateChanger.originalState).containsExactly(new A(), new B(), new C(), new D());
assertThat(testStateChanger.newState).containsExactly(new A(), new B());
assertThat(backstack.getHistory()).containsExactlyElementsOf(testStateChanger.newState);
}
@Test
public void goToEgoestoABCDE() {
backstack.goTo(new E());
assertThat(testStateChanger.originalState).containsExactly(new A(), new B(), new C(), new D());
assertThat(testStateChanger.newState).containsExactly(new A(), new B(), new C(), new D(), new E());
assertThat(backstack.getHistory()).containsExactlyElementsOf(testStateChanger.newState);
}
@Test
public void goBackGoesToC() {
boolean didGoBack = backstack.goBack();
assertThat(didGoBack).isTrue();
assertThat(testStateChanger.originalState).containsExactly(new A(), new B(), new C(), new D());
assertThat(testStateChanger.newState).containsExactly(new A(), new B(), new C());
assertThat(backstack.getHistory()).containsExactlyElementsOf(testStateChanger.newState);
}
@Test
public void goBackOneElementReturnsFalse() {
backstack = new Backstack(new A());
backstack.setStateChanger(testStateChanger, Backstack.INITIALIZE);
boolean didGoBack = backstack.goBack();
assertThat(didGoBack).isFalse();
}
@Test
public void setHistoryGoesToSetHistory() {
ArrayList<Object> newHistory = new ArrayList<>();
newHistory.add(new C());
newHistory.add(new B());
newHistory.add(new D());
backstack.setHistory(newHistory, StateChange.FORWARD);
assertThat(testStateChanger.originalState).containsExactly(new A(), new B(), new C(), new D());
assertThat(testStateChanger.newState).containsExactly(new C(), new B(), new D());
assertThat(backstack.getHistory()).containsExactlyElementsOf(testStateChanger.newState);
}
}