/*
* 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.apache.sling.caconfig.impl.override;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
public class OverrideStringParserTest {
private static final Map<String,Object> BASICTYPES_MAP = ImmutableMap.<String,Object>builder()
.put("param1", "value1")
.put("param2", "value2")
.put("param3", 555L)
.put("param4", 1.23d)
.put("param5", true)
.build();
private static final Map<String,Object> BASICTYPES_ARRAY_MAP = ImmutableMap.<String,Object>builder()
.put("param1", new String[] { "v1a", "v1b" })
.put("param2", new String[] { "v2a", "v2b" })
.put("param3", new Long[] { 555L, 666L })
.put("param4", new Double[] { 1.23d, 2.34d })
.put("param5", new Boolean[] { true, false })
.put("param6", new String[0])
.build();
@Test
public void testEmptyList() {
List<OverrideItem> result = parse();
assertTrue(result.isEmpty());
}
@Test
public void testBasicTypes() {
List<OverrideItem> result = parse(
"configName/param1=\"value1\"",
"configName/param2=\"value2\"",
"configName/param3=555",
"configName/param4=1.23",
"configName/param5=true");
assertEquals(1, result.size());
OverrideItem item = result.get(0);
assertNull(item.getPath());
assertEquals("configName", item.getConfigName());
assertEquals(BASICTYPES_MAP, item.getProperties());
assertFalse(item.isAllProperties());
}
@Test
public void testBasicTypesArray() {
List<OverrideItem> result = parse(
"config.name/param1=[\"v1a\",\"v1b\"]",
"config.name/param2=[\"v2a\",\"v2b\"]",
"config.name/param3=[555,666]",
"config.name/param4=[1.23,2.34]",
"config.name/param5=[true,false]",
"config.name/param6=[]");
assertEquals(1, result.size());
OverrideItem item = result.get(0);
assertNull(item.getPath());
assertEquals("config.name", item.getConfigName());
for (Map.Entry<String,Object> entry : item.getProperties().entrySet()) {
assertArrayEquals("array " + entry.getKey(), (Object[])BASICTYPES_ARRAY_MAP.get(entry.getKey()), (Object[])item.getProperties().get(entry.getKey()));
}
assertFalse(item.isAllProperties());
}
@Test
public void testBasicTypesJson() {
List<OverrideItem> result = parse(
"configName={\"param1\":\"value1\","
+ "\"param2\":\"value2\","
+ "\"param3\":555,"
+ "\"param4\":1.23,"
+ "\"param5\":true}");
assertEquals(1, result.size());
OverrideItem item = result.get(0);
assertNull(item.getPath());
assertEquals("configName", item.getConfigName());
assertEquals(BASICTYPES_MAP, item.getProperties());
assertTrue(item.isAllProperties());
}
@Test
public void testBasicTypesJsonArray() {
List<OverrideItem> result = parse(
"configName={\"param1\":[\"v1a\",\"v1b\"],"
+ "\"param2\":[\"v2a\",\"v2b\"],"
+ "\"param3\":[555,666],"
+ "\"param4\":[1.23,2.34],"
+ "\"param5\":[true,false],"
+ "\"param6\":[]}");
assertEquals(1, result.size());
OverrideItem item = result.get(0);
assertNull(item.getPath());
assertEquals("configName", item.getConfigName());
for (Map.Entry<String,Object> entry : item.getProperties().entrySet()) {
assertArrayEquals("array " + entry.getKey(), (Object[])BASICTYPES_ARRAY_MAP.get(entry.getKey()), (Object[])item.getProperties().get(entry.getKey()));
}
assertTrue(item.isAllProperties());
}
@Test
public void testWithPath() {
List<OverrideItem> result = parse(
"[/a/b]configName/sub1/param1=\"value1\"",
"configName/sub2/param2=\"value2\"");
assertEquals(2, result.size());
OverrideItem item1 = result.get(0);
assertEquals("/a/b", item1.getPath());
assertEquals("configName/sub1", item1.getConfigName());
assertEquals("value1", item1.getProperties().get("param1"));
assertFalse(item1.isAllProperties());
OverrideItem item2 = result.get(1);
assertNull(item2.getPath());
assertEquals("configName/sub2", item2.getConfigName());
assertEquals("value2", item2.getProperties().get("param2"));
assertFalse(item2.isAllProperties());
}
@Test
public void testCombined() {
List<OverrideItem> result = parse(
"[/a/b]configName/param1=\"value1\"",
"configName/param2=\"value2\"",
"[/a/b]configName={\"param1\":\"value1\","
+ "\"param2\":\"value2\","
+ "\"param3\":555,"
+ "\"param4\":1.23,"
+ "\"param5\":true}");
assertEquals(3, result.size());
OverrideItem item1 = result.get(0);
assertEquals("/a/b", item1.getPath());
assertEquals("configName", item1.getConfigName());
assertEquals("value1", item1.getProperties().get("param1"));
assertFalse(item1.isAllProperties());
OverrideItem item2 = result.get(1);
assertNull(item2.getPath());
assertEquals("configName", item2.getConfigName());
assertEquals("value2", item2.getProperties().get("param2"));
assertFalse(item2.isAllProperties());
OverrideItem item3 = result.get(2);
assertEquals("/a/b", item3.getPath());
assertEquals("configName", item3.getConfigName());
assertEquals(BASICTYPES_MAP, item3.getProperties());
assertTrue(item3.isAllProperties());
}
@Test
public void testInvalidSyntax() {
List<OverrideItem> result = parse(
"/configName/param1=\"value1\"",
"configName/../param1=\"value1\"",
"[/a/b]=\"value1\"",
"[/a/b]configName=\"value1\"",
"[/a/../b]configName/param1=\"value1\"",
"[]configName=\"value1\"",
"configName/param2:\"value2\"",
"configName/param3",
"configName/param3=",
"[[/a/b]]configName/param4=1.23",
"[a/b]configName/param5=true",
"configName/param1=null");
// all ignored
assertEquals(0, result.size());
}
@Test
public void testInvalidJson() {
List<OverrideItem> result = parse(
"configName1={param1:\"value1\"",
"configName1={\"param1/xyz\":\"value1\"}",
"configName1={param1:[\"value1\",123]}",
"configName2={param1:{\"subparam1\":\"value1\"}}",
"configName1={param1:null}",
"configName1={\"param1:\"value1\"}");
// all ignored
assertEquals(0, result.size());
}
private List<OverrideItem> parse(String... values) {
return ImmutableList.copyOf(OverrideStringParser.parse(ImmutableList.copyOf(values)));
}
}