blob: c830cfe6b16c59a682a8b9b9f6bfdec8a32dbbd1 [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.felix.metatype;
import java.util.HashMap;
import java.util.Map;
import junit.framework.TestCase;
import org.osgi.service.metatype.AttributeDefinition;
/**
* The <code>ADTest</code> class tests the static helper methods of the
* {@link AD} class.
*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class ADTest extends TestCase
{
private static final String BLANK = " \r\n \t";
public void testNull()
{
String listString = null;
String[] list = AD.splitList(listString);
assertNull(list);
}
public void testEmpty()
{
String listString = "";
String[] list = AD.splitList(listString);
assertNotNull(list);
assertEquals(1, list.length);
assertEquals(listString, list[0]);
}
public void testSingle()
{
String value0 = "value";
String listString = value0;
String[] list = AD.splitList(listString);
assertNotNull(list);
assertEquals(1, list.length);
assertEquals(value0, list[0]);
}
public void testTwo()
{
String value0 = "value0";
String value1 = "value1";
String listString = value0 + "," + value1;
String[] list = AD.splitList(listString);
assertNotNull(list);
assertEquals(2, list.length);
assertEquals(value0, list[0]);
assertEquals(value1, list[1]);
}
public void testEmptySecond()
{
String value0 = "value0";
String value1 = "";
String listString = value0 + ",";
String[] list = AD.splitList(listString);
assertNotNull(list);
assertEquals(2, list.length);
assertEquals(value0, list[0]);
assertEquals(value1, list[1]);
}
public void testSpacedSecond()
{
String value0 = "value0";
String value1 = "";
String listString = value0 + ", ";
String[] list = AD.splitList(listString);
assertNotNull(list);
assertEquals(2, list.length);
assertEquals(value0, list[0]);
assertEquals(value1, list[1]);
}
public void testSingleBlanks()
{
String value0 = "value";
String listString = BLANK + value0 + BLANK;
String[] list = AD.splitList(listString);
assertNotNull(list);
assertEquals(1, list.length);
assertEquals(value0, list[0]);
}
public void testTwoBlanks()
{
String value0 = "value0";
String value1 = "value1";
String listString = BLANK + value0 + BLANK + "," + BLANK + value1 + BLANK;
String[] list = AD.splitList(listString);
assertNotNull(list);
assertEquals(2, list.length);
assertEquals(value0, list[0]);
assertEquals(value1, list[1]);
}
public void testSpaces()
{
String value = "Hello World";
String listString = BLANK + value + BLANK + "," + BLANK + value + BLANK + "," + value;
String[] list = AD.splitList(listString);
assertNotNull(list);
assertEquals(3, list.length);
assertEquals(value, list[0]);
assertEquals(value, list[1]);
assertEquals(value, list[2]);
}
public void testStandardSample()
{
String value0 = "a,b";
String value1 = "b,c";
String value2 = " c\\";
String value3 = "d";
String listString = "a\\,b,b\\,c,\\ c\\\\,d";
String[] list = AD.splitList(listString);
assertNotNull(list);
assertEquals(4, list.length);
assertEquals(value0, list[0]);
assertEquals(value1, list[1]);
assertEquals(value2, list[2]);
assertEquals(value3, list[3]);
}
public void testToTypeString()
{
assertEquals(AttributeDefinition.STRING, AD.toType("String"));
assertEquals(AttributeDefinition.LONG, AD.toType("Long"));
assertEquals(AttributeDefinition.DOUBLE, AD.toType("Double"));
assertEquals(AttributeDefinition.FLOAT, AD.toType("Float"));
assertEquals(AttributeDefinition.INTEGER, AD.toType("Integer"));
assertEquals(AttributeDefinition.BYTE, AD.toType("Byte"));
assertEquals(AttributeDefinition.CHARACTER, AD.toType("Char"));
assertEquals(AttributeDefinition.CHARACTER, AD.toType("Character"));
assertEquals(AttributeDefinition.BOOLEAN, AD.toType("Boolean"));
assertEquals(AttributeDefinition.SHORT, AD.toType("Short"));
assertEquals(AttributeDefinition.PASSWORD, AD.toType("Password"));
assertEquals(AttributeDefinition.STRING, AD.toType("JohnDoe"));
}
/**
* FELIX-3757: if an AD has only its 'required' property set, but no
* min/max or option values defined, the validation still should detect
* empty values.
*/
public void testValidateRequiredValueWithMinimalOptions()
{
AD ad = new AD();
ad.setType("Integer");
ad.setRequired(true);
assertEquals(AD.VALIDATE_MISSING, ad.validate(null));
}
/**
* FELIX-3756: if an AD is optional, but its validate method is called
* with invalid data, the value is regarded missing.
*/
public void testValidateOptionalValueWithInvalidData()
{
AD ad = new AD();
ad.setType("Integer");
ad.setRequired(false);
assertEquals(AD.VALIDATE_INVALID_VALUE, ad.validate("abc"));
}
/**
* FELIX-3758: if an AD has a cardinality != 0, the validation method
* cannot handle a comma-separated input.
*/
public void testValidateValueWithMultiValueCardinality()
{
AD ad = new AD();
ad.setType("Integer");
ad.setCardinality(2);
ad.setRequired(true);
assertEquals("", ad.validate("1,2"));
}
/**
* FELIX-3884 : if an AD has options, default values must be in the option values.
*/
public void testOptionsAndDefaultValues()
{
AD ad = new AD();
ad.setCardinality(2);
ad.setType("String");
ad.setRequired(false);
Map options = new HashMap();
options.put("A", "L-A");
options.put("B", "L-B");
ad.setOptions(options);
ad.setDefaultValue("A,B");
assertArrayEquals(new String[] { "A", "B" }, ad.getDefaultValue());
ad.setDefaultValue("A,B,C");
assertArrayEquals(new String[] { "A", "B" }, ad.getDefaultValue());
ad.setDefaultValue("X,Y,B");
assertArrayEquals(new String[] { "B" }, ad.getDefaultValue());
ad.setDefaultValue("X,Y,Z");
assertArrayEquals(new String[0], ad.getDefaultValue());
ad.setDefaultValue(null);
assertNull(ad.getDefaultValue());
}
/**
* FELIX-3884/FELIX-4665 - Default values.
*/
public void testDefaultValuesForSingleValuedAttributes()
{
AD ad = new AD();
ad.setCardinality(0);
ad.setType("String");
ad.setRequired(false);
ad.setDefaultValue(null);
assertNull(ad.getDefaultValue());
ad.setDefaultValue("A,B");
assertArrayEquals(new String[] { "A" }, ad.getDefaultValue());
ad.setDefaultValue("");
assertArrayEquals(new String[] { "" }, ad.getDefaultValue());
// corner case: in case of required values, an empty default makes no sense
// for single values, hence that the empty default is coerced into null...
ad.setRequired(true);
ad.setDefaultValue("");
assertNull(ad.getDefaultValue());
}
/**
* FELIX-3884/FELIX-4665 - Default values.
*/
public void testDefaultValuesForMultiValuedAttributes()
{
AD ad = new AD();
ad.setCardinality(-2); // sign doesn't matter in this case
ad.setType("String");
ad.setRequired(false);
ad.setDefaultValue(null);
assertNull(ad.getDefaultValue());
ad.setDefaultValue("A,B");
assertArrayEquals(new String[] { "A", "B" }, ad.getDefaultValue());
ad.setDefaultValue(",,");
assertArrayEquals(new String[] { "", "" }, ad.getDefaultValue());
ad.setDefaultValue("");
assertArrayEquals(new String[] { "" }, ad.getDefaultValue());
// corner case: in case of required values, an empty default is coerced
// into a empty array...
ad.setRequired(true);
ad.setDefaultValue("");
assertArrayEquals(new String[0], ad.getDefaultValue());
}
private static void assertArrayEquals(String[] a, String[] b)
{
assertEquals(a.length, b.length);
for (int i = 0; i < a.length; i++)
{
assertEquals(a[i], b[i]);
}
}
}