// Copyright (c) 2003-present, Jodd Team (http://jodd.org) // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. package jodd.props; import org.junit.Test; import java.io.IOException; import java.util.Arrays; import java.util.Iterator; import java.util.Properties; import static org.junit.Assert.*; public class PropsTest extends BasePropsTest { @Test public void testBasic() throws IOException { Props p = new Props(); p.load(readDataFile("test.props")); assertEquals(17, p.countTotalProperties()); assertEquals("Snow White and the Seven Dwarfs", p.getValue("story")); assertEquals("Walt Disney's New characters in his first full-length production!", p.getValue("Tagline")); assertEquals("C:\\local\\snowwhite.mpg", p.getValue("file")); assertEquals("Snow White, pursued by a jealous queen, hides with the Dwarfs; the queen feeds her a poison apple, but Prince Charming awakens her with a kiss.", p.getValue("plot")); assertEquals("45.7", p.getValue("bashful.weight")); assertEquals("49.5", p.getValue("doc.weight")); assertEquals("Čađavi Žar utf8", p.getValue("comment")); assertEquals("foo\tboo\rzoo\nxxx\ftoo", p.getValue("special-chars")); assertEquals("\\\\a", p.getValue("special2")); assertEquals(3, p.getValue("special2").length()); assertNull(p.getValue("non existing")); Properties prop = new Properties(); p.extractProps(prop, null); assertEquals("1937{c}", prop.getProperty("year")); assertEquals("49.5", prop.getProperty("doc.weight")); assertEquals("Čađavi Žar utf8", prop.getProperty("comment")); } @Test public void testEscapeNewValue() throws IOException { Props p = new Props(); p.setEscapeNewLineValue("<br>"); p.load(readDataFile("test.props")); assertEquals("Snow White, pursued by a jealous queen, hides with the Dwarfs; <br>the queen feeds her a poison apple, but Prince Charming <br>awakens her with a kiss.", p.getValue("plot")); } @Test public void testIgnorePrefixWhitespace() throws IOException { Props p = new Props(); p.setIgnorePrefixWhitespacesOnNewLine(false); p.load(readDataFile("test.props")); assertEquals("Snow White, pursued by a jealous queen, hides with the Dwarfs; \t\tthe queen feeds her a poison apple, but Prince Charming \t\tawakens her with a kiss.", p.getValue("plot")); } @Test public void testProfiles() throws IOException { Props p = new Props(); p.load(readDataFile("test-profiles.props")); assertEquals("one", p.getValue("foo")); assertEquals("one", p.getValue("foo", "non_existing_profile")); assertEquals("one", p.getValue("foo", "qwe")); assertEquals("ten", p.getValue("bar")); assertEquals("12345", p.getValue("vitamine", "aaa")); assertEquals(8, p.countTotalProperties()); assertNull(p.getValue("db.url")); assertEquals("localhost", p.getValue("db.url", "develop")); assertEquals("localhost", p.getValue("db.url", "develop", "deploy")); assertEquals("192.168.1.102", p.getValue("db.url", "deploy", "develop")); assertEquals("192.168.1.102", p.getValue("db.url", "deploy")); Properties prop = new Properties(); p.extractProps(prop, null); assertEquals("one", prop.getProperty("foo")); prop.clear(); p.extractProps(prop, "non_existing"); assertEquals("one", prop.getProperty("foo")); prop.clear(); p.extractProps(prop, "aaa"); assertEquals("12345", prop.getProperty("vitamine")); prop.clear(); p.extractProps(prop, "develop"); assertEquals("localhost", prop.getProperty("db.url")); assertEquals("one", prop.getProperty("foo")); prop.clear(); p.extractProps(prop, "develop", "deploy"); assertEquals("localhost", prop.getProperty("db.url")); assertEquals("one", prop.getProperty("foo")); prop.clear(); p.extractProps(prop, "deploy", "develop"); assertEquals("192.168.1.102", prop.getProperty("db.url")); assertEquals("one", prop.getProperty("foo")); prop.clear(); p.extractProps(prop, "deploy"); assertEquals("192.168.1.102", prop.getProperty("db.url")); assertEquals("one", prop.getProperty("foo")); prop.clear(); p.setActiveProfiles("deploy"); p.extractSubProps(prop, "db.*"); assertEquals(2, prop.size()); } @Test public void testDefaultProfile() { Props p = new Props(); p.load( "key1=hello\n" + "key1<one>=Hi!\n" + " \n" + "@profiles=one"); assertEquals("Hi!", p.getValue("key1")); assertEquals("Hi!", p.getValue("key1", "one")); } @Test public void testNestedProfiles() throws IOException { Props p = new Props(); p.load(readDataFile("test-profiles.props")); assertEquals("hello", p.getBaseValue("key1")); assertEquals("hello", p.getValue("key1")); assertEquals("Hi!", p.getValue("key1", "one")); assertEquals("Hola!", p.getValue("key1", "one.two")); assertEquals("world", p.getValue("key2", "one.two")); assertNull(p.getValue("key2", "one")); assertEquals("Grazias", p.getValue("key3", "one.two")); assertEquals("Grazias", p.getValue("key3", "one")); Properties prop = new Properties(); p.extractProps(prop); assertEquals(3, prop.size()); assertEquals("hello", prop.getProperty("key1")); prop.clear(); p.extractProps(prop, "one"); assertEquals(3 + 1, prop.size()); assertEquals("Hi!", prop.getProperty("key1")); assertEquals("Grazias", prop.getProperty("key3")); prop.clear(); p.extractProps(prop, "one.two"); assertEquals(3 + 2, prop.size()); assertEquals("Hola!", prop.getProperty("key1")); assertEquals("world", prop.getProperty("key2")); assertEquals("Grazias", prop.getProperty("key3")); } @Test public void testMacros() throws IOException { Props p = new Props(); p.load(readDataFile("test2.props")); assertEquals("/roo/mypath", p.getValue("data.mypath")); assertEquals("/app/data", p.getValue("data.path")); assertEquals("/app/data2", p.getValue("data.path", "@prof1")); assertEquals("/foo/data3", p.getValue("data.path", "@prof2")); assertEquals("/roo/re", p.getValue("data.path", "@p1")); assertEquals("/app/re", p.getValue("data.path", "@p2")); Properties prop = new Properties(); p.extractProps(prop, "@prof2"); assertEquals("/foo/data3", prop.getProperty("data.path")); } @Test public void testMacrosNew() throws IOException { Props p = new Props(); p.load(readDataFile("test2.props")); assertEquals("/app/data", p.getValue("data.path")); assertEquals("/app/data2", p.getValue("data.path", "@prof1")); assertEquals("/foo/data3", p.getValue("data.path", "@prof2")); assertEquals("/roo/re", p.getValue("data.path", "@p1")); assertEquals("/app/re", p.getValue("data.path", "@p2")); Properties prop = new Properties(); p.extractProps(prop, "@prof2"); assertEquals("/foo/data3", prop.getProperty("data.path")); // activate profiles p.setActiveProfiles("@prof2"); assertEquals("/foo/data3", p.getValue("data.path", "@prof2")); p.setActiveProfiles("@p1", "@p2"); assertEquals("/app/re", p.getValue("data.path", "@p2")); } @Test public void testMacros2() throws IOException { Props p = new Props(); p.setValue("key1", "**${key${key3}}**"); p.setValue("key3", "2"); p.setValue("key2", "++++"); assertEquals("**++++**", p.getValue("key1")); } @Test public void testMacroNotExist() { Props p = new Props(); p.setValue("mac1", "value1"); p.setValue("key1", "${mac1}"); p.setValue("key2", "${mac2}"); assertEquals("value1", p.getValue("mac1")); assertEquals("value1", p.getValue("key1")); assertEquals("${mac2}", p.getValue("key2")); } @Test public void testMacroNotExistIgnoreMissing() { Props p = new Props(); p.setIgnoreMissingMacros(true); p.setValue("mac1", "value1"); p.setValue("key1", "${mac1}"); p.setValue("key2", "${mac2}"); assertEquals("value1", p.getValue("mac1")); assertEquals("value1", p.getValue("key1")); assertNull(p.getValue("key2")); } @Test public void testMacroNotExistSkipEmpty() { Props p = new Props(); p.setIgnoreMissingMacros(true); p.setSkipEmptyProps(false); p.setValue("mac1", "value1"); p.setValue("key1", "${mac1}"); p.setValue("key2", "${mac2}"); assertEquals("value1", p.getValue("mac1")); assertEquals("value1", p.getValue("key1")); assertEquals("", p.getValue("key2")); } @Test public void testClone() throws IOException { Props p = new Props(); p.load(readDataFile("test2.props")); Props p2 = p.clone(); p2.load(readDataFile("test.props")); assertEquals(3, p.countTotalProperties()); assertEquals(20, p2.countTotalProperties()); assertEquals("/app/data", p.getValue("data.path")); assertEquals("/app/data2", p.getValue("data.path", "@prof1")); assertEquals("/foo/data3", p.getValue("data.path", "@prof2")); } @Test public void testEmpty() throws IOException { Props p = new Props(); p.setSkipEmptyProps(false); p.load(readDataFile("test-e.props")); assertEquals(2, p.countTotalProperties()); assertEquals("good", p.getValue("ok")); assertEquals("", p.getValue("empty")); } @Test public void testActiveProfiles() throws IOException { Props p = loadProps("test-actp.props"); assertEquals("hello", p.getBaseValue("key1")); assertEquals("Hola!", p.getValue("key1")); assertEquals("world", p.getValue("key2")); assertEquals(1, p.getActiveProfiles().length); assertEquals("one.two", p.getActiveProfiles()[0]); } @Test public void testProperties() throws IOException { Props p = loadProps("test.properties"); assertEquals("value", p.getValue("one")); assertEquals("long valuein two lines", p.getValue("two")); assertEquals("some utf8 šđžčć", p.getValue("three")); } @Test public void testAdd() { Props p = new Props(); p.setValue("key1", "val${key2}"); assertEquals("val${key2}", p.getValue("key1")); assertNull(p.getValue("key1${key2}")); p.setValue("key2", "hurrey\tme!"); assertEquals("valhurrey\tme!", p.getValue("key1")); } @Test public void testDuplicate() throws IOException { Props p = new Props(); loadProps(p, "test-dupl.props"); assertEquals("three", p.getValue("foo")); assertEquals("everywhere", p.getValue("bar", "prof")); p = new Props(); p.setAppendDuplicateProps(true); loadProps(p, "test-dupl.props"); assertEquals("one,two,three", p.getValue("foo")); assertEquals("here,there,everywhere", p.getValue("bar", "prof")); } @Test public void testDoubleLoadsAndResolves() { Props props = new Props(); props.load("pojoBean2.val2=123"); props.load("pojoBean2.val1=\\\\${pojo}"); assertEquals("123", props.getValue("pojoBean2.val2")); // BeanTemplate resolves \${foo} to ${foo} // we must be sure that escaped value is not resolved. assertEquals("\\${pojo}", props.getValue("pojoBean2.val1")); props.load("pojoBean2.val1=\\\\${pojo} ${pojo}"); assertEquals(2, props.countTotalProperties()); assertEquals("\\${pojo} ${pojo}", props.getValue("pojoBean2.val1")); } @Test public void testSystemProperties() { Props props = new Props(); assertEquals(0, props.countTotalProperties()); assertNull(props.getValue("user.dir")); props.loadSystemProperties("sys"); assertTrue(props.countTotalProperties() > 0); assertNotNull(props.getValue("sys.user.dir")); } @Test public void testEnvironment() { Props props = new Props(); assertEquals(0, props.countTotalProperties()); props.loadEnvironment("env"); assertTrue(props.countTotalProperties() > 0); } @Test public void testValueWithBracket() throws IOException { Props p = new Props(); p.load(readDataFile("test3.props")); assertEquals("info@jodd.org;patrick@jodd.org", p.getValue("email.from")); assertEquals("[ERROR] Got %s exceptions", p.getValue("email.subject")); assertEquals("line1line2line3", p.getValue("email.text")); p = new Props(); p.setIgnorePrefixWhitespacesOnNewLine(false); p.load(readDataFile("test3.props")); assertEquals("info@jodd.org;patrick@jodd.org", p.getValue("email.from")); assertEquals("[ERROR] Got %s exceptions", p.getValue("email.subject")); assertEquals("line1\tline2line3", p.getValue("email.text")); p = new Props(); p.setIgnorePrefixWhitespacesOnNewLine(false); p.setEscapeNewLineValue("\n"); p.load(readDataFile("test3.props")); assertEquals("info@jodd.org;patrick@jodd.org", p.getValue("email.from")); assertEquals("[ERROR] Got %s exceptions", p.getValue("email.subject")); assertEquals("line1\n\tline2\nline3", p.getValue("email.text")); } @Test public void testMultilineValue() throws IOException { Props p = new Props(); p.setValueTrimLeft(true); p.load(readDataFile("test3.props")); assertEquals("\r\n\tHello from\r\n\tthe multiline\r\n\tvalue\r\n", p.getValue("email.footer")); assertEquals("aaa", p.getValue("email.header")); } @Test public void testAppend() { Props p = new Props(); p.setAppendDuplicateProps(true); p.load("foo=123\nfoo=456"); assertEquals("123,456", p.getValue("foo")); p = new Props(); p.load("foo=123\nfoo+=456"); assertEquals("123,456", p.getValue("foo")); } @Test public void testAppend2() { Props p = new Props(); p.setAppendDuplicateProps(false); p.load("foo=one\nfoo=two\nfoo+=three"); assertEquals("two,three", p.getValue("foo")); p = new Props(); p.setAppendDuplicateProps(true); p.load("foo=one\nfoo=two\nfoo+=three"); assertEquals("one,two,three", p.getValue("foo")); p = new Props(); p.setAppendDuplicateProps(false); p.load("foo=one\nfoo=two\nfoo+=three\nfoo=four"); assertEquals("four", p.getValue("foo")); } @Test public void testAppendEof() { Props p = new Props(); p.setAppendDuplicateProps(false); p.load("foo=one\nfoo=two\nfoo+"); assertEquals("two", p.getValue("foo")); } @Test public void testActiveProfileBeforeInit() { Props p = new Props(); p.setActiveProfiles("xxx"); p.load("foo=one"); assertNotNull(p.getActiveProfiles()); assertEquals("xxx", p.getActiveProfiles()[0]); } @Test public void testDoubleInitialization() { Props p = new Props(); p.setValue("bar", "two.${foo}.${wer}"); p.setValue("foo", "one"); assertEquals("two.one.${wer}", p.getValue("bar")); p.setValue("wer", "zero"); assertEquals("two.one.zero", p.getValue("bar")); } @Test public void testCategoriesInValues() { Props p = new Props(); p.load( "[section]\n" + "foo = aaa, [bbb:ccc]\n" + "bar = teapot"); assertEquals("aaa, [bbb:ccc]", p.getValue("section.foo")); assertEquals("teapot", p.getValue("section.bar")); } @Test public void testDuplicatedValue() { Props p = new Props(); p.setValue("foo", "bar"); p.setValue("foo", "aaa", "prof1"); p.setValue("foo", "bbb", "prof2"); assertEquals("bar", p.getValue("foo")); assertEquals("aaa", p.getValue("foo", "prof1")); assertEquals("bbb", p.getValue("foo", "prof2")); assertEquals("aaa", p.getValue("foo", "prof1", "prof2")); assertEquals("bbb", p.getValue("foo", "prof2", "prof1")); } @Test public void testIteratorEmpty() { Props p = new Props(); Iterator<PropsEntry> it = p.iterator(); assertFalse(it.hasNext()); try { it.next(); fail(); } catch (Exception ignore) { } } @Test public void testIteratorSkip() { Props p = new Props(); p.load("zorg<prof2>=zero\n" + "foo=one\n" + "bar=two\n" + "foo<prof1>=zero"); Iterator<PropsEntry> it = p.iterator(); assertTrue(it.hasNext()); PropsEntry pe = it.next(); assertEquals("foo", pe.getKey()); pe = it.next(); assertEquals("bar", pe.getKey()); assertFalse(it.hasNext()); try { it.next(); fail(); } catch (Exception ignore) { } p.setActiveProfiles("prof1", "prof2"); it = p.iterator(); assertEquals("zorg", it.next().getKey()); assertEquals("foo", it.next().getKey()); assertEquals("bar", it.next().getKey()); assertEquals("foo", it.next().getKey()); assertFalse(it.hasNext()); it = p.entries().activeProfiles().skipDuplicatesByValue().iterator(); assertEquals("zorg", it.next().getKey()); assertEquals("bar", it.next().getKey()); assertEquals("foo", it.next().getKey()); assertFalse(it.hasNext()); it = p.entries().profile("prof1").skipDuplicatesByValue().iterator(); assertEquals("bar", it.next().getKey()); assertEquals("foo", it.next().getKey()); assertFalse(it.hasNext()); it = p.entries().activeProfiles().skipDuplicatesByPosition().iterator(); assertEquals("zorg", it.next().getKey()); assertEquals("foo", it.next().getKey()); assertEquals("bar", it.next().getKey()); assertFalse(it.hasNext()); it = p.entries().profile("prof1").skipDuplicatesByPosition().iterator(); assertEquals("foo", it.next().getKey()); assertEquals("bar", it.next().getKey()); assertFalse(it.hasNext()); } @Test public void testIteratorSections() { Props p = new Props(); p.load("aaa.zorg<prof2>=zero\n" + "bbb.foo=one\n" + "ccc.bar=two\n" + "bbb.foo<prof1>=zero"); p.setActiveProfiles("prof1", "prof2"); Iterator<PropsEntry> it = p.entries().section("bbb").profile("prof1", "prof2").iterator(); assertEquals("bbb.foo", it.next().getKey()); assertEquals("bbb.foo", it.next().getKey()); assertFalse(it.hasNext()); } @Test public void testGetAllProfiles() { Props p = new Props(); p.load("zorg<prof2>=zero\n" + "foo=one\n" + "bar=two\n" + "foo<prof1>=zero"); String[] profiles = p.getAllProfiles(); Arrays.sort(profiles); assertArrayEquals(new String[] {"prof1", "prof2"}, profiles); } @Test public void testGetProfilesForKey() { Props p = new Props(); p.load("zorg<prof2>=zero\n" + "foo=one\n" + "bar=two\n" + "[foo<prof1>]\n" + "info=zero\n" + "info2=zero2"); String[] profiles = p.getProfilesFor("zorg"); assertEquals(1, profiles.length); assertEquals("prof2", profiles[0]); profiles = p.getProfilesFor("zor*"); assertEquals(1, profiles.length); assertEquals("prof2", profiles[0]); profiles = p.getProfilesFor("foo"); assertEquals(0, profiles.length); profiles = p.getProfilesFor("foo.*"); assertEquals(1, profiles.length); assertEquals("prof1", profiles[0]); profiles = p.getProfilesFor("foo*"); assertEquals(1, profiles.length); assertEquals("prof1", profiles[0]); } @Test public void testChangeActiveProfile() { Props p = new Props(); p.load("foo=one\n" + "bar=two\n" + "foo<prof1>=aaa\n" + "foo<prof2>=bbb\n"); p.setActiveProfiles("prof1"); assertEquals("aaa", p.getValue("foo")); p.setActiveProfiles("prof2"); assertEquals("bbb", p.getValue("foo")); } @Test public void testWeirdKey() { Props p = new Props(); p.load("org.jodd.Foo@Bar=one\n" + "org.jodd.Foo@*Bar=two\n" + "org.jodd.Foo@*Bar\\#me=three\n"); assertEquals("one", p.getValue("org.jodd.Foo@Bar")); assertEquals("two", p.getValue("org.jodd.Foo@*Bar")); assertEquals("three", p.getValue("org.jodd.Foo@*Bar#me")); } @Test public void testMultipleProfilesAtOnce() { Props p = new Props(); p.load( "foo.one=111\n" + "foo.one<pr1>=111222\n" + "foo.one<pr2>=111222333\n" ); p.setActiveProfiles(null); assertEquals("111", p.getValue("foo.one")); p.setActiveProfiles("pr1"); assertEquals("111222", p.getValue("foo.one")); p.setActiveProfiles("pr2"); assertEquals("111222333", p.getValue("foo.one")); p.setActiveProfiles("pr1", "pr2"); assertEquals("111222", p.getValue("foo.one")); p.setActiveProfiles("pr2", "pr1"); assertEquals("111222333", p.getValue("foo.one")); } @Test public void testMacrosAndProfiles() { Props p = new Props(); p.load( "one=111\n" + "one<pr1>=111222\n" + "one<pr2>=111222333\n" + "wow=${one}" ); p.setActiveProfiles(null); assertEquals("111", p.getValue("wow")); p.setActiveProfiles("pr1"); assertEquals("111222", p.getValue("wow")); p.setActiveProfiles("pr2"); assertEquals("111222333", p.getValue("wow")); p.setActiveProfiles("pr1", "pr2"); assertEquals("111222", p.getValue("wow")); } @Test public void testMacrosAndProfilesAsBefore() { Props p = new Props(); p.load( "one=111\n" + "one<pr1>=111222\n" + "one<pr2>=111222333\n" + "wow=${one}" ); p.setActiveProfiles(null); assertEquals("111", p.getValue("wow")); p.setActiveProfiles("pr1"); assertEquals("111222", p.getValue("wow")); p.setActiveProfiles("pr2"); assertEquals("111222333", p.getValue("wow")); p.setActiveProfiles("pr1", "pr2"); assertEquals("111222", p.getValue("wow")); // wow needs to be defined in a profile to get the profile value in macro // NOT ANYMORE! p = new Props(); p.load( "one=111\n" + "one<pr1>=111222\n" + "one<pr2>=111222333\n" + "wow<pr1>=${one}" ); p.setActiveProfiles(null); assertEquals(null, p.getValue("wow")); p.setActiveProfiles("pr1"); assertEquals("111222", p.getValue("wow")); p.setActiveProfiles("pr2"); assertEquals(null, p.getValue("wow")); p.setActiveProfiles("pr1", "pr2"); assertEquals("111222", p.getValue("wow")); p = new Props(); p.load( "one=111\n" + "one<pr1>=111222\n" + "one<pr2>=111222333\n" + "wow<pr1><pr2>=${one}" ); p.setActiveProfiles(null); assertEquals(null, p.getValue("wow")); p.setActiveProfiles("pr1"); assertEquals("111222", p.getValue("wow")); p.setActiveProfiles("pr2"); assertEquals("111222333", p.getValue("wow")); p.setActiveProfiles("pr1", "pr2"); assertEquals("111222", p.getValue("wow")); } @Test public void testCopy() { Props p = new Props(); p.load("foo.one=111\n" + "fig.two=222\n" + "bar <= foo, fig"); assertEquals("111", p.getValue("foo.one")); assertEquals("222", p.getValue("fig.two")); assertEquals("111", p.getValue("bar.one")); assertEquals("222", p.getValue("bar.two")); } @Test public void testCopyWithProfiles() { Props p = new Props(); p.load( "foo.one=111\n" + "foo.one<pr1>=111111\n" + "foo.one<pr2>=111111111\n" + "fig.two<pr2>=222\n" + "bar <= foo, fig"); assertEquals("111", p.getValue("foo.one")); assertEquals(null, p.getValue("fig.two")); assertEquals("111", p.getValue("bar.one")); assertEquals(null, p.getValue("bar.two")); p = new Props(); p.load( "foo.one=111\n" + "foo.one<pr1>=111111\n" + "foo.one<pr2>=111111111\n" + "fig.two<pr2>=222\n" + "bar<pr1> <= foo, fig"); p.setActiveProfiles("pr1"); assertEquals("111111", p.getValue("foo.one")); assertEquals(null, p.getValue("fig.two")); assertEquals("111111", p.getValue("bar.one")); assertEquals(null, p.getValue("bar.two")); p = new Props(); p.load( "foo.one=111\n" + "foo.one<pr1>=111111\n" + "foo.one<pr2>=111111111\n" + "fig.two<pr2>=222\n" + "bar<pr1><pr2> <= foo, fig\n" ); p.setActiveProfiles("pr1", "pr2"); assertEquals("111111", p.getValue("foo.one")); assertEquals("222", p.getValue("fig.two")); assertEquals("111111", p.getValue("bar.one")); assertEquals("222", p.getValue("bar.two")); } @Test public void testCopyEmpty() { Props p = new Props(); p.load("foo.one=111\n" + "fig.two=222\n" + "[bar]\n" + "<= foo, fig"); assertEquals("111", p.getValue("foo.one")); assertEquals("222", p.getValue("fig.two")); assertEquals("111", p.getValue("bar.one")); assertEquals("222", p.getValue("bar.two")); } @Test public void testIssue78() { String data = "@profiles=o\n" + "\n" + "prefix<o> = is Good\n" + "prefix<l> = is very Good\n" + "\n" + "[user]\n" + "name = jodd ${prefix}"; Props props = new Props(); props.load(data); assertEquals("jodd is Good", props.getValue("user.name")); } @Test public void testAdditionalEquals() { String data = "account-dn = cn=accountname,ou=users,o=organization\n"; Props props = new Props(); props.load(data); assertEquals("cn=accountname,ou=users,o=organization", props.getValue("account-dn")); } }