blob: 5a163f0d7e88c88802d9dcb3170f143d1a95ece7 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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 org.ofbiz.base.util.collections.test;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.math.BigDecimal;
import org.ofbiz.base.lang.SourceMonitored;
import org.ofbiz.base.test.GenericTestCaseBase;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.collections.FlexibleMapAccessor;
import org.ofbiz.base.util.string.FlexibleStringExpander;
@SourceMonitored
public class FlexibleMapAccessorTests extends GenericTestCaseBase {
private static final Locale localeToTest = new Locale("en", "US");
private static FlexibleMapAccessor<?> fmaEmpty = FlexibleMapAccessor.getInstance("");
private static FlexibleMapAccessor<?> fmaNull = FlexibleMapAccessor.getInstance(null);
public FlexibleMapAccessorTests(String name) {
super(name);
}
private static <T> void fmaTest(String label, String getText, String fseText, T var, String value) {
fmaTest(label, getText, getText, fseText, null, var, value);
}
private static <T> void fmaTest(String label, String getText, String putText, String fseText, Locale locale, T var, String value) {
Map<String, Object> testMap = new HashMap<String, Object>();
FlexibleMapAccessor<T> fmaGet = FlexibleMapAccessor.getInstance(getText);
assertEquals(label + ":get-original-name", getText, fmaGet.getOriginalName());
assertEquals(label + ":get-isEmpty", false, fmaGet.isEmpty());
assertEquals(label + ":get-instance-equals", fmaGet, FlexibleMapAccessor.getInstance(getText));
assertEquals(label + ":toString", getText, fmaGet.toString());
assertNotEquals(label + ":get-not-equals-empty", fmaEmpty, fmaGet);
assertNotEquals(label + ":get-not-equals-null", fmaNull, fmaGet);
assertNotEquals(label + ":empty-not-equals-get", fmaGet, fmaEmpty);
assertNotEquals(label + ":null-not-equals-get", fmaGet, fmaNull);
assertNotEquals(label + ":get-not-equals-other", fmaGet, FlexibleMapAccessorTests.class);
assertEquals(label + ":get-toString", getText, fmaGet.toString());
FlexibleMapAccessor<T> fmaGetAscending = FlexibleMapAccessor.getInstance("+" + getText);
assertEquals(label + ":get-ascending-toString", "+" + getText, fmaGetAscending.toString());
assertTrue(label + ":get-ascending-isAscending", fmaGetAscending.getIsAscending());
FlexibleMapAccessor<T> fmaGetDescending = FlexibleMapAccessor.getInstance("-" + getText);
assertEquals(label + ":get-descending-toString", "-" + getText, fmaGetDescending.toString());
assertFalse(label + ":get-decending-isAscending", fmaGetDescending.getIsAscending());
FlexibleMapAccessor<T> fmaPut = FlexibleMapAccessor.getInstance(putText);
assertEquals(label + ":put-toString", putText, fmaPut.toString());
assertEquals(label + ":put-original-name", putText, fmaPut.getOriginalName());
assertEquals(label + ":put-isEmpty", false, fmaPut.isEmpty());
assertEquals(label + ":put-instance-equals", fmaPut, FlexibleMapAccessor.getInstance(putText));
assertNotEquals(label + ":put-not-equals-other", fmaPut, FlexibleMapAccessorTests.class);
FlexibleStringExpander fse = FlexibleStringExpander.getInstance(fseText);
if (locale == null) {
assertNull(label + ":get-initial", fmaGet.get(testMap));
fmaPut.put(testMap, var);
assertFalse(label + ":testMap-not-empty", testMap.isEmpty());
assertEquals(label + ":get", var, fmaGet.get(testMap));
assertEquals(label, value, fse.expandString(testMap));
assertEquals(label + ":remove", var, fmaGet.remove(testMap));
assertNull(label + ":remove-not-exist", fmaGet.remove(testMap));
} else {
fmaPut.put(testMap, var);
assertFalse(label + ":testMap-not-empty", testMap.isEmpty());
assertEquals(label + ":get", value, fmaGet.get(testMap, locale));
// BUG: fmaGet modifies testMap, even tho it shouldn't
assertEquals(label + ":get", value, fmaGet.get(testMap, null));
assertEquals(label, value, fse.expandString(testMap, locale));
}
testMap.clear();
fmaPut.put(testMap, null);
assertFalse(label + ":testMap-not-empty-put-null", testMap.isEmpty());
if (locale == null) {
assertNull(label + ":get-put-null", fmaGet.get(testMap));
}
testMap.clear();
Exception caught = null;
try {
fmaPut.put(null, var);
} catch (Exception e) {
caught = e;
} finally {
assertNotNull(label + ":put-null-map", caught);
assertTrue(label + ":put-null-map-isEmpty", testMap.isEmpty());
}
Set<FlexibleMapAccessor<?>> set = new HashSet<FlexibleMapAccessor<?>>();
assertFalse(label + ":not-in-set", set.contains(fmaGet));
set.add(fmaGet);
assertTrue(label + ":in-set", set.contains(fmaGet));
}
private static void fmaEmptyTest(String label, String text) {
FlexibleMapAccessor<Class<?>> fma = FlexibleMapAccessor.getInstance(text);
assertTrue(label + ":isEmpty", fma.isEmpty());
Map<String, Object> testMap = new HashMap<String, Object>();
assertNull(label + ":get", fma.get(null));
assertNull(label + ":get", fma.get(testMap));
assertTrue(label + ":map-isEmpty-initial", testMap.isEmpty());
fma.put(testMap, FlexibleMapAccessorTests.class);
assertTrue(label + ":map-isEmpty-map", testMap.isEmpty());
fma.put(null, FlexibleMapAccessorTests.class);
assertTrue(label + ":map-isEmpty-null", testMap.isEmpty());
assertSame(label + ":same-null", fmaNull, fma);
assertSame(label + ":same-empty", fmaEmpty, fma);
assertEquals(label + ":original-name", "", fma.getOriginalName());
assertNull(label + ":remove", fma.remove(testMap));
assertNotNull(label + ":toString", fma.toString());
}
// These tests rely upon FlexibleStringExpander, so they
// should follow the FlexibleStringExpander tests.
public void testFlexibleMapAccessor() {
fmaEmptyTest("fmaEmpty", "");
fmaEmptyTest("fmaNull", null);
fmaEmptyTest("fma\"null\"", "null");
fmaTest("UEL auto-vivify Map", "parameters.var", "Hello ${parameters.var}!", "World", "Hello World!");
fmaTest("UEL auto-vivify List", "parameters.someList[0]", "parameters.someList[+0]", "Hello ${parameters.someList[0]}!", null, "World", "Hello World!");
fmaTest("fse", "para${'meter'}s.var", "Hello ${parameters.var}!", "World", "Hello World!");
fmaTest("foo", "'The total is ${total?currency(USD)}.'", "total", "The total is ${total?currency(USD)}.", localeToTest, new BigDecimal("12345678.90"), "The total is $12,345,678.90.");
assertTrue("containsNestedExpression method returns true", FlexibleMapAccessor.getInstance("Hello ${parameters.var}!").containsNestedExpression());
assertFalse("containsNestedExpression method returns false", FlexibleMapAccessor.getInstance("Hello World!").containsNestedExpression());
}
public static class ThrowException {
public Object getValue() throws Exception {
throw new Exception();
}
public void setValue(Object value) throws Exception {
throw new Exception();
}
}
@SuppressWarnings("serial")
public static class CantRemoveMap<K, V> extends HashMap<K, V> {
@Override
public V get(Object key) {
return super.get(key);
}
@Override
public V put(K key, V value) {
if (value == null) {
throw new IllegalArgumentException();
}
return super.put(key, value);
}
}
public void testVerbosityAndErrors() {
boolean isVerbose = Debug.isOn(Debug.VERBOSE);
try {
Debug.set(Debug.VERBOSE, true);
Map<String, Object> testMap = new CantRemoveMap<String, Object>();
testMap.put("throwException", new ThrowException());
assertNull("no var", FlexibleMapAccessor.getInstance("var").get(testMap));
Object result = FlexibleMapAccessor.getInstance("throwException.value").get(testMap);
assertNull("get null var", result);
FlexibleMapAccessor.getInstance("throwException.value").put(testMap, this);
FlexibleMapAccessor.getInstance("throwException").remove(testMap);
assertNotNull("not removed", testMap.get("throwException"));
} finally {
Debug.set(Debug.VERBOSE, isVerbose);
}
}
}