/* * RHQ Management Platform * Copyright (C) 2014 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package org.rhq.core.util; import java.io.IOException; import java.io.StringReader; import java.util.HashMap; import java.util.Map; import org.testng.Assert; import org.testng.annotations.Test; /** * @author Lukas Krejci * @since 4.13 */ @Test public class TokenReplacingReaderTest { public void testSimple() throws Exception { testExpression("Hello, ${who}!").with("who", "world").matches("Hello, world!"); } public void testTokensInValues() throws Exception { testExpression("Hello, ${who}!").with("who", "${whose} world").with("whose", "my").matches("Hello, my world!"); } @Test(expectedExceptions = IllegalArgumentException.class) public void testInfiniteRecursionAvoidance() throws Exception { testExpression("Hello, ${who}!").with("who", "${who}").parse(); } public void testDefaultValue() throws Exception { testExpression("Hello, ${who:world}!").matches("Hello, world!"); } public void testMultipleChoice() throws Exception { testExpression("Hello, ${blah,who}!").with("who", "world").matches("Hello, world!"); } public void testMultipleChoiceWithDefaultValue() throws Exception { testExpression("Hello, ${blah,who:world}!").matches("Hello, world!"); } public void testEscapesInFreeTextAndNames() throws Exception { testExpression("Hel\\lo, ${who\\} \\${escaped}!").with("who\\", "world").matches("Hel\\lo, world ${escaped}!"); } public void testEscapesInDefaultValues() throws Exception { testExpression("Hello, ${who:world\\}}!").matches("Hello, world}!"); testExpression("Hello, ${who:world\\}s}!").matches("Hello, world}s!"); testExpression("Hello, ${who:\\}worlds}!").matches("Hello, }worlds!"); } public void testColonAsName() throws Exception { testExpression("Hello, ${:}!").with(":", "world").matches("Hello, world!"); testExpression("Hello, ${:who}!").with(":who", "world").matches("Hello, world!"); } public void testDefaultValueInNestedProp() throws Exception { testExpression("Hello, ${who}!").with("who","${guess:world}").matches("Hello, world!"); } private TestCaseBuilder testExpression(String expression) { return new TestCaseBuilder(expression); } private static class TestCaseBuilder { final Map<String, String> tokens = new HashMap<String, String>(); final String expression; private TestCaseBuilder(String expression) { this.expression = expression; } public TestCaseBuilder with(String key, String value) { tokens.put(key, value); return this; } public String parse() throws IOException { TokenReplacingReader rdr = new TokenReplacingReader(new StringReader(expression), tokens); int c; StringBuilder bld = new StringBuilder(); while((c = rdr.read()) >= 0) { bld.append((char)c); } return bld.toString(); } public void matches(String expectedParseResult) throws IOException { Assert.assertEquals(parse(), expectedParseResult, expectedParseResult); } } }