/*
* 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.collections;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Properties;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* Tests some basic functions of the ExtendedProperties class.
*
* @version $Revision: 646780 $ $Date: 2008-04-10 13:48:07 +0100 (Thu, 10 Apr 2008) $
*
* @author Geir Magnusson Jr.
* @author Mohan Kishore
* @author Stephen Colebourne
* @author Shinobu Kawai
* @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
*/
public class TestExtendedProperties extends TestCase {
protected ExtendedProperties eprop = new ExtendedProperties();
public TestExtendedProperties(String testName) {
super(testName);
}
public static Test suite() {
return new TestSuite(TestExtendedProperties.class);
}
public static void main(String args[]) {
String[] testCaseName = { TestExtendedProperties.class.getName()};
junit.textui.TestRunner.main(testCaseName);
}
public void testRetrieve() {
/*
* should be empty and return null
*/
assertEquals("This returns null", eprop.getProperty("foo"), null);
/*
* add a real value, and get it two different ways
*/
eprop.setProperty("number", "1");
assertEquals("This returns '1'", eprop.getProperty("number"), "1");
assertEquals("This returns '1'", eprop.getString("number"), "1");
/*
* now add another and get a Vector/list
*/
eprop.addProperty("number", "2");
assertTrue("This returns array", (eprop.getVector("number") instanceof java.util.Vector));
assertTrue("This returns array", (eprop.getList("number") instanceof java.util.List));
/*
* now test dan's new fix where we get the first scalar
* when we access a vector/list valued
* property
*/
assertTrue("This returns scalar", (eprop.getString("number") instanceof String));
/*
* test comma separated string properties
*/
String prop = "hey, that's a test";
eprop.setProperty("prop.string", prop);
assertTrue("This returns vector", (eprop.getVector("prop.string") instanceof java.util.Vector));
assertTrue("This returns list", (eprop.getList("prop.string") instanceof java.util.List));
String prop2 = "hey\\, that's a test";
eprop.remove("prop.string");
eprop.setProperty("prop.string", prop2);
assertTrue("This returns array", (eprop.getString("prop.string") instanceof java.lang.String));
/*
* test subset : we want to make sure that the EP doesn't reprocess the data
* elements when generating the subset
*/
ExtendedProperties subEprop = eprop.subset("prop");
assertTrue("Returns the full string", subEprop.getString("string").equals(prop));
assertTrue("This returns string for subset", (subEprop.getString("string") instanceof java.lang.String));
assertTrue("This returns array for subset", (subEprop.getVector("string") instanceof java.util.Vector));
assertTrue("This returns array for subset", (subEprop.getList("string") instanceof java.util.List));
}
public void testInterpolation() {
eprop.setProperty("applicationRoot", "/home/applicationRoot");
eprop.setProperty("db", "${applicationRoot}/db/hypersonic");
String dbProp = "/home/applicationRoot/db/hypersonic";
assertTrue("Checking interpolated variable", eprop.getString("db").equals(dbProp));
}
public void testSaveAndLoad() {
ExtendedProperties ep1 = new ExtendedProperties();
ExtendedProperties ep2 = new ExtendedProperties();
try {
/* initialize value:
one=Hello\World
two=Hello\,World
three=Hello,World
*/
String s1 = "one=Hello\\World\ntwo=Hello\\,World\nthree=Hello,World";
byte[] bytes = s1.getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ep1.load(bais);
assertEquals("Back-slashes not interpreted properly",
"Hello\\World", ep1.getString("one"));
assertEquals("Escaped commas not interpreted properly",
"Hello,World", ep1.getString("two"));
assertEquals("Commas not interpreted properly",
2, ep1.getVector("three").size());
assertEquals("Commas not interpreted properly",
"Hello", ep1.getVector("three").get(0));
assertEquals("Commas not interpreted properly",
"World", ep1.getVector("three").get(1));
assertEquals("Commas not interpreted properly",
2, ep1.getList("three").size());
assertEquals("Commas not interpreted properly",
"Hello", ep1.getList("three").get(0));
assertEquals("Commas not interpreted properly",
"World", ep1.getList("three").get(1));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ep1.save(baos, null);
bytes = baos.toByteArray();
bais = new ByteArrayInputStream(bytes);
ep2.load(bais);
assertEquals("Back-slash not same after being saved and loaded",
ep1.getString("one"), ep2.getString("one"));
assertEquals("Escaped comma not same after being saved and loaded",
ep1.getString("two"), ep2.getString("two"));
assertEquals("Comma not same after being saved and loaded",
ep1.getString("three"), ep2.getString("three"));
} catch (IOException ioe) {
fail("There was an exception saving and loading the EP");
}
}
public void testTrailingBackSlash() {
ExtendedProperties ep1 = new ExtendedProperties();
try {
/*
initialize using:
one=ONE
two=TWO \\
three=THREE
*/
String s1 = "one=ONE\ntwo=TWO \\\\\nthree=THREE";
byte[] bytes = s1.getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ep1.load(bais);
assertEquals("Trailing back-slashes not interpreted properly",
3, ep1.size());
assertEquals("Back-slash not escaped properly",
"TWO \\", ep1.getString("two"));
} catch (IOException ioe) {
fail("There was an exception loading the EP");
}
}
public void testMultipleSameKey1() throws Exception {
ExtendedProperties ep1 = new ExtendedProperties();
/*
initialize using:
one=a
one=b,c
*/
String s1 = "one=a\none=b,c\n";
byte[] bytes = s1.getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ep1.load(bais);
assertEquals(1, ep1.size());
assertEquals(3, ep1.getVector("one").size());
assertEquals("a", ep1.getVector("one").get(0));
assertEquals("b", ep1.getVector("one").get(1));
assertEquals("c", ep1.getVector("one").get(2));
assertEquals(3, ep1.getList("one").size());
assertEquals("a", ep1.getList("one").get(0));
assertEquals("b", ep1.getList("one").get(1));
assertEquals("c", ep1.getList("one").get(2));
}
public void testMultipleSameKey2() throws Exception {
ExtendedProperties ep1 = new ExtendedProperties();
/*
initialize using:
one=a,b
one=c,d
*/
String s1 = "one=a,b\none=c,d\n";
byte[] bytes = s1.getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ep1.load(bais);
assertEquals(1, ep1.size());
assertEquals(4, ep1.getVector("one").size());
assertEquals("a", ep1.getVector("one").get(0));
assertEquals("b", ep1.getVector("one").get(1));
assertEquals("c", ep1.getVector("one").get(2));
assertEquals("d", ep1.getVector("one").get(3));
assertEquals(4, ep1.getList("one").size());
assertEquals("a", ep1.getList("one").get(0));
assertEquals("b", ep1.getList("one").get(1));
assertEquals("c", ep1.getList("one").get(2));
assertEquals("d", ep1.getList("one").get(3));
}
public void testMultipleSameKey3() throws Exception {
ExtendedProperties ep1 = new ExtendedProperties();
/*
initialize using:
one=a,b
one=c
*/
String s1 = "one=a,b\none=c\n";
byte[] bytes = s1.getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ep1.load(bais);
assertEquals(1, ep1.size());
assertEquals(3, ep1.getVector("one").size());
assertEquals("a", ep1.getVector("one").get(0));
assertEquals("b", ep1.getVector("one").get(1));
assertEquals("c", ep1.getVector("one").get(2));
assertEquals(3, ep1.getList("one").size());
assertEquals("a", ep1.getList("one").get(0));
assertEquals("b", ep1.getList("one").get(1));
assertEquals("c", ep1.getList("one").get(2));
}
public void testMultipleSameKeyByCode() throws Exception {
ExtendedProperties ep1 = new ExtendedProperties();
ep1.addProperty("one", "a");
assertEquals(1, ep1.size());
assertEquals(1, ep1.getVector("one").size());
assertEquals("a", ep1.getVector("one").get(0));
assertEquals(1, ep1.getList("one").size());
assertEquals("a", ep1.getList("one").get(0));
ep1.addProperty("one", Boolean.TRUE);
assertEquals(1, ep1.size());
assertEquals(2, ep1.getVector("one").size());
assertEquals("a", ep1.getVector("one").get(0));
assertEquals(Boolean.TRUE, ep1.getVector("one").get(1));
assertEquals(2, ep1.getList("one").size());
assertEquals("a", ep1.getList("one").get(0));
assertEquals(Boolean.TRUE, ep1.getList("one").get(1));
ep1.addProperty("one", "c,d");
assertEquals(1, ep1.size());
assertEquals(4, ep1.getVector("one").size());
assertEquals("a", ep1.getVector("one").get(0));
assertEquals(Boolean.TRUE, ep1.getVector("one").get(1));
assertEquals("c", ep1.getVector("one").get(2));
assertEquals("d", ep1.getVector("one").get(3));
assertEquals(4, ep1.getList("one").size());
assertEquals("a", ep1.getList("one").get(0));
assertEquals(Boolean.TRUE, ep1.getList("one").get(1));
assertEquals("c", ep1.getList("one").get(2));
assertEquals("d", ep1.getList("one").get(3));
}
public void testInheritDefaultProperties() {
Properties defaults = new Properties();
defaults.setProperty("resource.loader", "class");
Properties properties = new Properties(defaults);
properties.setProperty("test", "foo");
ExtendedProperties extended = ExtendedProperties.convertProperties(properties);
assertEquals("foo", extended.getString("test"));
assertEquals("class", extended.getString("resource.loader"));
}
}