| /* |
| * Copyright 2000-2010 JetBrains s.r.o. |
| * |
| * 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 com.intellij.lang.ant; |
| |
| import com.intellij.lang.ant.dom.PropertiesProvider; |
| import com.intellij.lang.ant.dom.PropertyExpander; |
| import com.intellij.psi.PsiElement; |
| import junit.framework.TestCase; |
| import org.jetbrains.annotations.NotNull; |
| |
| import java.util.Collections; |
| import java.util.Iterator; |
| import java.util.Map; |
| |
| /** |
| * @author Eugene Zhuravlev |
| * Date: Apr 23, 2010 |
| */ |
| public class AntPropertyExpansionTest extends TestCase{ |
| |
| |
| public void testPropertyExpand() { |
| //<property name="a" value="aValue"/> |
| //<property name="b" value="${a}bValue"/> |
| //<property name="c" value="${d}cValue"/> |
| //<property name="d" value="dValue"/> |
| PropertiesProvider[] providers = new PropertiesProvider[] { |
| new PropertiesProviderImpl("a", "aValue"), |
| new PropertiesProviderImpl("b", "${a}bValue"), |
| new PropertiesProviderImpl("c", "${d}cValue"), |
| new PropertiesProviderImpl("d", "dValue"), |
| }; |
| |
| assertEquals("abc", expand(providers, "abc")); |
| assertEquals("aValue", expand(providers, "${a}")); |
| assertEquals("aValuebValue", expand(providers, "${b}")); |
| assertEquals("${d}cValue", expand(providers, "${c}")); |
| assertEquals("dValue", expand(providers, "${d}")); |
| assertEquals("${d}cValuedValue", expand(providers, "${c}${d}")); |
| |
| PropertiesProvider[] providers2 = new PropertiesProvider[] { |
| new PropertiesProviderImpl("loop.me1", "prefix-${loop.me2}"), |
| new PropertiesProviderImpl("loop.me2", "prefix-${loop.me1}"), |
| new PropertiesProviderImpl("loop.me3", "prefix-${loop.me3}"), |
| new PropertiesProviderImpl("aaa", "aaa_val_${bbb}"), |
| new PropertiesProviderImpl("bbb", "bbb_val"), |
| new PropertiesProviderImpl("ccc", "${aaa}_${bbb}"), |
| }; |
| |
| assertEquals("prefix-${loop.me2}", expand(providers2, "${loop.me1}")); |
| assertEquals("prefix-prefix-${loop.me2}", expand(providers2, "${loop.me2}")); |
| assertEquals("prefix-${loop.me3}", expand(providers2, "${loop.me3}")); |
| assertEquals("aaa_val_${bbb}_bbb_val", expand(providers2, "${ccc}")); |
| } |
| |
| private static String expand(PropertiesProvider[] providers, String str) { |
| PropertyExpander expander = new PropertyExpander(str); |
| if (expander.hasPropertiesToExpand()) { |
| for (PropertiesProvider provider : providers) { |
| expander.acceptProvider(provider); |
| if (!expander.hasPropertiesToExpand()) { |
| break; |
| } |
| } |
| } |
| return expander.getResult(); |
| } |
| |
| private static final class PropertiesProviderImpl implements PropertiesProvider{ |
| private final Map<String, String> myMap; |
| |
| PropertiesProviderImpl(String name, String value) { |
| this(Collections.singletonMap(name, value)); |
| } |
| |
| PropertiesProviderImpl(Map<String, String> map) { |
| myMap = map; |
| } |
| |
| @Override |
| @NotNull |
| public Iterator<String> getNamesIterator() { |
| return myMap.keySet().iterator(); |
| } |
| |
| @Override |
| public String getPropertyValue(String propertyName) { |
| return myMap.get(propertyName); |
| } |
| |
| @Override |
| public PsiElement getNavigationElement(String propertyName) { |
| return null; |
| } |
| } |
| } |