| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- package org.leumasjaffe.observer;
- import static org.junit.jupiter.api.Assertions.*;
- import static org.mockito.Mockito.*;
- import java.util.function.BiConsumer;
- import java.util.function.BiFunction;
- import java.util.function.Consumer;
- import javax.swing.JFormattedTextField;
- import javax.swing.JTextField;
- import org.junit.jupiter.api.BeforeEach;
- import org.junit.jupiter.api.Test;
- import org.junit.jupiter.api.extension.ExtendWith;
- import org.mockito.Mock;
- import org.mockito.Spy;
- import org.mockito.junit.jupiter.MockitoExtension;
- @ExtendWith(MockitoExtension.class)
- class ObservableControllerTest extends SwingTestCase {
- private static class Value extends Observable.Instance {
- String str = "<INIT>";
- String get() { return str; }
- void set(String value) { this.str = value; }
- }
-
- @Spy MockObserverListener signal;
- @Mock Consumer<Value> onEmpty;
-
- @Spy Value value;
-
- @Spy JTextField component;
- @Spy JFormattedTextField formatted;
-
- @BeforeEach
- void setUp() {
- signal.setObserved(value);
- clearInvocations(signal);
- }
- @Test
- void testThrowsOnNullForAnythingButEmptyHandler() {
- assertThrows(NullPointerException.class,
- () -> ObservableController.from((JTextField) null, Value::get, Value::set));
- assertThrows(NullPointerException.class,
- () -> ObservableController.<JFormattedTextField, Value, String>from(null, Value::get, Value::set));
- assertThrows(NullPointerException.class,
- () -> ObservableController.from(component, null, Value::set));
- assertThrows(NullPointerException.class,
- () -> ObservableController.from(component, Value::get, null));
- assertThrows(NullPointerException.class,
- () -> ObservableController.from(null, (str, model) -> false, (comp, model) -> {}));
- assertThrows(NullPointerException.class,
- () -> ObservableController.from(component, (BiFunction<String, Value, Boolean>) null, (comp, model) -> {}));
- assertThrows(NullPointerException.class,
- () -> ObservableController.from(component, (str, model) -> false, null));
- assertThrows(NullPointerException.class,
- () -> ObservableController.from((JTextField) null, Value::get, Value::set, null));
- assertThrows(NullPointerException.class,
- () -> ObservableController.from(null, Value::get, Value::set, (String) null));
- assertThrows(NullPointerException.class,
- () -> ObservableController.from(component, null, Value::set, null));
- assertThrows(NullPointerException.class,
- () -> ObservableController.from(component, Value::get, null, null));
- assertThrows(NullPointerException.class,
- () -> ObservableController.from(null, (str, model) -> false, (comp, model) -> {}, null));
- assertThrows(NullPointerException.class,
- () -> ObservableController.from(component, (BiFunction<String, Value, Boolean>) null, (comp, model) -> {}, null));
- assertThrows(NullPointerException.class,
- () -> ObservableController.from(component, (str, model) -> false, null, null));
-
- assertDoesNotThrow(() -> ObservableController.from(component, Value::get, Value::set));
- assertDoesNotThrow(() -> ObservableController.from(component, Value::get, Value::set, null));
- assertDoesNotThrow(() -> ObservableController.from(component, (str, model) -> false, (comp, model) -> {}));
- assertDoesNotThrow(() -> ObservableController.from(component, (str, model) -> false, (comp, model) -> {}, null));
- assertDoesNotThrow(() -> ObservableController.<JFormattedTextField, Value, String>from(formatted, Value::get, Value::set));
- assertDoesNotThrow(() -> ObservableController.from(formatted, Value::get, Value::set, (String) null));
- }
- @Test
- void testCanLinkComponentToObjectBeanlike() {
- final ObservableListener<JTextField, Value> listener =
- ObservableController.from(component, Value::get, Value::set);
-
- listener.setObserved(value);
-
- verify(component).setText("<INIT>");
-
- component.setText("Hello");
- waitForSwing();
-
- verify(value).set(eq("Hello"));
- verify(signal).updateWasSignalled();
- }
-
- @Test
- void testWillNotSignalOnNonChangingOperation() {
- final ObservableListener<JTextField, Value> listener =
- ObservableController.from(component, Value::get, Value::set);
-
- listener.setObserved(value);
-
- component.setText("<INIT>");
- waitForSwing();
-
- verify(signal, never()).updateWasSignalled();
- verify(value, never()).set(eq("<INIT>"));
- }
-
- @Test
- void testWillNotFireUpdateIfModelHasNotChanged() {
- final ObservableListener<JTextField, Value> listener =
- ObservableController.from(component, Value::get, Value::set);
-
- listener.setObserved(value);
-
- ObserverDispatch.notifySubscribers(value);
-
- verify(component, times(1)).setText("<INIT>");
- }
-
- @Test
- void testByDefaultWeIgnoreEmptyString() {
- final ObservableListener<JTextField, Value> listener =
- ObservableController.from(component, Value::get, Value::set);
-
- listener.setObserved(value);
-
- component.setText("");
- waitForSwing();
- verify(value, never()).set(eq(""));
- verify(signal, never()).updateWasSignalled();
- }
-
- @Test
- void testCanProvideEmptyStringHandler() {
- final ObservableListener<JTextField, Value> listener =
- ObservableController.from(component, Value::get, Value::set,
- onEmpty);
-
- listener.setObserved(value);
-
- component.setText("");
- waitForSwing();
- verify(onEmpty).accept(same(value));
- verify(signal, never()).updateWasSignalled();
- }
-
- @Test
- void testIfUpdateModelReturnsFalseThenWeDontSignal() {
- final ObservableListener<JTextField, Value> listener =
- ObservableController.from(component, (str, model) -> false,
- (comp, model) -> {});
-
- listener.setObserved(value);
- component.setText("Something");
- waitForSwing();
-
- verify(signal, never()).updateWasSignalled();
- }
-
- @Test
- void testIfUpdateModelReturnsTrueThenWeSignal() {
- final ObservableListener<JTextField, Value> listener =
- ObservableController.from(component, (str, model) -> true,
- (comp, model) -> {});
-
- listener.setObserved(value);
-
- component.setText("Something");
- waitForSwing();
-
- verify(signal).updateWasSignalled();
- }
-
- @Test
- void testIfSignalledThenConsumerIsInvoked() {
- @SuppressWarnings("unchecked")
- BiConsumer<JTextField, Value> updateComp = mock(BiConsumer.class);
- final ObservableListener<JTextField, Value> listener =
- ObservableController.from(component, (str, model) -> false,
- updateComp);
-
- listener.setObserved(value);
- ObserverDispatch.notifySubscribers(value);
- verify(updateComp, times(2)).accept(same(component), same(value));
- }
- @Test
- void testFormattedAffectValueOverText() {
- final ObservableListener<JFormattedTextField, Value> listener =
- ObservableController.<JFormattedTextField, Value, String>from(
- formatted, Value::get, Value::set);
- listener.setObserved(value);
- value.set("1");
- ObserverDispatch.notifySubscribers(value);
- verify(formatted).setValue(eq("1"));
- }
- @Test
- void testFormattedManipulatingTextDoesntPropogate() {
- final ObservableListener<JFormattedTextField, Value> listener =
- ObservableController.<JFormattedTextField, Value, String>from(
- formatted, Value::get, Value::set);
- listener.setObserved(value);
- formatted.setText("1");
- waitForSwing();
- verify(value, never()).set(eq("1"));
- }
- @Test
- void testFormattedManipulatingValuePropogates() {
- final ObservableListener<JFormattedTextField, Value> listener =
- ObservableController.<JFormattedTextField, Value, String>from(
- formatted, Value::get, Value::set);
- listener.setObserved(value);
- formatted.setValue("1");
- waitForSwing();
- verify(value).set(eq("1"));
- }
- @Test
- void testFormattedManipulatingValueDoesNothingWhenEqual() {
- final ObservableListener<JFormattedTextField, Value> listener =
- ObservableController.<JFormattedTextField, Value, String>from(
- formatted, Value::get, Value::set);
- listener.setObserved(value);
- formatted.setValue("<INIT>");
- waitForSwing();
- verify(value, never()).set(any());
- }
- @Test
- void testFormattedManipulatingModelDoesNothingWhenEqual() {
- final ObservableListener<JFormattedTextField, Value> listener =
- ObservableController.<JFormattedTextField, Value, String>from(
- formatted, Value::get, Value::set);
- listener.setObserved(value);
- clearInvocations(formatted);
- ObserverDispatch.notifySubscribers(value);
- verify(formatted, never()).setValue(any());
- }
-
- @Test
- void testFormattedCanProvideEmptyStringHandler() {
- final ObservableListener<JFormattedTextField, Value> listener =
- ObservableController.from(formatted, Value::get, Value::set,
- onEmpty);
-
- listener.setObserved(value);
-
- formatted.setValue("");
- waitForSwing();
- verify(onEmpty).accept(same(value));
- verify(signal, never()).updateWasSignalled();
- }
-
- @Test
- void testFormattedCanProvideDefaultValueOnEmpty() {
- final ObservableListener<JFormattedTextField, Value> listener =
- ObservableController.from(formatted, Value::get, Value::set,
- "<DEFAULT>");
-
- listener.setObserved(value);
-
- formatted.setValue("");
- waitForSwing();
- verify(signal, never()).updateWasSignalled();
- verify(value).set(eq("<DEFAULT>"));
- verify(value, never()).set(eq(""));
- }
- }
|