/*******************************************************************************
 *
 * Pentaho Data Integration
 *
 * Copyright (C) 2002-2012 by Pentaho : http://www.pentaho.com
 *
 *******************************************************************************
 *
 * Licensed 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.pentaho.di.core.util;

import java.util.HashMap;
import java.util.Map;

import junit.framework.TestCase;

/**
 * Test class for the basic functionality of StringUtil.
 *
 * @author Sven Boden
 */
public class StringUtilTest extends TestCase
{
	/**
	 *  Test initCap for JIRA PDI-619.
	 */	
	public void testinitCap()
	{
		assertEquals("", StringUtil.initCap(null));
		assertEquals("", StringUtil.initCap(""));
		assertEquals("", StringUtil.initCap("   "));
		
		assertEquals("A word", StringUtil.initCap("a word"));
		assertEquals("A word", StringUtil.initCap("A word"));
		
		assertEquals("Award", StringUtil.initCap("award"));
		assertEquals("Award", StringUtil.initCap("Award"));

		assertEquals("AWard", StringUtil.initCap("aWard"));
		assertEquals("AWard", StringUtil.initCap("AWard"));
	}
	
	
	/**
	 * Create an example map to be used for variable resolution.
	 * 
	 * @return Map of variablenames/values.
	 */
	Map<String, String> createVariables1(String open, String close)
	{
		Map<String, String> map = new HashMap<String, String>();
		
		map.put("EMPTY", "");
		map.put("checkcase", "case1");
		map.put("CheckCase", "case2");
		map.put("CHECKCASE", "case3");
		map.put("VARIABLE_1", "VARIABLE1");
		
		map.put("recursive1", "A" + open + "recursive2" + close);
		map.put("recursive2", "recurse");
		
		map.put("recursive3", open + "recursive4" + close + "B");
		map.put("recursive4", "recurse");

		map.put("recursive5", open + "recursive6" + close + "B");
		map.put("recursive6", "Z" + open + "recursive7" + close);
		map.put("recursive7", "final");		
		
		// endless recursive 
		map.put("recursive_all", open + "recursive_all1" + close + " tail");
		map.put("recursive_all1", open + "recursive_all" + close + " tail1");
		
		return map;
	}
	
	/**
	 * Test the basic substitute call.
	 */
	public void testSubstituteBasic()	
	{
		Map<String, String> map = createVariables1("${", "}");
		assertEquals("||", StringUtil.substitute("|${EMPTY}|", map, "${", "}"));
		assertEquals("|case1|", StringUtil.substitute("|${checkcase}|", map, "${", "}"));
		assertEquals("|case2|", StringUtil.substitute("|${CheckCase}|", map, "${", "}"));
		assertEquals("|case3|", StringUtil.substitute("|${CHECKCASE}|", map, "${", "}"));
		assertEquals("|Arecurse|", StringUtil.substitute("|${recursive1}|", map, "${", "}"));
		assertEquals("|recurseB|", StringUtil.substitute("|${recursive3}|", map, "${", "}"));
		assertEquals("|ZfinalB|", StringUtil.substitute("|${recursive5}|", map, "${", "}"));
		
		try {
		    StringUtil.substitute("|${recursive_all}|", map, "${", "}", 0);
		    fail("recursive check is failing");
		}
		catch ( RuntimeException rex )
		{ }
		
		map = createVariables1("%%", "%%");
		assertEquals("||", StringUtil.substitute("|%%EMPTY%%|", map, "%%", "%%"));
		assertEquals("|case1|", StringUtil.substitute("|%%checkcase%%|", map, "%%", "%%"));
		assertEquals("|case2|", StringUtil.substitute("|%%CheckCase%%|", map, "%%", "%%"));
		assertEquals("|case3|", StringUtil.substitute("|%%CHECKCASE%%|", map, "%%", "%%"));
		assertEquals("|Arecurse|", StringUtil.substitute("|%%recursive1%%|", map, "%%", "%%"));
		assertEquals("|recurseB|", StringUtil.substitute("|%%recursive3%%|", map, "%%", "%%"));
		assertEquals("|ZfinalB|", StringUtil.substitute("|%%recursive5%%|", map, "%%", "%%"));
		
		try {
		    StringUtil.substitute("|%%recursive_all%%|", map, "%%", "%%");
		    fail("recursive check is failing");
		}
		catch ( RuntimeException rex )
		{ }

		map = createVariables1("${", "}");
		assertEquals("||", StringUtil.environmentSubstitute("|%%EMPTY%%|", map));
		assertEquals("|case1|", StringUtil.environmentSubstitute("|%%checkcase%%|", map));
		assertEquals("|case2|", StringUtil.environmentSubstitute("|%%CheckCase%%|", map));
		assertEquals("|case3|", StringUtil.environmentSubstitute("|%%CHECKCASE%%|", map));
		assertEquals("|Arecurse|", StringUtil.environmentSubstitute("|%%recursive1%%|", map));
		assertEquals("|recurseB|", StringUtil.environmentSubstitute("|%%recursive3%%|", map));
		assertEquals("|ZfinalB|", StringUtil.environmentSubstitute("|%%recursive5%%|", map));
		
		try {
		    StringUtil.environmentSubstitute("|%%recursive_all%%|", map);
		    fail("recursive check is failing");
		}
		catch ( RuntimeException rex )
		{ }		
	}
	
	/**
	 * Test isEmpty() call.
	 */
	public void testIsEmpty()	
	{
		assertTrue(StringUtil.isEmpty((String)null));
		assertTrue(StringUtil.isEmpty(""));
		
		assertFalse(StringUtil.isEmpty("A"));
		assertFalse(StringUtil.isEmpty(" A "));
	}

	/**
	 * Test getIndent() call.
	 */
	public void testGetIndent()	
	{
		assertEquals("",    StringUtil.getIndent(0));
		assertEquals(" ",   StringUtil.getIndent(1));
		assertEquals("  ",  StringUtil.getIndent(2));
		assertEquals("   ", StringUtil.getIndent(3));
	}	
}