/*
* Copyright 2014 Avanza Bank AB
*
* 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.avanza.astrix.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import org.junit.Test;
public class DynamicPropertyListenerTest {
@Test
public void intPropertyListenersAreNotifiedWhenPropertySet() throws Exception {
PropertySpy<Integer> propertySpy = new PropertySpy<>();
DynamicIntProperty prop = new DynamicIntProperty(1);
prop.addListener(propertySpy);
propertySpy.receivesNoChange();
prop.set(2);
propertySpy.receivesProperyChangeWithValue(2);
}
@Test
public void intPropertyDoesNotNotifyUnsubscribedListeners() throws Exception {
DynamicIntProperty prop = new DynamicIntProperty(1);
PropertySpy<Integer> propertySpy = new PropertySpy<>();
prop.addListener(propertySpy);
prop.set(2);
propertySpy.receivesProperyChangeWithValue(2);
prop.removeListener(propertySpy);
prop.set(3);
propertySpy.receivesNoChange();
}
@Test
public void booleanPropertyListenersAreNotifiedWhenPropertySet() throws Exception {
PropertySpy<Boolean> propertySpy = new PropertySpy<>();
DynamicBooleanProperty prop = new DynamicBooleanProperty(false);
prop.addListener(propertySpy);
propertySpy.receivesNoChange();
prop.set(true);
propertySpy.receivesProperyChangeWithValue(true);
}
@Test
public void booleanPropertyDoesNotNotifyUnsubscribedListeners() throws Exception {
PropertySpy<Boolean> propertySpy = new PropertySpy<>();
DynamicBooleanProperty prop = new DynamicBooleanProperty(false);
prop.addListener(propertySpy);
prop.set(false);
propertySpy.receivesProperyChangeWithValue(false);
prop.removeListener(propertySpy);
prop.set(true);
propertySpy.receivesNoChange();
}
@Test
public void longPropertyListenersAreNotifiedWhenPropertySet() throws Exception {
PropertySpy<Long> propertySpy = new PropertySpy<>();
DynamicLongProperty prop = new DynamicLongProperty(1);
prop.addListener(propertySpy);
propertySpy.receivesNoChange();
prop.set(2);
propertySpy.receivesProperyChangeWithValue(2L);
}
@Test
public void longPropertyDoesNotNotifyUnsubscribedListeners() throws Exception {
PropertySpy<Long> propertySpy = new PropertySpy<>();
DynamicLongProperty prop = new DynamicLongProperty(1);
prop.addListener(propertySpy);
prop.set(2);
propertySpy.receivesProperyChangeWithValue(2L);
prop.removeListener(propertySpy);
prop.set(3);
propertySpy.receivesNoChange();
}
@Test
public void stringPropertyListenersAreNotifiedWhenPropertySet() throws Exception {
PropertySpy<String> propertySpy = new PropertySpy<>();
DynamicStringProperty prop = new DynamicStringProperty("1");
prop.addListener(propertySpy);
propertySpy.receivesNoChange();
prop.set("2");
propertySpy.receivesProperyChangeWithValue("2");
}
@Test
public void stringPropertyDoesNotNotifyUnsubscribedListeners() throws Exception {
PropertySpy<String> propertySpy = new PropertySpy<>();
DynamicStringProperty prop = new DynamicStringProperty("1");
prop.addListener(propertySpy);
prop.set("2");
propertySpy.receivesProperyChangeWithValue("2");
prop.removeListener(propertySpy);
prop.set("3");
propertySpy.receivesNoChange();
}
@Test
public void propertyListenerErrorDoesNotPropagate() throws Exception {
DynamicIntProperty prop = new DynamicIntProperty(1);
prop.addListener(new ThrowingListener<>());
prop.set(2);
}
@Test
public void propertyListenerNotifiedWhenFirstListenerFails() throws Exception {
PropertySpy<Integer> propertySpy = new PropertySpy<>();
DynamicIntProperty prop = new DynamicIntProperty(1);
prop.addListener(new ThrowingListener<>());
prop.addListener(propertySpy);
prop.set(2);
propertySpy.receivesProperyChangeWithValue(2);
}
private static class PropertySpy<T> implements DynamicPropertyListener<T> {
final Queue<T> notifiedChanges = new LinkedBlockingQueue<>();
@Override
public void propertyChanged(T newValue) {
notifiedChanges.add(newValue);
}
public void receivesProperyChangeWithValue(T expected) {
assertEquals("Last propertyChangedEvent\n", expected, notifiedChanges.poll());
}
public void receivesNoChange() {
T value = notifiedChanges.poll();
assertNull("Expected no propertyChanged event, but event with value:\n" + value, value);
}
}
private static class ThrowingListener<T> implements DynamicPropertyListener<T> {
@Override
public void propertyChanged(T newValue) {
throw new RuntimeException();
}
}
}