package com.zhuinden.simplestack; import android.os.Parcelable; import android.support.annotation.NonNull; import com.zhuinden.statebundle.StateBundle; import junit.framework.Assert; import org.junit.Test; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import static org.assertj.core.api.Assertions.assertThat; /** * Created by Owner on 2017. 03. 25.. */ public class BackstackManagerTest { StateChanger stateChanger = new StateChanger() { @Override public void handleStateChange(StateChange stateChange, Callback completionCallback) { completionCallback.stateChangeComplete(); } }; @Test public void afterClearAndRestorationTheInitialKeysShouldBeRestoredAndNotOverwrittenByRestoredState() { TestKey initial = new TestKey("initial"); TestKey restored = new TestKey("restored"); ArrayList<Parcelable> history = new ArrayList<>(); history.add(restored); StateBundle stateBundle = new StateBundle(); stateBundle.putParcelableArrayList(BackstackManager.getHistoryTag(), history); BackstackManager backstackManager = new BackstackManager(); backstackManager.setup(HistoryBuilder.single(initial)); backstackManager.fromBundle(stateBundle); backstackManager.setStateChanger(stateChanger); Backstack backstack = backstackManager.getBackstack(); backstack.goBack(); assertThat(backstack.getHistory()).isEmpty(); backstack.setStateChanger(stateChanger, Backstack.INITIALIZE); assertThat(backstack.getHistory()).doesNotContain(restored); assertThat(backstack.getHistory()).containsExactly(initial); } @Test public void afterClearAndRestorationTheFilteredAreNotRestored() { final TestKey initial = new TestKey("initial"); final TestKey restored = new TestKey("restored"); final TestKey filtered = new TestKey("filtered"); ArrayList<Parcelable> history = new ArrayList<>(); history.add(restored); history.add(filtered); StateBundle stateBundle = new StateBundle(); stateBundle.putParcelableArrayList(BackstackManager.getHistoryTag(), history); BackstackManager backstackManager = new BackstackManager(); backstackManager.setKeyFilter(new KeyFilter() { @NonNull @Override public List<Object> filterHistory(@NonNull List<Object> restoredKeys) { restoredKeys.remove(filtered); return restoredKeys; } }); backstackManager.setup(HistoryBuilder.single(initial)); backstackManager.fromBundle(stateBundle); backstackManager.setStateChanger(stateChanger); Backstack backstack = backstackManager.getBackstack(); assertThat(backstack.getHistory()).contains(restored); assertThat(backstack.getHistory()).doesNotContain(filtered); //// would restore properly backstackManager = new BackstackManager(); backstackManager.setup(HistoryBuilder.single(initial)); backstackManager.fromBundle(stateBundle); backstackManager.setStateChanger(stateChanger); backstack = backstackManager.getBackstack(); assertThat(backstack.getHistory()).contains(restored, filtered); //// if both are filtered, restore initial backstackManager = new BackstackManager(); backstackManager.setKeyFilter(new KeyFilter() { @NonNull @Override public List<Object> filterHistory(@NonNull List<Object> restoredKeys) { restoredKeys.remove(restored); restoredKeys.remove(filtered); return restoredKeys; } }); backstackManager.setup(HistoryBuilder.single(initial)); backstackManager.fromBundle(stateBundle); backstackManager.setStateChanger(stateChanger); backstack = backstackManager.getBackstack(); assertThat(backstack.getHistory()).doesNotContain(restored, filtered); assertThat(backstack.getHistory()).contains(initial); } @Test public void keyFilterSetAfterSetupShouldThrow() { final TestKey initial = new TestKey("initial"); BackstackManager backstackManager = new BackstackManager(); backstackManager.setup(HistoryBuilder.single(initial)); try { backstackManager.setKeyFilter(new KeyFilter() { @NonNull @Override public List<Object> filterHistory(@NonNull List<Object> restoredKeys) { return restoredKeys; } }); Assert.fail(); } catch(IllegalStateException e) { // OK! } } @Test public void stateChangeCompletionListenerIsCalledCorrectly() { final TestKey initial = new TestKey("initial"); final TestKey other = new TestKey("other"); final AtomicInteger atomicInteger = new AtomicInteger(0); final List<Integer> integers = new ArrayList<>(); BackstackManager backstackManager = new BackstackManager(); backstackManager.setup(HistoryBuilder.single(initial)); BackstackManager.StateChangeCompletionListener stateChangeCompletionListener = new BackstackManager.StateChangeCompletionListener() { @Override public void stateChangeCompleted(@NonNull StateChange stateChange) { integers.add(atomicInteger.getAndIncrement()); } }; backstackManager.addStateChangeCompletionListener(stateChangeCompletionListener); backstackManager.setStateChanger(stateChanger); backstackManager.getBackstack().goTo(other); backstackManager.getBackstack().goBack(); assertThat(integers).containsExactly(0, 1, 2); backstackManager.removeStateChangeCompletionListener(stateChangeCompletionListener); backstackManager.getBackstack().setHistory(HistoryBuilder.single(other), StateChange.REPLACE); assertThat(integers).containsExactly(0, 1, 2); backstackManager.addStateChangeCompletionListener(stateChangeCompletionListener); backstackManager.getBackstack().setHistory(HistoryBuilder.single(initial), StateChange.REPLACE); assertThat(integers).containsExactly(0, 1, 2, 3); backstackManager.removeStateChangeCompletionListener(stateChangeCompletionListener); backstackManager.getBackstack().goTo(other); assertThat(integers).containsExactly(0, 1, 2, 3); } }