blob: 2a6a8afd2959e68083683676a34ab07ab1b18c87 [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.beanutils.converters;
import junit.framework.TestCase;
import org.apache.commons.beanutils.ConversionException;
import org.apache.commons.beanutils.ConvertUtils;
/**
* Test conversions of String[]->boolean[] and String->boolean[].
*
* <p>Note that the tests here don't rigorously test conversions of individual
* strings to booleans, as the BooleanArrayConverter class uses a
* BooleanConverter instance to do those conversions, and the BooleanConverter
* class has its own unit tests. Here, the tests focus on the array-related
* behaviour.</p>
*
* @version $Id$
*/
public class BooleanArrayConverterTestCase extends TestCase {
public static final String[] STANDARD_TRUES = new String[] {
"yes", "y", "true", "on", "1"
};
public static final String[] STANDARD_FALSES = new String[] {
"no", "n", "false", "off", "0"
};
public BooleanArrayConverterTestCase(final String name) {
super(name);
}
/**
* Check that an object of type String[] with valid boolean string
* values gets converted nicely.
*/
public void testStandardStringArrayConversion() {
final String[] values = {
"true", "false",
"yes", "no",
"y", "n",
"1", "0",
};
final BooleanArrayConverter converter = new BooleanArrayConverter();
final boolean[] results = (boolean[]) converter.convert(null, values);
assertNotNull(results);
assertEquals(8, results.length);
assertTrue(results[0]);
assertFalse(results[1]);
assertTrue(results[2]);
assertFalse(results[3]);
assertTrue(results[4]);
assertFalse(results[5]);
assertTrue(results[6]);
assertFalse(results[7]);
}
/**
* Check that an object whose toString method returns a list of boolean
* values gets converted nicely.
*/
public void testStandardStringConversion() {
final BooleanArrayConverter converter = new BooleanArrayConverter();
final StringBuilder input = new StringBuilder();
boolean[] results;
// string has {}
input.setLength(0);
input.append("{true, 'yes', Y, 1, 'FALSE', \"no\", 'n', 0}");
results = (boolean[]) converter.convert(null, input);
assertNotNull(results);
assertEquals(8, results.length);
assertTrue(results[0]);
assertTrue(results[1]);
assertTrue(results[2]);
assertTrue(results[3]);
assertFalse(results[4]);
assertFalse(results[5]);
assertFalse(results[6]);
assertFalse(results[7]);
// string does not have {}
input.setLength(0);
input.append("'falsE', 'no', 'N', 0, \"truE\", yeS, 'y', '1'");
results = (boolean[]) converter.convert(null, input);
assertNotNull(results);
assertEquals(8, results.length);
assertFalse(results[0]);
assertFalse(results[1]);
assertFalse(results[2]);
assertFalse(results[3]);
assertTrue(results[4]);
assertTrue(results[5]);
assertTrue(results[6]);
assertTrue(results[7]);
// string has only one element, non-quoted
input.setLength(0);
input.append("y");
results = (boolean[]) converter.convert(null, input);
assertNotNull(results);
assertEquals(1, results.length);
assertTrue(results[0]);
// string has only one element, quoted with ".
input.setLength(0);
input.append("\"1\"");
results = (boolean[]) converter.convert(null, input);
assertNotNull(results);
assertEquals(1, results.length);
assertTrue(results[0]);
// string has only one element, quoted with '
// Here we also pass an object of type String rather than the
// StringBuilder
results = (boolean[]) converter.convert(null, "'yes'");
assertNotNull(results);
assertEquals(1, results.length);
assertTrue(results[0]);
}
/**
* Check that the user can specify non-standard true/false values by
* providing a customised BooleanConverter.
*/
public void testAdditionalStrings() {
final String[] trueStrings = {"sure"};
final String[] falseStrings = {"nope"};
final BooleanConverter bc = new BooleanConverter(
trueStrings, falseStrings, BooleanConverter.NO_DEFAULT);
final BooleanArrayConverter converter = new BooleanArrayConverter(
bc, BooleanArrayConverter.NO_DEFAULT);
final boolean[] results = (boolean[]) converter.convert(null, "NOPE, sure, sure");
assertNotNull(results);
assertEquals(3, results.length);
assertFalse(results[0]);
assertTrue(results[1]);
assertTrue(results[2]);
try {
// the literal string 'true' should no longer be recognized as
// a true value..
converter.convert(null, "true");
fail("Converting invalid string should have generated an exception");
} catch(final Exception ex) {
// ok, expected
}
}
/**
* Check that when the input string cannot be split into a String[], and
* there is no default value then an exception is thrown.
*/
public void testInvalidStringWithoutDefault() {
final BooleanArrayConverter converter = new BooleanArrayConverter();
try {
converter.convert(null, "true!");
fail("Converting invalid string should have generated an exception");
} catch (final ConversionException expected) {
// Exception is successful test
}
}
/**
* Check that when the input string cannot be split into a String[], and
* there is a default value then that default is returned.
*/
public void testInvalidStringWithDefault() {
final boolean[] defaults = new boolean[1];
final BooleanArrayConverter converter = new BooleanArrayConverter(defaults);
final Object o = converter.convert(null, "true!");
assertSame("Unexpected object returned for failed conversion", o, defaults);
}
/**
* Check that when one of the elements in a comma-separated string is not
* a valid boolean, and there is no default value then an exception is thrown.
*/
public void testInvalidElementWithoutDefault() {
final BooleanArrayConverter converter = new BooleanArrayConverter();
try {
converter.convert(null, "true,bogus");
fail("Converting invalid string should have generated an exception");
} catch (final ConversionException expected) {
// Exception is successful test
}
}
/**
* Check that when one of the elements in a comma-separated string is not
* a valid boolean, and there is a default value then the default value
* is returned.
* <p>
* Note that the default value is for the complete array object returned,
* not for the failed element.
*/
public void testInvalidElementWithDefault() {
final boolean[] defaults = new boolean[1];
final BooleanArrayConverter converter = new BooleanArrayConverter(defaults);
final Object o = converter.convert(null, "true,bogus");
assertSame("Unexpected object returned for failed conversion", o, defaults);
}
/**
* Check that when a custom BooleanConverter is used, and that converter
* has a (per-element) default, then that element (and just that element)
* is assigned the default value.
* <p>
* With the standard BooleanArrayConverter, if <i>any</i> of the elements
* in the array are bad, then the array-wide default value is returned.
* However by specifying a custom BooleanConverter which has a per-element
* default, the unrecognized elements get that per-element default but the
* others are converted as expected.
*/
public void testElementDefault() {
final boolean[] defaults = new boolean[1];
final BooleanConverter bc = new BooleanConverter(Boolean.TRUE);
final BooleanArrayConverter converter = new BooleanArrayConverter(bc, defaults);
final boolean[] results = (boolean[]) converter.convert(null, "true,bogus");
assertEquals(2, results.length);
assertTrue(results[0]);
assertTrue(results[1]);
}
/**
* Check that registration of a custom converter works.
*/
public void testRegistration() {
final String[] trueStrings = {"sure"};
final String[] falseStrings = {"nope"};
final BooleanConverter bc = new BooleanConverter(
trueStrings, falseStrings, BooleanConverter.NO_DEFAULT);
final BooleanArrayConverter converter = new BooleanArrayConverter(
bc, BooleanArrayConverter.NO_DEFAULT);
ConvertUtils.register(converter, BooleanArrayConverter.MODEL);
final boolean[] sample = new boolean[0];
final boolean[] results = (boolean[]) ConvertUtils.convert("sure,nope", sample.getClass());
assertEquals(2, results.length);
assertTrue(results[0]);
assertFalse(results[1]);
}
}