blob: 33c02c332cd1e6b5f2aec39f13d133a1edbc2483 [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.Collections;
import java.util.HashMap;
import java.util.Map;
import junit.framework.TestCase;
/**
* Test cases for {@link ADValidator}.
*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class ADValidatorTest extends TestCase
{
/**
* Tests the validation of boolean is only done minimally.
*/
public void testValidateBoolean()
{
AD ad = new AD();
ad.setType("Boolean");
ad.setRequired(false);
// optional value
assertEquals("", ADValidator.validate(ad, null));
// adhere minimal value
assertEquals("", ADValidator.validate(ad, "true"));
// adhere maximal value
assertEquals("", ADValidator.validate(ad, "false"));
// not a valid value
assertEquals(AD.VALIDATE_INVALID_VALUE, ADValidator.validate(ad, "foobar"));
ad.setCardinality(3); // up to three values are allowed...
// optional value
assertEquals("", ADValidator.validate(ad, null));
// 2nd value is missing, but that's ok...
assertEquals("", ADValidator.validate(ad, "true,,false"));
ad.setRequired(true);
// mandatory value
assertEquals(AD.VALIDATE_MISSING, ADValidator.validate(ad, null));
// 2nd value is missing
assertEquals(AD.VALIDATE_MISSING, ADValidator.validate(ad, "false,,true"));
// correct values
assertEquals("", ADValidator.validate(ad, "false, true, false"));
// correct values
assertEquals(AD.VALIDATE_INVALID_VALUE, ADValidator.validate(ad, "false, yessir, false"));
ad.setOptions(Collections.singletonMap("true", "Yes!"));
assertEquals(null, ADValidator.validate(ad, "false, true, false"));
}
/**
* Tests the validation of bytes works and uses the correct minimum and maximum values.
*/
public void testValidateByte()
{
AD ad = new AD();
ad.setType("Byte");
ad.setRequired(false);
// optional value
assertEquals("", ADValidator.validate(ad, null));
assertEquals("", ADValidator.validate(ad, ""));
ad.setRequired(true);
// mandatory value
assertEquals(AD.VALIDATE_MISSING, ADValidator.validate(ad, ""));
// value too small
assertEquals(AD.VALIDATE_INVALID_VALUE, ADValidator.validate(ad, "-129"));
// value too small
assertEquals("", ADValidator.validate(ad, "-128"));
// value within bounds
assertEquals("", ADValidator.validate(ad, "0"));
// value within bounds
assertEquals("", ADValidator.validate(ad, "127"));
// value is invalid
assertEquals(AD.VALIDATE_INVALID_VALUE, ADValidator.validate(ad, "128"));
ad.setMin("0");
ad.setMax("128"); // !!! this is an invalid value for maximum, this means that we cannot do this validation...
// value too small
assertEquals(AD.VALIDATE_LESS_THAN_MINIMUM, ADValidator.validate(ad, "-1"));
// value within bounds
assertEquals("", ADValidator.validate(ad, "0"));
// value within bounds
assertEquals("", ADValidator.validate(ad, "127"));
// value is invalid
assertEquals(AD.VALIDATE_INVALID_VALUE, ADValidator.validate(ad, "128"));
}
/**
* Tests the validation of characters with only limited set of options.
*/
public void testValidateCharacter()
{
AD ad = new AD();
ad.setType("Char");
ad.setRequired(false);
// optional value
assertEquals("", ADValidator.validate(ad, null));
// option too long
assertEquals(AD.VALIDATE_GREATER_THAN_MAXIMUM, ADValidator.validate(ad, "ab"));
// adhere first option value
assertEquals("", ADValidator.validate(ad, "b"));
// adhere last option value
assertEquals("", ADValidator.validate(ad, "e"));
ad.setCardinality(3); // up to three values are allowed...
// mandatory value
assertEquals("", ADValidator.validate(ad, ""));
// 2nd value is missing
assertEquals("", ADValidator.validate(ad, "b,,c"));
ad.setRequired(true);
// mandatory value
assertEquals(AD.VALIDATE_MISSING, ADValidator.validate(ad, null));
// 2nd value is missing
assertEquals(AD.VALIDATE_MISSING, ADValidator.validate(ad, "b,,c"));
// adhere minimal values
assertEquals("", ADValidator.validate(ad, "b, c, d"));
// adhere maximal values
assertEquals("", ADValidator.validate(ad, "c, d, e"));
Map options = new HashMap();
options.put("b", "B");
options.put("c", "C");
options.put("d", "D");
options.put("e", "E");
ad.setOptions(options);
// no option given
assertEquals(AD.VALIDATE_MISSING, ADValidator.validate(ad, ""));
// invalid option
assertEquals(AD.VALIDATE_NOT_A_VALID_OPTION, ADValidator.validate(ad, "a"));
// too great
assertEquals(AD.VALIDATE_NOT_A_VALID_OPTION, ADValidator.validate(ad, "f"));
// 2nd value is too less
assertEquals(AD.VALIDATE_NOT_A_VALID_OPTION, ADValidator.validate(ad, "b,a,c"));
// 3rd value is too great
assertEquals(AD.VALIDATE_NOT_A_VALID_OPTION, ADValidator.validate(ad, "d, e, f"));
ad.setMin("b");
ad.setMax("c");
ad.setOptions(Collections.emptyMap());
// adhere minimal values
assertEquals("", ADValidator.validate(ad, "b, c, b"));
// d is too great
assertEquals(AD.VALIDATE_GREATER_THAN_MAXIMUM, ADValidator.validate(ad, "b, c, d"));
// a is too small
assertEquals(AD.VALIDATE_LESS_THAN_MINIMUM, ADValidator.validate(ad, "a, b, c"));
}
/**
* Tests the validation of double value works as expected.
*/
public void testValidateDouble()
{
AD ad = new AD();
ad.setType("Double");
ad.setRequired(false);
ad.setMin("-123.45");
ad.setMax("+123.45");
// Value is too small...
assertEquals(AD.VALIDATE_LESS_THAN_MINIMUM, ADValidator.validate(ad, "-123.4501"));
// Value is within range...
assertEquals("", ADValidator.validate(ad, "-123.45000"));
// Value is within range...
assertEquals("", ADValidator.validate(ad, "123.45000"));
// Value is too great...
assertEquals(AD.VALIDATE_GREATER_THAN_MAXIMUM, ADValidator.validate(ad, "123.4501"));
Map options = new HashMap();
options.put("1.1", "B");
options.put("2.2", "C");
options.put("3.3", "D");
options.put("4.4", "E");
ad.setOptions(options);
// optional value
assertEquals("", ADValidator.validate(ad, null));
// invalid option
assertEquals(AD.VALIDATE_NOT_A_VALID_OPTION, ADValidator.validate(ad, "1.0"));
// adhere first option value
assertEquals("", ADValidator.validate(ad, "1.1"));
// adhere last option value
assertEquals("", ADValidator.validate(ad, "4.4"));
// too great
assertEquals(AD.VALIDATE_NOT_A_VALID_OPTION, ADValidator.validate(ad, "4.5"));
ad.setCardinality(3); // up to three values are allowed...
ad.setRequired(true);
// mandatory value
assertEquals(AD.VALIDATE_MISSING, ADValidator.validate(ad, null));
// 2nd value is too less
assertEquals(AD.VALIDATE_NOT_A_VALID_OPTION, ADValidator.validate(ad, "1.1,1.0,2.2"));
// adhere minimal values
assertEquals("", ADValidator.validate(ad, "1.1, 2.2, 3.3"));
// adhere maximal values
assertEquals("", ADValidator.validate(ad, "2.2, 3.3, 4.4"));
// 3rd value is too great
assertEquals(AD.VALIDATE_NOT_A_VALID_OPTION, ADValidator.validate(ad, "3.3, 4.4, 5.5"));
}
/**
* Tests the validation of integers is based on the minimum and maximum values.
*/
public void testValidateInteger()
{
AD ad = new AD();
ad.setType("Integer");
ad.setMin("3"); // only values greater than 2
ad.setMax("6"); // only values less than 7
ad.setRequired(false);
// optional value
assertEquals("", ADValidator.validate(ad, null));
assertEquals("", ADValidator.validate(ad, ""));
// too less
assertEquals(AD.VALIDATE_LESS_THAN_MINIMUM, ADValidator.validate(ad, "2"));
// adhere minimal value
assertEquals("", ADValidator.validate(ad, "3"));
// adhere maximal value
assertEquals("", ADValidator.validate(ad, "6"));
// too great
assertEquals(AD.VALIDATE_GREATER_THAN_MAXIMUM, ADValidator.validate(ad, "7"));
ad.setCardinality(3); // up to three values are allowed...
// mandatory value
assertEquals("", ADValidator.validate(ad, null));
// 2nd value is missing
assertEquals("", ADValidator.validate(ad, "3,,3"));
ad.setRequired(true);
// mandatory value
assertEquals(AD.VALIDATE_MISSING, ADValidator.validate(ad, null));
// 2nd value is missing
assertEquals(AD.VALIDATE_MISSING, ADValidator.validate(ad, "3,,3"));
// 2nd value is invalid
assertEquals(AD.VALIDATE_INVALID_VALUE, ADValidator.validate(ad, "3,a,3"));
// 2nd value is too less
assertEquals(AD.VALIDATE_LESS_THAN_MINIMUM, ADValidator.validate(ad, "3,2,3"));
// adhere minimal values
assertEquals("", ADValidator.validate(ad, "3, 4, 5"));
// adhere maximal values
assertEquals("", ADValidator.validate(ad, "6, 5, 4"));
// 3rd value is too great
assertEquals(AD.VALIDATE_GREATER_THAN_MAXIMUM, ADValidator.validate(ad, "5, 6, 7"));
}
/**
* Tests the validation of long values works as expected.
*/
public void testValidateLong()
{
AD ad = new AD();
ad.setType("Long");
ad.setRequired(true);
ad.setMin("-20");
ad.setMax("-15");
// value too small
assertEquals(AD.VALIDATE_LESS_THAN_MINIMUM, ADValidator.validate(ad, "-21"));
// value within bounds
assertEquals("", ADValidator.validate(ad, "-15"));
// value within bounds
assertEquals("", ADValidator.validate(ad, "-20"));
// value too great
assertEquals(AD.VALIDATE_GREATER_THAN_MAXIMUM, ADValidator.validate(ad, "-14"));
// Set minimum and maximum beyond the range of plain integers...
ad.setMin("2147483650");
ad.setMax("2147483655");
// value too small
assertEquals(AD.VALIDATE_LESS_THAN_MINIMUM, ADValidator.validate(ad, "2147483649"));
// value within bounds
assertEquals("", ADValidator.validate(ad, "2147483650"));
// value within bounds
assertEquals("", ADValidator.validate(ad, "2147483655"));
// value too great
assertEquals(AD.VALIDATE_GREATER_THAN_MAXIMUM, ADValidator.validate(ad, "2147483656"));
}
/**
* Tests the validation of strings is based on the minimum and maximum lengths.
*/
public void testValidateString()
{
AD ad = new AD();
ad.setType("String");
ad.setRequired(false);
// optional value
assertEquals("", ADValidator.validate(ad, null));
// any length of input is accepted
assertEquals("", ADValidator.validate(ad, "1234567890"));
ad.setMin("3"); // minimal length == 3
ad.setMax("6"); // maximum length == 6
// too short
assertEquals(AD.VALIDATE_LESS_THAN_MINIMUM, ADValidator.validate(ad, "12"));
// adhere minimum length
assertEquals("", ADValidator.validate(ad, "123"));
// adhere maximum length
assertEquals("", ADValidator.validate(ad, "12356"));
// too long
assertEquals(AD.VALIDATE_GREATER_THAN_MAXIMUM, ADValidator.validate(ad, "1234567"));
ad.setCardinality(3); // up to three values are allowed...
ad.setMin("");
// optional value
assertEquals("", ADValidator.validate(ad, null));
// 2nd value is missing; but that's ok
assertEquals("", ADValidator.validate(ad, "321, , 123"));
ad.setRequired(true);
ad.setMin("3");
// mandatory value
assertEquals(AD.VALIDATE_MISSING, ADValidator.validate(ad, null));
// 2nd value is missing
assertEquals(AD.VALIDATE_MISSING, ADValidator.validate(ad, "321, , 123"));
// 2nd value is too short
assertEquals(AD.VALIDATE_LESS_THAN_MINIMUM, ADValidator.validate(ad, "321,12,123"));
// adhere minimum lengths
assertEquals("", ADValidator.validate(ad, "123, 123, 123"));
// adhere maximum lengths
assertEquals("", ADValidator.validate(ad, "12356, 654321, 123456"));
// 3rd value is too long
assertEquals(AD.VALIDATE_GREATER_THAN_MAXIMUM, ADValidator.validate(ad, "123, 123, 1234567"));
ad.setOptions(Collections.singletonMap("123", "foo"));
// adhere minimum lengths
assertEquals("", ADValidator.validate(ad, "123, 123, 123"));
assertEquals(AD.VALIDATE_NOT_A_VALID_OPTION, ADValidator.validate(ad, "2134"));
}
}