blob: a15577c43169778c37de21993b98091d16bc1d95 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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
*
* https://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 org.apache.commons.configuration2.builder;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.PropertiesConfiguration;
import org.apache.commons.configuration2.event.Event;
import org.apache.commons.configuration2.event.EventType;
import org.apache.commons.configuration2.ex.ConfigurationException;
import org.junit.jupiter.api.Test;
/**
* A test class for {@code BasicConfigurationBuilder} with tests related to events fired by the builder.
*/
public class TestBasicConfigurationBuilderEvents {
/**
* Tests whether the base type for builder events is correctly configured.
*/
@Test
void testBuilderEventType() {
final EventType<ConfigurationBuilderEvent> builderEventType = ConfigurationBuilderEvent.ANY;
assertEquals(Event.ANY, builderEventType.getSuperType());
}
/**
* Tests whether builder reset events are correctly distributed.
*/
@Test
void testBuilderResetEvent() {
final BuilderEventListenerImpl listener = new BuilderEventListenerImpl();
final BasicConfigurationBuilder<PropertiesConfiguration> builder = new BasicConfigurationBuilder<>(PropertiesConfiguration.class);
builder.addEventListener(ConfigurationBuilderEvent.RESET, listener);
builder.reset();
builder.resetResult();
ConfigurationBuilderEvent event = listener.nextEvent(ConfigurationBuilderEvent.RESET);
assertSame(builder, event.getSource());
event = listener.nextEvent(ConfigurationBuilderEvent.RESET);
assertSame(builder, event.getSource());
listener.assertNoMoreEvents();
}
/**
* Tests whether the reset builder event type is correctly configured.
*/
@Test
void testBuilderResetEventType() {
final EventType<ConfigurationBuilderEvent> builderResetType = ConfigurationBuilderEvent.RESET;
assertEquals(ConfigurationBuilderEvent.ANY, builderResetType.getSuperType());
}
/**
* Tests whether a configuration request event is generated.
*/
@Test
void testConfigurationRequestEvent() throws ConfigurationException {
final BasicConfigurationBuilder<PropertiesConfiguration> builder = new BasicConfigurationBuilder<>(PropertiesConfiguration.class);
builder.getConfiguration();
final BuilderEventListenerImpl listener = new BuilderEventListenerImpl();
builder.addEventListener(ConfigurationBuilderEvent.ANY, listener);
builder.getConfiguration();
final ConfigurationBuilderEvent event = listener.nextEvent(ConfigurationBuilderEvent.CONFIGURATION_REQUEST);
assertSame(builder, event.getSource());
listener.assertNoMoreEvents();
}
/**
* Tests whether the configuration request event type is correctly configured.
*/
@Test
void testConfigurationRequestEventType() {
final EventType<ConfigurationBuilderEvent> eventType = ConfigurationBuilderEvent.CONFIGURATION_REQUEST;
assertEquals(ConfigurationBuilderEvent.ANY, eventType.getSuperType());
}
/**
* Tests whether an event listener can be removed again.
*/
@Test
void testRemoveEventListener() {
final BuilderEventListenerImpl listener = new BuilderEventListenerImpl();
final BasicConfigurationBuilder<PropertiesConfiguration> builder = new BasicConfigurationBuilder<>(PropertiesConfiguration.class);
builder.addEventListener(ConfigurationBuilderEvent.RESET, listener);
builder.reset();
assertTrue(builder.removeEventListener(ConfigurationBuilderEvent.RESET, listener));
builder.resetResult();
listener.nextEvent(ConfigurationBuilderEvent.RESET);
listener.assertNoMoreEvents();
}
/**
* Tests removeEventListener() for a non-existing listener.
*/
@Test
void testRemoveEventListenerNotExisting() {
final BasicConfigurationBuilder<PropertiesConfiguration> builder = new BasicConfigurationBuilder<>(PropertiesConfiguration.class);
final BuilderEventListenerImpl listener = new BuilderEventListenerImpl();
builder.addEventListener(ConfigurationBuilderEvent.RESET, listener);
assertFalse(builder.removeEventListener(ConfigurationBuilderEvent.CONFIGURATION_REQUEST, listener));
}
/**
* Tests the use case that a listener on the request event triggers a reset of the builder.
*/
@Test
void testResetOnConfigurationRequestEvent() throws ConfigurationException {
final BasicConfigurationBuilder<PropertiesConfiguration> builder = new BasicConfigurationBuilder<>(PropertiesConfiguration.class);
final PropertiesConfiguration configuration = builder.getConfiguration();
final BuilderEventListenerImpl listener = new BuilderEventListenerImpl();
builder.addEventListener(ConfigurationBuilderEvent.RESET, listener);
builder.addEventListener(ConfigurationBuilderEvent.CONFIGURATION_REQUEST, event -> builder.resetResult());
final PropertiesConfiguration configuration2 = builder.getConfiguration();
assertNotSame(configuration, configuration2);
listener.nextEvent(ConfigurationBuilderEvent.RESET);
listener.assertNoMoreEvents();
}
/**
* Tests whether a result created event is correctly generated.
*/
@Test
void testResultCreatedEvent() throws ConfigurationException {
final BasicConfigurationBuilder<PropertiesConfiguration> builder = new BasicConfigurationBuilder<>(PropertiesConfiguration.class);
final BuilderEventListenerImpl listener = new BuilderEventListenerImpl();
builder.addEventListener(ConfigurationBuilderEvent.ANY, listener);
final PropertiesConfiguration configuration = builder.getConfiguration();
listener.nextEvent(ConfigurationBuilderEvent.CONFIGURATION_REQUEST);
final ConfigurationBuilderResultCreatedEvent event = listener.nextEvent(ConfigurationBuilderResultCreatedEvent.RESULT_CREATED);
assertSame(builder, event.getSource());
assertSame(configuration, event.getConfiguration());
}
/**
* Tries to create an event about a newly created configuration without a configuration instance.
*/
@Test
void testResultCreatedEventNoConfiguration() {
final BasicConfigurationBuilder<Configuration> builder = new BasicConfigurationBuilder<>(Configuration.class);
assertThrows(IllegalArgumentException.class,
() -> new ConfigurationBuilderResultCreatedEvent(builder, ConfigurationBuilderResultCreatedEvent.RESULT_CREATED, null));
}
/**
* Tests whether the type of a result created event is correctly configured.
*/
@Test
void testResultCreatedEventType() {
assertEquals(ConfigurationBuilderEvent.ANY, ConfigurationBuilderResultCreatedEvent.RESULT_CREATED.getSuperType());
}
}