blob: 22cd046da49ad7f12cc4ab953a9220fad1129b74 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chromecast.base;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.emptyIterable;
import static org.junit.Assert.assertThat;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.chromium.chromecast.base.Inheritance.Base;
import org.chromium.chromecast.base.Inheritance.Derived;
import java.util.ArrayList;
import java.util.List;
/**
* Tests for Observers, a utility class to construct readable objects that can be passed to
* Observable#subscribe().
*/
@RunWith(BlockJUnit4ClassRunner.class)
public class ObserversTest {
@Test
public void testOnEnterWithConsumer() {
Controller<String> controller = new Controller<>();
List<String> result = new ArrayList<>();
controller.subscribe(Observers.onEnter((String s) -> result.add(s + ": got it!")));
controller.set("thing");
assertThat(result, contains("thing: got it!"));
}
@Test
public void testOnEnterWithConsumerOfSuperclass() {
Controller<Derived> controller = new Controller<>();
List<String> result = new ArrayList<>();
Consumer<Base> consumer = (Base base) -> result.add(base.toString() + ": got it!");
// Compile error if generics are wrong.
Observer<Derived> observer = Observers.onEnter(consumer);
controller.subscribe(observer);
controller.set(new Derived());
assertThat(result, contains("Derived: got it!"));
}
@Test
public void testOnEnterMultipleActivations() {
Controller<String> controller = new Controller<>();
List<String> result = new ArrayList<>();
controller.subscribe(Observers.onEnter(s -> result.add(s.toString())));
controller.set("a");
controller.set("b");
controller.set("c");
assertThat(result, contains("a", "b", "c"));
}
@Test
public void testOnExitNotFiredIfObservableIsNotDeactivated() {
Controller<String> controller = new Controller<>();
List<String> result = new ArrayList<>();
controller.subscribe(Observers.onExit((String s) -> result.add(s + ": got it!")));
controller.set("stuff");
assertThat(result, emptyIterable());
}
@Test
public void testOnExitWithConsumer() {
Controller<String> controller = new Controller<>();
List<String> result = new ArrayList<>();
controller.subscribe(Observers.onExit((String s) -> result.add(s + ": got it!")));
controller.set("thing");
controller.reset();
assertThat(result, contains("thing: got it!"));
}
@Test
public void testOnExitWithConsumerOfSuperclass() {
Controller<Derived> controller = new Controller<>();
List<String> result = new ArrayList<>();
Consumer<Base> consumer = (Base base) -> result.add(base.toString() + ": got it!");
// Compile error if generics are wrong.
Observer<Derived> observer = Observers.onExit(consumer);
controller.subscribe(observer);
controller.set(new Derived());
controller.reset();
assertThat(result, contains("Derived: got it!"));
}
@Test
public void testOnExitMultipleActivations() {
Controller<String> controller = new Controller<>();
List<String> result = new ArrayList<>();
controller.subscribe(Observers.onExit(s -> result.add(s.toString())));
controller.set("a");
// Implicit reset causes exit handler to fire for "a".
controller.set("b");
// Implicit reset causes exit handler to fire for "b".
controller.set("c");
assertThat(result, contains("a", "b"));
}
@Test
public void testHowUsingBothOnEnterAndOnExitLooks() {
Controller<Derived> controller = new Controller<>();
List<String> result = new ArrayList<>();
controller.subscribe(Observers.onEnter((Base base) -> result.add("enter " + base)));
controller.subscribe(Observers.onExit((Base base) -> result.add("exit " + base)));
controller.set(new Derived());
controller.reset();
assertThat(result, contains("enter Derived", "exit Derived"));
}
@Test
public void testsubscribeBothWithStrings() {
Controller<String> controllerA = new Controller<>();
Controller<String> controllerB = new Controller<>();
List<String> result = new ArrayList<>();
controllerA.and(controllerB).subscribe(Observers.both((String a, String b) -> {
result.add("enter: " + a + ", " + b);
return () -> result.add("exit: " + a + ", " + b);
}));
controllerA.set("A");
controllerB.set("B");
controllerA.set("AA");
controllerB.set("BB");
assertThat(result,
contains("enter: A, B", "exit: A, B", "enter: AA, B", "exit: AA, B",
"enter: AA, BB"));
}
@Test
public void testBuildObserverWithFunctionThatTakesSuperclass() {
BiFunction<Base, Base, Scope> function = (Base a, Base b) -> {
return () -> {};
};
// Compile error if generics are wrong.
Observer<Both<Derived, Derived>> observer = Observers.both(function);
}
// Dummy class that extends Scope.
private static class SubScope implements Scope {
@Override
public void close() {}
}
@Test
public void testBuildObserverWithFunctionThatReturnsSubclassOfScope() {
SubScope subScope = new SubScope();
BiFunction<String, String, SubScope> function = (a, b) -> subScope;
// Compile error if generics are wrong.
Observer<Both<String, String>> observer = Observers.both(function);
}
}