blob: 10ced01643970d5f0d6df4c032d67e04d6a9a5c0 [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
*
* 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 org.apache.commons.configuration2.builder;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.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.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
public void testBuilderEventType()
{
final EventType<ConfigurationBuilderEvent> builderEventType =
ConfigurationBuilderEvent.ANY;
assertEquals("Wrong super type", Event.ANY,
builderEventType.getSuperType());
}
/**
* Tests whether the reset builder event type is correctly configured.
*/
@Test
public void testBuilderResetEventType()
{
final EventType<ConfigurationBuilderEvent> builderResetType =
ConfigurationBuilderEvent.RESET;
assertEquals("Wrong super type", ConfigurationBuilderEvent.ANY,
builderResetType.getSuperType());
}
/**
* Tests whether builder reset events are correctly distributed.
*/
@Test
public 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("Wrong builder (1)", builder, event.getSource());
event = listener.nextEvent(ConfigurationBuilderEvent.RESET);
assertSame("Wrong builder (2)", builder, event.getSource());
listener.assertNoMoreEvents();
}
/**
* Tests whether an event listener can be removed again.
*/
@Test
public void testRemoveEventListener()
{
final BuilderEventListenerImpl listener = new BuilderEventListenerImpl();
final BasicConfigurationBuilder<PropertiesConfiguration> builder =
new BasicConfigurationBuilder<>(
PropertiesConfiguration.class);
builder.addEventListener(ConfigurationBuilderEvent.RESET, listener);
builder.reset();
assertTrue("Wrong result", builder.removeEventListener(
ConfigurationBuilderEvent.RESET, listener));
builder.resetResult();
listener.nextEvent(ConfigurationBuilderEvent.RESET);
listener.assertNoMoreEvents();
}
/**
* Tests removeEventListener() for a non-existing listener.
*/
@Test
public void testRemoveEventListenerNotExisting()
{
final BasicConfigurationBuilder<PropertiesConfiguration> builder =
new BasicConfigurationBuilder<>(
PropertiesConfiguration.class);
final BuilderEventListenerImpl listener = new BuilderEventListenerImpl();
builder.addEventListener(ConfigurationBuilderEvent.RESET, listener);
assertFalse("Wrong result", builder.removeEventListener(
ConfigurationBuilderEvent.CONFIGURATION_REQUEST, listener));
}
/**
* Tests whether the configuration request event type is correctly
* configured.
*/
@Test
public void testConfigurationRequestEventType()
{
final EventType<ConfigurationBuilderEvent> eventType =
ConfigurationBuilderEvent.CONFIGURATION_REQUEST;
assertEquals("Wrong super type", ConfigurationBuilderEvent.ANY,
eventType.getSuperType());
}
/**
* Tests whether a configuration request event is generated.
*/
@Test
public 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("Wrong builder", builder, event.getSource());
listener.assertNoMoreEvents();
}
/**
* Tests the use case that a listener on the request event triggers a reset
* of the builder.
*/
@Test
public 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 not reset", configuration, configuration2);
listener.nextEvent(ConfigurationBuilderEvent.RESET);
listener.assertNoMoreEvents();
}
/**
* Tries to create an event about a newly created configuration without a
* configuration instance.
*/
@Test(expected = IllegalArgumentException.class)
public void testResultCreatedEventNoConfiguration()
{
new ConfigurationBuilderResultCreatedEvent(
new BasicConfigurationBuilder<>(
Configuration.class),
ConfigurationBuilderResultCreatedEvent.RESULT_CREATED, null);
}
/**
* Tests whether the type of a result created event is correctly configured.
*/
@Test
public void testResultCreatedEventType()
{
assertEquals("Wrong super type", ConfigurationBuilderEvent.ANY,
ConfigurationBuilderResultCreatedEvent.RESULT_CREATED
.getSuperType());
}
/**
* Tests whether a result created event is correctly generated.
*/
@Test
public 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("Wrong builder", builder, event.getSource());
assertSame("Wrong configuration", configuration,
event.getConfiguration());
}
}