package org.infinispan.commons.configuration.attributes; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; import org.infinispan.commons.util.TypedProperties; import org.junit.Test; public class AttributeTest { @Test public void testAttributeDefinitionType() { AttributeDefinition<Long> def = AttributeDefinition.builder("long", 10l).build(); assertEquals(Long.class, def.getType()); AttributeDefinition<String> def2 = AttributeDefinition.builder("string", null, String.class).build(); assertEquals(String.class, def2.getType()); } @Test public void testAttributeSetProtection() { AttributeDefinition<String> immutable = AttributeDefinition.builder("immutable", "").immutable().build(); AttributeDefinition<String> mutable = AttributeDefinition.builder("mutable", "").build(); AttributeSet set = new AttributeSet(getClass(), immutable, mutable); set.attribute(immutable).set("an immutable string"); set.attribute(mutable).set("a mutable string"); set = set.protect(); try { set.attribute(immutable).set("this should fail"); fail("Changing an immutable attribute on a protected set should fail"); } catch (Exception e) { // Expected } set.attribute(mutable).set("this should work"); } @Test public void testAttributeChanges() { AttributeDefinition<Boolean> def = AttributeDefinition.builder("test", false).build(); Attribute<Boolean> attribute = def.toAttribute(); assertFalse(attribute.isModified()); attribute.set(true); assertEquals(true, attribute.get()); assertTrue(attribute.isModified()); } @Test public void testAttributeInitializer() { AttributeDefinition<Properties> def = AttributeDefinition.builder("props", null, Properties.class).initializer(new AttributeInitializer<Properties>() { @Override public Properties initialize() { return new Properties(); } }).build(); Attribute<Properties> attribute1 = def.toAttribute(); Attribute<Properties> attribute2 = def.toAttribute(); assertTrue(attribute1.get() != attribute2.get()); } @Test public void testDefaultAttributeCopy() { AttributeDefinition<Boolean> def = AttributeDefinition.builder("test", false).build(); AttributeSet set1 = new AttributeSet("set", def); set1.attribute(def).set(true); AttributeSet set2 = new AttributeSet("set", def); set2.read(set1); assertEquals(set1.attribute(def).get(), set2.attribute(def).get()); } @Test public void testCollectionAttributeCopy() { AttributeDefinition<TypedProperties> def = AttributeDefinition.builder("properties", null, TypedProperties.class).copier(TypedPropertiesAttributeCopier.INSTANCE).initializer(new AttributeInitializer<TypedProperties>() { @Override public TypedProperties initialize() { return new TypedProperties(); } }).build(); AttributeSet set1 = new AttributeSet("set", def); TypedProperties typedProperties = set1.attribute(def).get(); typedProperties.setProperty("key", "value"); set1.attribute(def).set(typedProperties); set1 = set1.protect(); typedProperties = set1.attribute(def).get(); typedProperties.setProperty("key", "anotherValue"); AttributeSet set2 = new AttributeSet("set", def); set2.read(set1); } @Test public void testCustomAttributeCopier() { AttributeDefinition<List<String>> def = AttributeDefinition.builder("test", Arrays.asList("a", "b")).copier(new AttributeCopier<List<String>>() { @Override public List<String> copyAttribute(List<String> attribute) { if (attribute == null) return null; else return new ArrayList(attribute); } }).build(); AttributeSet set1 = new AttributeSet("set", def); set1.attribute(def).set(Arrays.asList("b", "a")); AttributeSet set2 = new AttributeSet("set", def); set2.read(set1); assertEquals(set1.attribute(def).get(), set2.attribute(def).get()); assertFalse(set1.attribute(def).get() == set2.attribute(def).get()); } @Test public void testAttributeListener() { AttributeDefinition<Boolean> def = AttributeDefinition.builder("test", false).build(); Attribute<Boolean> attribute = def.toAttribute(); final Holder<Boolean> listenerInvoked = new Holder<>(false); attribute.addListener(new AttributeListener<Boolean>() { @Override public void attributeChanged(Attribute<Boolean> attribute, Boolean oldValue) { assertTrue(attribute.get()); assertFalse(oldValue); listenerInvoked.set(true); } }); attribute.set(true); assertTrue("Attribute listener was not invoked", listenerInvoked.get()); } static class Holder<T> { T object; Holder(T object) { this.object = object; } Holder() { this.object = null; } T get() { return object; } void set(T object) { this.object = object; } } }