Files
JIMRI/java/test/jmri/beans/ConstrainedArbitraryBeanTest.java
2026-06-17 14:00:51 +02:00

193 lines
6.7 KiB
Java

package jmri.beans;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import jmri.util.JUnitUtil;
import org.junit.jupiter.api.*;
/**
* @author Randall Wood Copyright 2020
*/
public class ConstrainedArbitraryBeanTest {
private ConstrainedArbitraryBeanImpl bean;
private VetoableChangeListener vetoer;
private boolean changed;
private boolean veto;
private static final String AP = "arbitraryProperty";
private static final String DP = "definedProperty";
private static final String AIP = "arbitraryIndexedProperty";
private static final String DIP = "definedIndexedProperty";
@BeforeEach
public void setUp() {
bean = new ConstrainedArbitraryBeanImpl();
changed = false;
vetoer = (e -> {
if (!veto) {
changed = true;
} else {
veto = false;
throw new PropertyVetoException("veto", e);
}
});
JUnitUtil.setUp();
}
@AfterEach
public void tearDown() {
bean = null;
JUnitUtil.tearDown();
}
/**
* Test of setProperty method, of class ConstrainedArbitraryBean.
*/
@Test
public void testSetProperty() {
bean.addVetoableChangeListener(vetoer);
assertThat(changed).isFalse();
assertThat(bean.hasProperty(AP)).isFalse();
assertThat(bean.hasProperty(DP)).isTrue();
assertThat(bean.getProperty(AP)).isEqualTo(null);
assertThat(bean.getProperty(DP)).isEqualTo(null);
veto = false;
assertThatCode(() -> bean.setProperty(AP, AP)).doesNotThrowAnyException();
assertThat(bean.hasProperty(AP)).isTrue();
assertThat(bean.getProperty(AP)).isEqualTo(AP);
assertThat(changed).isTrue();
assertThat(veto).isFalse();
changed = false;
veto = true;
assertThatCode(() -> bean.setProperty(AP, null)).doesNotThrowAnyException();
assertThat(bean.getProperty(AP)).isEqualTo(AP);
assertThat(changed).isFalse();
assertThat(veto).isFalse();
changed = false;
veto = false;
assertThatCode(() -> bean.setProperty(DP, DP)).doesNotThrowAnyException();
assertThat(bean.getProperty(DP)).isEqualTo(DP);
assertThat(changed).isTrue();
assertThat(veto).isFalse();
changed = false;
veto = true;
assertThatCode(() -> bean.setProperty(DP, null)).doesNotThrowAnyException();
assertThat(bean.getProperty(DP)).isEqualTo(DP);
assertThat(changed).isFalse();
assertThat(veto).isFalse();
}
/**
* Test of setIndexedProperty method, of class ConstrainedArbitraryBean.
*/
@Test
public void testSetIndexedProperty() {
bean.addVetoableChangeListener(vetoer);
assertThat(changed).isFalse();
assertThat(bean.hasIndexedProperty(AIP)).isFalse();
assertThat(bean.hasIndexedProperty(DIP)).isTrue();
assertThat(bean.getIndexedProperty(AIP, 0)).isEqualTo(null);
assertThatThrownBy(() -> bean.getIndexedProperty(DIP, 0)).isExactlyInstanceOf(IndexOutOfBoundsException.class);
veto = false;
assertThatCode(() -> bean.setIndexedProperty(AIP, 0, AIP)).doesNotThrowAnyException();
assertThat(bean.hasIndexedProperty(AIP)).isTrue();
assertThat(bean.getIndexedProperty(AIP, 0)).isEqualTo(AIP);
assertThat(changed).isTrue();
assertThat(veto).isFalse();
changed = false;
veto = true;
assertThatCode(() -> bean.setIndexedProperty(AIP, 0, null)).doesNotThrowAnyException();
assertThat(bean.getIndexedProperty(AIP, 0)).isEqualTo(AIP);
assertThat(changed).isFalse();
assertThat(veto).isFalse();
changed = false;
veto = false;
assertThatCode(() -> bean.setIndexedProperty(DIP, 0, DIP)).doesNotThrowAnyException();
assertThat(bean.getIndexedProperty(DIP, 0)).isEqualTo(DIP);
assertThat(changed).isTrue();
assertThat(veto).isFalse();
changed = false;
veto = true;
assertThatCode(() -> bean.setIndexedProperty(DIP, 0, null)).doesNotThrowAnyException();
assertThat(bean.getIndexedProperty(DIP, 0)).isEqualTo(DIP);
assertThat(changed).isFalse();
assertThat(veto).isFalse();
}
@Test
public void testGetPropertyNames() {
assertThat(bean.getPropertyNames())
.contains(DP, DIP)
.doesNotContain(AP, AIP);
bean.setProperty(AP, null);
assertThat(bean.getPropertyNames())
.contains(DP, DIP, AP)
.doesNotContain(AIP);
bean.setIndexedProperty(AIP, 0, null);
assertThat(bean.getPropertyNames())
.contains(DP, DIP, AP, AIP);
}
@Test
public void testBeanImpl() {
bean.setDefinedProperty(AIP);
Assertions.assertEquals(AIP, bean.getDefinedProperty() );
String[] A_STRING_ARRAY = new String[]{AP, DP, AIP, DIP};
bean.setDefinedIndexedProperty(A_STRING_ARRAY);
Assertions.assertArrayEquals(A_STRING_ARRAY, bean.getDefinedIndexedProperty());
Assertions.assertEquals(AIP, bean.getDefinedIndexedProperty(2));
bean.setDefinedIndexedProperty(2, DIP);
Assertions.assertEquals(DIP, bean.getDefinedIndexedProperty(2));
}
private static class ConstrainedArbitraryBeanImpl extends ConstrainedArbitraryBean {
public String definedProperty;
public final List<String> definedIndexedProperty = new ArrayList<>();
public String getDefinedProperty() {
return definedProperty;
}
public void setDefinedProperty(String value) {
definedProperty = value;
}
public String[] getDefinedIndexedProperty() {
return definedIndexedProperty.toArray(new String[definedIndexedProperty.size()]);
}
public String getDefinedIndexedProperty(int i) {
return definedIndexedProperty.get(i);
}
public void setDefinedIndexedProperty(String[] values) {
definedIndexedProperty.clear();
definedIndexedProperty.addAll(Arrays.asList(values));
}
/*
* Throws IndexOutOfBoundsException if index > size.
*/
public void setDefinedIndexedProperty(int i, String value) {
if (i < definedIndexedProperty.size()) {
definedIndexedProperty.set(i, value);
} else {
definedIndexedProperty.add(i, value);
}
}
}
}