/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.core.util;
import org.mule.tck.junit4.AbstractMuleTestCase;
import org.mule.tck.size.SmallTest;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@SmallTest
public class MapCombinerTestCase extends AbstractMuleTestCase {
@Test
public void testBasicMerge() {
doTestMerge(new MapCombiner(), "[a:[b:B,c:C]]", "[a:[d:D]]", "[a:[b:B,c:C,d:D]]");
}
@Test
public void testOverwrite() {
MapCombiner combiner = new MapCombiner();
combiner.setMaxDepth(0);
doTestMerge(combiner, "[a:[b:B,c:C]]", "[a:[d:D]]", "[a:[d:D]]");
}
@Test
public void testDeepMerge() {
doTestMerge(new MapCombiner(), "[a:[b:B,c:C,d:[e:E,f:F]]]", "[a:[d:[g:G]]]", "[a:[b:B,c:C,d:[e:E,f:F,g:G]]]");
}
@Test
public void testRestrictedMerge() {
MapCombiner combiner = new MapCombiner();
combiner.setMaxDepth(1);
doTestMerge(combiner, "[a:[b:B,c:C,d:[e:E,f:F]]]", "[a:[d:[g:G]]]", "[a:[b:B,c:C,d:[g:G]]]");
}
@Test
public void testMergeLists() {
doTestMerge(new MapCombiner(), "[a:(b,c)]", "[a:(d)]", "[a:(b,c,d)]");
}
protected void doTestMerge(MapCombiner combiner, String spec1, String spec2, String specResult) {
Map map1 = buildMap(spec1);
Map map2 = buildMap(spec2);
Map map3 = buildMap(specResult);
combiner.setList(new LinkedList());
combiner.getList().add(map1);
combiner.getList().add(map2);
assertEquals(combiner, map3);
}
@Test
public void testInfrastructure() {
Map map = buildMap("[a:(b,c)]");
assertTrue(map.get("a") instanceof List);
List list = (List) map.get("a");
assertTrue(list.contains("b"));
assertTrue(list.contains("c"));
}
public static Map buildMap(String spec) {
Map map = new HashMap();
String empty = fillMap(map, spec);
assertTrue("after parsing " + spec + " left with " + empty, empty.equals(""));
return map;
}
protected static String fillMap(Map map, String spec) {
spec = drop(spec, "[");
while (!spec.startsWith("]")) {
assertTrue("spec finished early (missing ']'?)", spec.length() > 1);
String key = spec.substring(0, 1);
spec = drop(spec, key);
spec = drop(spec, ":");
if (spec.startsWith("[")) {
Map value = new HashMap();
spec = fillMap(value, spec);
map.put(key, value);
} else if (spec.startsWith("(")) {
List value = new LinkedList();
spec = fillList(value, spec);
map.put(key, value);
} else {
String value = spec.substring(0, 1);
spec = drop(spec, value);
map.put(key, value);
}
if (spec.startsWith(",")) {
spec = drop(spec, ",");
}
}
return drop(spec, "]");
}
protected static String fillList(List list, String spec) {
spec = drop(spec, "(");
while (!spec.startsWith(")")) {
assertTrue("spec finished early (missing ')'?)", spec.length() > 1);
if (spec.startsWith("[")) {
Map value = new HashMap();
spec = fillMap(value, spec);
list.add(value);
} else if (spec.startsWith("(")) {
List value = new LinkedList();
spec = fillList(value, spec);
list.add(value);
} else {
String value = spec.substring(0, 1);
spec = drop(spec, value);
list.add(value);
}
if (spec.startsWith(",")) {
spec = drop(spec, ",");
}
}
return drop(spec, ")");
}
protected static String drop(String spec, String delim) {
assertTrue("expected " + delim + " but spec is " + spec, spec.startsWith(delim));
return spec.substring(1);
}
}