|
|
@@ -11,10 +11,10 @@ import java.util.Arrays;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.TreeMap;
|
|
|
import java.util.regex.Matcher;
|
|
|
import java.util.regex.Pattern;
|
|
|
import net.ranides.assira.generic.Serializer;
|
|
|
-import net.ranides.assira.text.ResolveFormatter;
|
|
|
import net.ranides.assira.text.format.AnsiString;
|
|
|
import org.junit.Test;
|
|
|
import static org.junit.Assert.*;
|
|
|
@@ -58,7 +58,7 @@ public class ResolverTest {
|
|
|
|
|
|
// get: map, list, array
|
|
|
assertEquals((Integer)801, Resolver.get(context, "content.item.hello"));
|
|
|
- assertEquals((Integer)7, Resolver.get(context, "list[1].numbers#seven"));
|
|
|
+ assertEquals((Long)7L, Resolver.get(context, "list[1].numbers#seven"));
|
|
|
assertNull(Resolver.get(context, "list[1].numbers#eight"));
|
|
|
assertEquals("B", Resolver.get(context, "list[1].name"));
|
|
|
assertEquals("b", Resolver.get(context, "array[1].name"));
|
|
|
@@ -149,6 +149,20 @@ public class ResolverTest {
|
|
|
Matcher hit = Pattern.compile("([a-z]+) ([a-z]+) ([a-z]+)").matcher("one two last");
|
|
|
assertTrue(hit.find());
|
|
|
assertEquals("two", Resolver.get(hit, "2"));
|
|
|
+
|
|
|
+ try {
|
|
|
+ Resolver.set(hit, "2", "text");
|
|
|
+ fail("UnsupportedOperationException expected");
|
|
|
+ } catch(UnsupportedOperationException cause) {
|
|
|
+ assertTrue(cause.getMessage().contains("Matcher"));
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ Resolver.set(hit, "2[1]", 'R');
|
|
|
+ fail("UnsupportedOperationException expected");
|
|
|
+ } catch(UnsupportedOperationException cause) {
|
|
|
+ assertTrue(cause.getMessage().contains("CharSequence"));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
@@ -157,18 +171,125 @@ public class ResolverTest {
|
|
|
AnsiString b = new AnsiString("uAdd");
|
|
|
assertEquals('R', Resolver.get(a, "2"));
|
|
|
assertEquals('A', Resolver.get(b, "1"));
|
|
|
+
|
|
|
+ try {
|
|
|
+ Resolver.set(a, "2", 'S');
|
|
|
+ fail("UnsupportedOperationException expected");
|
|
|
+ } catch(UnsupportedOperationException cause) {
|
|
|
+ assertTrue(cause.getMessage().contains("CharSequence"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testReferenceType() {
|
|
|
+ A context = new A();
|
|
|
+ int numbers[] = new int[]{1,2,3,4,5,6};
|
|
|
+
|
|
|
+ assertEquals("int", Resolver.reference(numbers, "1").type().toString() );
|
|
|
+ assertEquals("int", Resolver.reference(context, "x").type().toString() );
|
|
|
+
|
|
|
+ assertEquals("B", Resolver.reference(context, "content").type().toString() );
|
|
|
+ assertEquals("C", Resolver.reference(context, "array[2]").type().toString() );
|
|
|
+
|
|
|
+ assertEquals("List<C>", Resolver.reference(context, "list").type().toString() );
|
|
|
+ assertEquals("C", Resolver.reference(context, "list[0]").type().toString() );
|
|
|
+ assertEquals("CN", Resolver.reference(context, "list[1]").type().toString() );
|
|
|
+
|
|
|
+ assertEquals("Map<String, Number>", Resolver.reference(context, "list[1].numbers").type().toString() );
|
|
|
+ assertEquals("Integer", Resolver.reference(context, "list[1].numbers#two").type().toString() );
|
|
|
+ assertEquals("Long", Resolver.reference(context, "list[1].numbers#seven").type().toString() );
|
|
|
+ assertEquals("Number", Resolver.reference(context, "list[1].numbers#unknown").type().toString() );
|
|
|
+
|
|
|
+ assertEquals("Map<Integer, C>", Resolver.reference(context, "empty").type().toString() );
|
|
|
+ assertEquals("C", Resolver.reference(context, "empty#22").type().toString() );
|
|
|
+ assertEquals("String", Resolver.reference(context, "empty#22.name").type().toString() );
|
|
|
+
|
|
|
+ assertEquals("Map<Integer, C>", Resolver.reference(context, "nullmap").type().toString() );
|
|
|
+ assertEquals("C", Resolver.reference(context, "nullmap#22").type().toString() );
|
|
|
+ assertEquals("String", Resolver.reference(context, "nullmap#22.name").type().toString() );
|
|
|
+
|
|
|
+ assertEquals("char", Resolver.reference(context, "nullmap#22.name[88]").type().toString() );
|
|
|
+ assertEquals("char", Resolver.reference(context, "list[1].name[0]").type().toString() );
|
|
|
+
|
|
|
+ Matcher hit = Pattern.compile("([a-z]+) ([a-z]+) ([a-z]+)").matcher("one two last");
|
|
|
+ assertTrue(hit.find());
|
|
|
+
|
|
|
+ assertEquals("String", Resolver.reference(hit, "[1]").type().toString());
|
|
|
+ assertEquals("char", Resolver.reference(hit, "[1][1]").type().toString());
|
|
|
+
|
|
|
+ try {
|
|
|
+ Resolver.reference(context, "list[1].numbers[77]").type();
|
|
|
+ fail("IllegalArgumentException expected");
|
|
|
+ } catch(IllegalArgumentException cause) {
|
|
|
+ assertTrue( cause.getMessage().contains("Map<String, Number>") );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testReferencePut() {
|
|
|
+ A context = new A();
|
|
|
+ int numbers[] = new int[]{1,2,3,4,5,6};
|
|
|
+
|
|
|
+ Resolver.reference(numbers, "[1]").put("44");
|
|
|
+ assertEquals(44, numbers[1]);
|
|
|
+
|
|
|
+ Resolver.reference(context, "x").put("55");
|
|
|
+ assertEquals(55, context.x);
|
|
|
+
|
|
|
+ Resolver.reference(context, "list[1].name").put("hello");
|
|
|
+ assertEquals("hello", context.list.get(1).name);
|
|
|
+
|
|
|
+ Resolver.reference(context, "list[1].name").put(99);
|
|
|
+ assertEquals("99", context.list.get(1).name);
|
|
|
+
|
|
|
+ Resolver.reference(context, "list[1].numbers#key").put(14);
|
|
|
+ assertEquals(14, context.list.get(1).numbers.get("key"));
|
|
|
+
|
|
|
+
|
|
|
+ assertEquals("Map<String, Number>", Resolver.reference(context, "list[1].numbers").type().toString());
|
|
|
+ assertEquals("Number", Resolver.reference(context, "list[1].numbers#ikey").type().toString());
|
|
|
+
|
|
|
+ Resolver.reference(context, "list[1].numbers#ikey").put(15L);
|
|
|
+ assertEquals("Integer", Resolver.reference(context, "list[1].numbers#ikey").type().toString());
|
|
|
+ assertEquals(15, context.list.get(1).numbers.get("ikey"));
|
|
|
+
|
|
|
+ Resolver.reference(context, "list[1].numbers#long").put(0x8FFFF0000L);
|
|
|
+ assertEquals("Long", Resolver.reference(context, "list[1].numbers#long").type().toString());
|
|
|
+ assertEquals(0x8FFFF0000L, context.list.get(1).numbers.get("long"));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testReferenceSetGet() {
|
|
|
+ // we tested direct get & set methods so we know that internals are OK
|
|
|
+ // here we just want to be sure, that "reference" delegates correctly
|
|
|
+ int numbers[] = new int[]{1,2,3,4,5,6};
|
|
|
+
|
|
|
+ Resolver.reference(numbers, "[1]").set(44);
|
|
|
+ assertEquals(44, numbers[1]);
|
|
|
+ assertEquals(44, Resolver.reference(numbers, "[1]").get());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testExpression() {
|
|
|
+ assertEquals("list[99].name", Resolver.compile("list[99].name").expression());
|
|
|
+
|
|
|
}
|
|
|
|
|
|
+
|
|
|
private static class A {
|
|
|
public int x = 5;
|
|
|
public int y = 8;
|
|
|
public B content = new B();
|
|
|
|
|
|
- public C[] array = new C[]{new C("a"), new C("b"), new C("c")};
|
|
|
+ public C[] array = new C[]{new C("a"), new CN("b"), new C("c")};
|
|
|
|
|
|
- public List<C> list = Arrays.asList(new C("A"), new C("B"), new C("C"));
|
|
|
+ public List<C> list = Arrays.asList(new C("A"), new CN("B"), new C("C"));
|
|
|
|
|
|
public D home = new D();
|
|
|
+
|
|
|
+ public Map<Integer, C> empty = new TreeMap<>();
|
|
|
+
|
|
|
+ public Map<Integer, C> nullmap;
|
|
|
}
|
|
|
|
|
|
private static class B {
|
|
|
@@ -177,13 +298,21 @@ public class ResolverTest {
|
|
|
|
|
|
private static class C {
|
|
|
public String name;
|
|
|
- public Map<String, Integer> numbers = new HashMap<>();
|
|
|
+ public Map<String, Number> numbers = new HashMap<>();
|
|
|
|
|
|
public C(String name) {
|
|
|
this.name = name;
|
|
|
this.numbers.put("zero", 0);
|
|
|
this.numbers.put("two", 2);
|
|
|
- this.numbers.put("seven", 7);
|
|
|
+ this.numbers.put("seven", 7L);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private static class CN extends C {
|
|
|
+
|
|
|
+ public CN(String name) {
|
|
|
+ super(name);
|
|
|
}
|
|
|
|
|
|
}
|