/** * Copyright 2005-2016 Red Hat, Inc. * * Red Hat 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 io.fabric8.karaf.core.properties; import java.util.HashMap; import java.util.Map; import io.fabric8.karaf.core.properties.function.PropertiesFunction; import org.junit.Assert; import org.junit.Before; import org.junit.Test; public class PlaceholderResolverTest { private PlaceholderResolverImpl resolver; @Before public void setUp() { resolver = new PlaceholderResolverImpl(); resolver.bindFunction(new Map1()); resolver.bindFunction(new Map2()); } @Test public void testResolve() { Assert.assertEquals("hello1", resolver.resolve("map1:prop1")); Assert.assertEquals("hello2", resolver.resolve("map2:prop1")); Assert.assertNull(resolver.resolve("map1:noReplace")); } @Test public void testReplace() { Assert.assertEquals("hello1 world2", resolver.replace("$[map1:prop1] $[map2:prop2]")); Assert.assertEquals("hello2 world1", resolver.replace("$[map2:prop1] $[map1:prop2]")); Assert.assertEquals("hello nested world!", resolver.replace("$[map2:prop-$[map1:prop5]]")); } @Test(expected = IllegalStateException.class) public void tesInfiniteLoopSimple() { resolver.replace("$[map1:prop6]"); } @Test(expected = IllegalStateException.class) public void tesInfiniteLoopPingPong() { resolver.replace("$[map1:prop7]"); } @Test public void testNoReplace() { Assert.assertEquals("$[map1:noReplace]", resolver.replace("$[map1:noReplace]")); } @Test public void testReplaceAll() { Map<String, Object> map = new HashMap<>(); map.put("key1", "$[map1:prop1] $[map2:prop2]"); map.put("key2", "$[map2:prop1] $[map1:prop2]"); map.put("key3", "$[map2:prop-$[map1:prop5]]"); map.put("key4", 1); map.put("key5", "no replace"); Assert.assertTrue(resolver.replaceAll(map)); Assert.assertEquals("hello1 world2", map.get("key1")); Assert.assertEquals("hello2 world1", map.get("key2")); Assert.assertEquals("hello nested world!", map.get("key3")); Assert.assertEquals(1, map.get("key4")); Assert.assertEquals("no replace", map.get("key5")); } // ************************************************************************* // // ************************************************************************* private class Map1 implements PropertiesFunction { private final Map<String, String> map; public Map1() { map = new HashMap<>(); map.put("prop1","hello1"); map.put("prop2","world1"); map.put("prop3","10"); map.put("prop4","20"); map.put("prop5","nested"); map.put("prop6","$[map1:prop6]"); map.put("prop7","$[map1:prop8]"); map.put("prop8","$[map1:prop7]"); } public String getName() { return "map1"; } @Override public String apply(String remainder) { return map.get(remainder); } } private class Map2 implements PropertiesFunction { private final Map<String, String> map; public Map2() { map = new HashMap<>(); map.put("prop1","hello2"); map.put("prop2","world2"); map.put("prop-nested","hello nested world!"); map.put("prop-recursive-1","$[prop-recursive-2]"); map.put("prop-recursive-2","$[prop-recursive-3]"); map.put("prop-recursive-3","recursive-3"); } public String getName() { return "map2"; } @Override public String apply(String remainder) { return map.get(remainder); } } }