package org.mvel2.tests.core; import org.mvel2.MVEL; import org.mvel2.ParserContext; import org.mvel2.compiler.ExpressionCompiler; import org.mvel2.tests.core.res.Foo; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.mvel2.MVEL.compileExpression; import static org.mvel2.MVEL.executeExpression; public class InlineCollectionsTests extends AbstractTest { public void testListCreation2() { assertTrue(test("[\"test\"]") instanceof List); } public void testListCreation3() { assertTrue(test("[66]") instanceof List); } public void testListCreation4() { List ar = (List) MVEL.eval("[ 66 , \"test\" ]"); assertEquals(2, ar.size()); assertEquals(66, ar.get(0)); assertEquals("test", ar.get(1)); } public void testListCreationWithCall() { assertEquals(1, test("[\"apple\"].size()")); } public void testArrayCreationWithLength() { assertEquals(2, test("Array.getLength({'foo', 'bar'})")); } public void testEmptyList() { assertTrue(test("[]") instanceof List); } public void testEmptyArray() { assertTrue(((Object[]) test("{}")).length == 0); } public void testEmptyArray2() { Object o = MVEL.eval("{ }"); assertTrue(((Object[]) test("{ }")).length == 0); } public void testArrayCreation() { assertEquals(0, test("arrayTest = {{1, 2, 3}, {2, 1, 0}}; arrayTest[1][2]")); } public void testMapCreation() { assertEquals("sarah", test("map = ['mike':'sarah','tom':'jacquelin']; map['mike']")); } public void testMapCreation2() { assertEquals("sarah", test("map = ['mike' :'sarah' ,'tom' :'jacquelin' ]; map['mike']")); } public void testMapCreation3() { assertEquals("foo", test("map = [1 : 'foo']; map[1]")); } public void testSizeOnInlineArray() { assertEquals(3, test("{1,2,3}.size()")); } public void testSimpleListCreation() { test("['foo', 'bar', 'foobar', 'FOOBAR']"); } public void testArrayCoercion() { assertEquals("gonk", test("funMethod( {'gonk', 'foo'} )")); } public void testArrayCoercion2() { assertEquals(10, test("sum({2,2,2,2,2})")); } public void testCompiledMapStructures() { executeExpression(compileExpression("['foo':'bar'] contains 'foo'"), null, (Map) null, Boolean.class); } public void testSubListInMap() { assertEquals("pear", test("map = ['test' : 'poo', 'foo' : [c, 'pear']]; map['foo'][1]")); } public void testForEach2() { assertEquals(6, test("total = 0; a = {1,2,3}; foreach(item : a) { total += item }; total")); } public void testForEach3() { assertEquals(true, test("a = {1,2,3}; foreach (i : a) { if (i == 1) { return true; } }")); } public void testForEach3a() { assertEquals(true, MVEL.eval("a = {1,2,3}; foreach (i : a) { if (i == 1) { return true; } }", new HashMap())); } public void testForEach4() { assertEquals("OneTwoThreeFour", test("a = {1,2,3,4}; builder = ''; foreach (i : a) {" + " if (i == 1) { builder += 'One' } else if (i == 2) { builder += 'Two' } " + "else if (i == 3) { builder += 'Three' } else { builder += 'Four' }" + "}; builder;")); } public void testInlineCollectionNestedObjectCreation() { Map m = (Map) test("['Person.age' : [1, 2, 3, 4], 'Person.rating' : ['High', 'Low']," + " 'Person.something' : (new String('foo').toUpperCase())]"); assertEquals("FOO", m.get("Person.something")); } public void testInlineCollectionNestedObjectCreation1() { Map m = (Map) test("[new String('foo') : new String('bar')]"); assertEquals("bar", m.get("foo")); } public void testMVEL179() { assertTrue((Boolean) MVEL.eval("(($ in [2,4,8,16,32] if $ < 10) != empty)")); } public void testInlineArrayForEach() { assertEquals(11, test("counterX = 0; foreach (item:{1,2,3,4,5,6,7,8,9,10}) { counterX++; }; return counterX + 1;")); } public void testInlineArrayForEach2() { assertEquals(0, test("counterX = 10; foreach (item:{1,1,1,1,1,1,1,1,1,1}) { counterX -= item; } return counterX;")); } public static final class Target { private int _attribute; public Target(int attribute_) { _attribute = attribute_; } public int getAttribute() { return _attribute; } } public void testNegativeArraySizeBug() throws Exception { String expressionString1 = "results = new java.util.ArrayList(); foreach (element : elements) { " + "if( ( {30, 214, 158, 31, 95, 223, 213, 86, 159, 34, 32, 96, 224, 160, 85, 201, 29, 157, 100, 146," + " 82, 203, 194, 145, 140, 81, 27, 166, 212, 38, 28, 94, 168, 23, 87, 150, 35, 149, 193, 33, 132," + " 206, 93, 196, 24, 88, 195, 36, 26, 154, 167, 108, 204, 74, 46, 25, 153, 202, 79, 207, 143, 43, " + "16, 80, 198, 208, 144, 41, 97, 142, 83, 18, 162, 103, 155, 98, 44, 17, 205, 77, 156, 141, 165," + " 102, 84, 37, 101, 222, 40, 104, 99, 177, 182, 22, 180, 21, 137, 221, 179, 78, 42, 178, 19, 183," + " 139, 218, 219, 39, 220, 20, 184, 217, 138, 62, 190, 171, 123, 113, 59, 118, 225, 124, 169, 60, " + "117, 1} contains element.attribute ) ) { results.add(element); } }; results"; String expressionString2 = "results = new java.util.ArrayList(); foreach (element : elements) { " + "if( ( {30, 214, 158, 31, 95, 223, 213, 86, 159, 34, 32, 96, 224, 160, 85, 201, 29, 157, 100, 146," + " 82, 203, 194, 145, 140, 81, 27, 166, 212, 38, 28, 94, 168, 23, 87, 150, 35, 149, 193, 33, 132, " + "206, 93, 196, 24, 88, 195, 36, 26, 154, 167, 108, 204, 74, 46, 25, 153, 202, 79, 207, 143, 43," + " 16, 80, 198, 208, 144, 41, 97, 142, 83, 18, 162, 103, 155, 98, 44, 17, 205, 77, 156, 141, 165," + " 102, 84, 37, 101, 222, 40, 104, 99, 177, 182, 22, 180, 21, 137, 221, 179, 78, 42, 178, 19, 183," + " 139, 218, 219, 39, 220, 20, 184, 217, 138, 62, 190, 171, 123, 113, 59, 118, 225, 124, 169, 60," + " 117, 1, 61, 189, 122, 68, 58, 119, 63, 226, 3, 172}" + " contains element.attribute ) ) { results.add(element); } }; results"; List<Target> targets = new ArrayList<Target>(); targets.add(new Target(1)); targets.add(new Target(999)); Map vars = new HashMap(); vars.put("elements", targets); assertEquals(1, ((List) testCompiledSimple(expressionString1, null, vars)).size()); assertEquals(1, ((List) testCompiledSimple(expressionString2, null, vars)).size()); } /** * Submitted by: Michael Neale */ public void testInlineCollectionParser1() { assertEquals("q", ((Map) test("['Person.age' : [1, 2, 3, 4],'Person.rating' : 'q']")).get("Person.rating")); assertEquals("q", ((Map) test("['Person.age' : [1, 2, 3, 4], 'Person.rating' : 'q']")).get("Person.rating")); } public void testParsingStability3() { assertEquals(false, test("!( [\"X\", \"Y\"] contains \"Y\" )")); } @SuppressWarnings({"UnnecessaryBoxing"}) public void testToList() { String text = "misc.toList(foo.bar.name, 'hello', 42, ['key1' : 'value1'," + " c : [ foo.bar.age, 'car', 42 ]], [42, [c : 'value1']] )"; List list = (List) test(text); assertSame("dog", list.get(0)); assertEquals("hello", list.get(1)); assertEquals(new Integer(42), list.get(2)); Map map = (Map) list.get(3); assertEquals("value1", map.get("key1")); List nestedList = (List) map.get("cat"); assertEquals(14, nestedList.get(0)); assertEquals("car", nestedList.get(1)); assertEquals(42, nestedList.get(2)); nestedList = (List) list.get(4); assertEquals(42, nestedList.get(0)); map = (Map) nestedList.get(1); assertEquals("value1", map.get("cat")); } @SuppressWarnings({"UnnecessaryBoxing"}) public void testToListStrictMode() { String text = "misc.toList(foo.bar.name, 'hello', 42, ['key1' : 'value1'," + " c : [ foo.bar.age, 'car', 42 ]], [42, [c : 'value1']] )"; ParserContext ctx = new ParserContext(); ctx.addInput("misc", MiscTestClass.class); ctx.addInput("foo", Foo.class); ctx.addInput("c", String.class); ctx.setStrictTypeEnforcement(true); ExpressionCompiler compiler = new ExpressionCompiler(text, ctx); List list = (List) executeExpression(compiler.compile(), createTestMap()); assertSame("dog", list.get(0)); assertEquals("hello", list.get(1)); assertEquals(new Integer(42), list.get(2)); Map map = (Map) list.get(3); assertEquals("value1", map.get("key1")); List nestedList = (List) map.get("cat"); assertEquals(14, nestedList.get(0)); assertEquals("car", nestedList.get(1)); assertEquals(42, nestedList.get(2)); nestedList = (List) list.get(4); assertEquals(42, nestedList.get(0)); map = (Map) nestedList.get(1); assertEquals("value1", map.get("cat")); } public void testArrayAccessorAssign() { assertEquals("foo", test("a = {'f00', 'bar'}; a[0] = 'foo'; a[0]")); } public void testInlineListSensitivenessToSpaces() { String ex = "([\"a\",\"b\", \"c\"])"; ParserContext ctx = new ParserContext(); Serializable s = compileExpression(ex, ctx); List result = (List) executeExpression(s, new HashMap()); assertNotNull(result); assertEquals("a", result.get(0)); assertEquals("b", result.get(1)); assertEquals("c", result.get(2)); } public void testMVEL241() { //Regression in mvel2-2.1-20110218.004106-9.jar String mvelSource = "[ 'Person.age' : [42, 43],\n'Person.sex' : ['M', 'F'] ]"; Object eval = MVEL.eval(mvelSource, new HashMap<String, Object>()); Map<String, Object> map = (Map<String, Object>) eval; assertNotNull(map); assertTrue(map.size() == 2); assertTrue(map.containsKey("Person.age")); assertTrue(map.containsKey("Person.sex")); List listSex = (List) map.get("Person.sex"); assertNotNull(listSex); assertTrue(listSex.size() == 2); List listAge = (List) map.get("Person.age"); assertNotNull(listAge); assertTrue(listAge.size() == 2); } public void testMVEL242() { //Regression in mvel2-2.1-20110218.004106-9.jar String mvelSource = "[ 'Fact.field1' : ['val1', 'val2'], 'Fact.field2' : ['val3', 'val4'], 'Fact.field2[field1=val1]' : ['f1val1a', 'f1val1b'], 'Fact.field2[field1=val2]' : ['f1val2a', 'f1val2b'] ]"; Object eval = MVEL.eval(mvelSource, new HashMap<String, Object>()); Map<String, Object> map = (Map<String, Object>) eval; assertNotNull(map); assertEquals(4, map.size()); } public void testEmptyElement() { Object result = MVEL.eval("[2, 3, 4, ]", new HashMap()); assertTrue(result instanceof List); List l = (List) result; assertEquals(3, l.size()); } public void testAddTwoLists() { Object result = test("[1,2,3] + [4,5,6]"); assertTrue(result instanceof List); List l = (List) result; assertEquals(6, l.size()); } public void testElementToList() { Object result = test("[1,2,3] + 4"); assertTrue(result instanceof List); List l = (List) result; assertEquals(4, l.size()); } }