blob: 98884af73c118c9e52d9d2a8ffd665dfe5709500 [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.assertNull;
import static org.junit.Assert.assertSame;
import java.util.Map;
import org.apache.commons.configuration2.builder.fluent.FileBasedBuilderParameters;
import org.apache.commons.configuration2.builder.fluent.Parameters;
import org.apache.commons.configuration2.builder.fluent.PropertiesBuilderParameters;
import org.apache.commons.configuration2.builder.fluent.XMLBuilderParameters;
import org.apache.commons.configuration2.convert.ListDelimiterHandler;
import org.apache.commons.configuration2.tree.ExpressionEngine;
import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Test class for {@code DefaultParametersManager}.
*
*/
public class TestDefaultParametersManager
{
/** Constant for the default encoding. */
private static final String DEF_ENCODING = "UTF-8";
/** A test list delimiter handler. */
private static ListDelimiterHandler listHandler;
/** An object for creating new parameters objects. */
private Parameters parameters;
/** The manager to be tested. */
private DefaultParametersManager manager;
@BeforeClass
public static void setUpBeforeClass() throws Exception
{
listHandler = EasyMock.createMock(ListDelimiterHandler.class);
}
@Before
public void setUp() throws Exception
{
parameters = new Parameters();
manager = new DefaultParametersManager();
}
/**
* Tries to register a default handler without a class.
*/
@Test(expected = IllegalArgumentException.class)
public void testRegisterDefaultsHandlerNoClass()
{
manager.registerDefaultsHandler(null, new FileBasedDefaultsHandler());
}
/**
* Tries to register a null default handler.
*/
@Test(expected = IllegalArgumentException.class)
public void testRegisterDefaultsHandlerNoHandler()
{
manager.registerDefaultsHandler(BasicBuilderProperties.class, null);
}
/**
* Checks whether the expected default values have been set on a parameters
* object.
*
* @param map the map with parameters
*/
private static void checkDefaultValues(final Map<String, Object> map)
{
assertEquals("Wrong delimiter handler", listHandler,
map.get("listDelimiterHandler"));
assertEquals("Wrong exception flag value", Boolean.TRUE,
map.get("throwExceptionOnMissing"));
final FileBasedBuilderParametersImpl fbparams =
FileBasedBuilderParametersImpl.fromParameters(map);
assertEquals("Wrong encoding", DEF_ENCODING, fbparams.getFileHandler()
.getEncoding());
}
/**
* Checks that no default values have been set on a parameters object.
*
* @param map the map with parameters
*/
private static void checkNoDefaultValues(final Map<String, Object> map)
{
assertFalse("Got base properties",
map.containsKey("throwExceptionOnMissing"));
final FileBasedBuilderParametersImpl fbParams =
FileBasedBuilderParametersImpl.fromParameters(map, true);
assertNull("Got an encoding", fbParams.getFileHandler().getEncoding());
}
/**
* Tests whether default values are set for newly created parameters
* objects.
*/
@Test
public void testApplyDefaults()
{
manager.registerDefaultsHandler(FileBasedBuilderParameters.class,
new FileBasedDefaultsHandler());
final FileBasedBuilderParameters params = parameters.fileBased();
manager.initializeParameters(params);
final Map<String, Object> map = params.getParameters();
checkDefaultValues(map);
}
/**
* Tests whether default values are also applied when a sub parameters class
* is created.
*/
@Test
public void testApplyDefaultsOnSubClass()
{
manager.registerDefaultsHandler(FileBasedBuilderParameters.class,
new FileBasedDefaultsHandler());
final XMLBuilderParameters params = parameters.xml();
manager.initializeParameters(params);
final Map<String, Object> map = params.getParameters();
checkDefaultValues(map);
}
/**
* Tests that default values are only applied if the start class provided at
* registration time matches.
*/
@Test
public void testApplyDefaultsStartClass()
{
manager.registerDefaultsHandler(FileBasedBuilderParameters.class,
new FileBasedDefaultsHandler(), XMLBuilderParameters.class);
final XMLBuilderParameters paramsXml = parameters.xml();
manager.initializeParameters(paramsXml);
Map<String, Object> map = paramsXml.getParameters();
checkDefaultValues(map);
final PropertiesBuilderParameters paramsProps = parameters.properties();
manager.initializeParameters(paramsProps);
map = paramsProps.getParameters();
checkNoDefaultValues(map);
}
/**
* Tests whether multiple handlers can be registered for the same classes
* and whether they are called in the correct order.
*/
@Test
public void testApplyDefaultsMultipleHandlers()
{
final ExpressionEngine engine =
EasyMock.createMock(ExpressionEngine.class);
manager.registerDefaultsHandler(XMLBuilderParameters.class,
parameters -> parameters
.setThrowExceptionOnMissing(false)
.setListDelimiterHandler(
EasyMock.createMock(ListDelimiterHandler.class))
.setExpressionEngine(engine));
manager.registerDefaultsHandler(FileBasedBuilderParameters.class,
new FileBasedDefaultsHandler());
final XMLBuilderParameters params = parameters.xml();
manager.initializeParameters(params);
final Map<String, Object> map = params.getParameters();
checkDefaultValues(map);
assertSame("Expression engine not set", engine,
map.get("expressionEngine"));
}
/**
* Tests whether initializeParameters() ignores null input. (We can only
* test that no exception is thrown.)
*/
@Test
public void testInitializeParametersNull()
{
manager.registerDefaultsHandler(FileBasedBuilderParameters.class,
new FileBasedDefaultsHandler());
manager.initializeParameters(null);
}
/**
* Tests whether all occurrences of a given defaults handler can be removed.
*/
@Test
public void testUnregisterDefaultsHandlerAll()
{
final FileBasedDefaultsHandler handler = new FileBasedDefaultsHandler();
manager.registerDefaultsHandler(FileBasedBuilderParameters.class,
handler, XMLBuilderParameters.class);
manager.registerDefaultsHandler(FileBasedBuilderParameters.class,
handler, PropertiesBuilderParameters.class);
manager.unregisterDefaultsHandler(handler);
final XMLBuilderParameters paramsXml = parameters.xml();
manager.initializeParameters(paramsXml);
checkNoDefaultValues(paramsXml.getParameters());
final PropertiesBuilderParameters paramsProps = parameters.properties();
manager.initializeParameters(paramsProps);
checkNoDefaultValues(paramsProps.getParameters());
}
/**
* Tests whether a specific occurrence of a defaults handler can be removed.
*/
@Test
public void testUnregisterDefaultsHandlerSpecific()
{
final FileBasedDefaultsHandler handler = new FileBasedDefaultsHandler();
manager.registerDefaultsHandler(FileBasedBuilderParameters.class,
handler, XMLBuilderParameters.class);
manager.registerDefaultsHandler(FileBasedBuilderParameters.class,
handler, PropertiesBuilderParameters.class);
manager.unregisterDefaultsHandler(handler,
PropertiesBuilderParameters.class);
final XMLBuilderParameters paramsXml = parameters.xml();
manager.initializeParameters(paramsXml);
checkDefaultValues(paramsXml.getParameters());
final PropertiesBuilderParameters paramsProps = parameters.properties();
manager.initializeParameters(paramsProps);
checkNoDefaultValues(paramsProps.getParameters());
}
/**
* A test defaults handler implementation for testing the initialization of
* parameters objects with default values. This class sets some hard-coded
* default values.
*/
private static class FileBasedDefaultsHandler implements
DefaultParametersHandler<FileBasedBuilderParameters>
{
@Override
public void initializeDefaults(final FileBasedBuilderParameters parameters)
{
parameters.setThrowExceptionOnMissing(true)
.setEncoding(DEF_ENCODING)
.setListDelimiterHandler(listHandler);
}
}
}