@Test public void testValidOptions_list() throws Exception { assertThatThrownBy(() -> ConfigurationOption.integersOption() .key("test.list") .dynamic(true) .addValidOption(Arrays.asList(1, 2)) .buildWithDefault(Collections.singleton(1))) .isInstanceOf(UnsupportedOperationException.class); }
@Test public void testServiceLoaderStrategyOption() throws Exception { final ConfigurationOption<Strategy> option = ConfigurationOption.serviceLoaderStrategyOption(Strategy.class) .key("test.strategy") .dynamic(true) .buildWithDefault(new DefaultStrategyImpl()); final ConfigurationRegistry configuration = createConfiguration(Collections.singletonList(option), new SimpleSource()); assertThat(option.getValidOptions()).containsExactlyInAnyOrder(DefaultStrategyImpl.class.getName(), SpecialStrategyImpl.class.getName()); assertThat(option.getValue()).isInstanceOf(DefaultStrategyImpl.class); configuration.save("test.strategy", SpecialStrategyImpl.class.getName(), SimpleSource.NAME); assertThat(option.getValue()).isInstanceOf(SpecialStrategyImpl.class); assertThatThrownBy(() -> configuration.save("test.strategy", NoMetaInfServicesStrategyImpl.class.getName(), SimpleSource.NAME)) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("Invalid option"); }
@Test public void testEnum() throws Exception { final ConfigurationOption<TestEnum> option = ConfigurationOption.enumOption(TestEnum.class) .key("test.enum") .dynamic(true) .buildWithDefault(TestEnum.FOO); final ConfigurationRegistry configuration = createConfiguration(Collections.singletonList(option), new SimpleSource()); assertThat(option.getValidOptions()).containsExactlyInAnyOrder("FOO", "BAR"); assertThat(option.getValidOptionsLabelMap()).containsEntry("FOO", "foo").containsEntry("BAR", "bar"); assertThat(option.getValue()).isEqualTo(TestEnum.FOO); configuration.save("test.enum", "BAR", SimpleSource.NAME); assertThat(option.getValue()).isEqualTo(TestEnum.BAR); assertThatThrownBy(() -> configuration.save("test.enum", "BAZ", SimpleSource.NAME)) .isInstanceOf(IllegalArgumentException.class); }
@Test public void testOnConfigurationChanged() throws Exception { AtomicBoolean changeListenerFired = new AtomicBoolean(false); final ConfigurationOption<String> configurationOption = ConfigurationOption.stringOption() .key("foo") .dynamic(true) .addChangeListener((opt, oldValue, newValue) -> { assertEquals("foo", opt.getKey()); assertEquals("old", oldValue); assertEquals("new", newValue); changeListenerFired.set(true); throw new RuntimeException("This is an expected test exception. " + "It is thrown to test whether Configuration can cope with change listeners that throw an exception."); }).buildWithDefault("old"); final ConfigurationOptionProvider optionProvider = TestConfigurationOptionProvider.of(configurationOption); final SimpleSource configurationSource = new SimpleSource("test"); final ConfigurationRegistry config = ConfigurationRegistry.builder() .addOptionProvider(optionProvider) .addConfigSource(configurationSource) .build(); config.save("foo", "new", "test"); assertTrue(changeListenerFired.get()); }