/*
* Copyright 2016 Nabarun Mondal
* Licensed 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 com.noga.njexl.lang;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.noga.njexl.lang.junit.Asserter;
/**
* Tests for array access operator []
*
* @since 2.0
*/
public class ArrayAccessTest extends JexlTestCase {
private Asserter asserter;
private static final String GET_METHOD_STRING = "GetMethod string";
// Needs to be accessible by Foo.class
static final String[] GET_METHOD_ARRAY =
new String[] { "One", "Two", "Three" };
// Needs to be accessible by Foo.class
static final String[][] GET_METHOD_ARRAY2 =
new String[][] { {"One", "Two", "Three"},{"Four", "Five", "Six"} };
@Override
public void setUp() {
asserter = new Asserter(JEXL);
}
/**
* test simple array access
*/
public void testArrayAccess() throws Exception {
/*
* test List access
*/
List<Integer> l = new ArrayList<Integer>();
l.add(new Integer(1));
l.add(new Integer(2));
l.add(new Integer(3));
asserter.setVariable("list", l);
asserter.assertExpression("list[1]", new Integer(2));
asserter.assertExpression("list[1+1]", new Integer(3));
asserter.setVariable("loc", new Integer(1));
asserter.assertExpression("list[loc+1]", new Integer(3));
/*
* test array access
*/
String[] args = { "hello", "there" };
asserter.setVariable("array", args);
asserter.assertExpression("array[0]", "hello");
/*
* to think that this was an intentional syntax...
*/
asserter.assertExpression("array.0", "hello");
/*
* test map access
*/
Map<String, String> m = new HashMap<String, String>();
m.put("foo", "bar");
asserter.setVariable("map", m);
asserter.setVariable("key", "foo");
asserter.assertExpression("map[\"foo\"]", "bar");
asserter.assertExpression("map[key]", "bar");
/*
* test bean access
*/
asserter.setVariable("foo", new Foo());
asserter.assertExpression("foo[\"bar\"]", GET_METHOD_STRING);
asserter.assertExpression("foo[\"bar\"] == foo.bar", Boolean.TRUE);
}
/**
* test some simple double array lookups
*/
public void testDoubleArrays() throws Exception {
Object[][] foo = new Object[2][2];
foo[0][0] = "one";
foo[0][1] = "two";
asserter.setVariable("foo", foo);
asserter.assertExpression("foo[0][1]", "two");
}
public void testArrayProperty() throws Exception {
Foo foo = new Foo();
asserter.setVariable("foo", foo);
asserter.assertExpression("foo.array[1]", GET_METHOD_ARRAY[1]);
asserter.assertExpression("foo.array.1", GET_METHOD_ARRAY[1]);
asserter.assertExpression("foo.array2[1][1]", GET_METHOD_ARRAY2[1][1]);
asserter.assertExpression("foo.array2[1].1", GET_METHOD_ARRAY2[1][1]);
}
// This is JEXL-26
public void testArrayAndDottedConflict() throws Exception {
Object[] objects = new Object[] {"an", "array", new Long(0)};
asserter.setVariable("objects", objects);
asserter.setVariable("status", "Enabled");
asserter.assertExpression("objects[1].status", null);
asserter.assertExpression("objects.1.status", null);
asserter.setVariable("base.status", "Ok");
asserter.assertExpression("base.objects[1].status", null);
asserter.assertExpression("base.objects.1.status", null);
}
public void testArrayMethods() throws Exception {
Object[] objects = new Object[] {"an", "array", new Long(0)};
asserter.setVariable("objects", objects);
asserter.assertExpression("objects.get(1)", "array");
asserter.assertExpression("objects.size()", new Integer(3));
// setting an index returns the old value
asserter.assertExpression("objects.set(1, 'dion')", "array");
asserter.assertExpression("objects[1]", "dion");
}
public void testArrayArray() throws Exception {
Integer i42 = Integer.valueOf(42);
Integer i43 = Integer.valueOf(43);
String s42 = "fourty-two";
String s43 = "fourty-three";
Object[] foo = new Object[3];
foo[0] = foo;
foo[1] = i42;
foo[2] = s42;
asserter.setVariable("foo", foo);
asserter.setVariable("zero", Integer.valueOf(0));
asserter.setVariable("one", Integer.valueOf(1));
asserter.setVariable("two", Integer.valueOf(2));
for(int l = 0; l < 2; ++l) {
asserter.assertExpression("foo[0]", foo);
asserter.assertExpression("foo[0][0]", foo);
asserter.assertExpression("foo[1]", foo[1]);
asserter.assertExpression("foo[0][1]", foo[1]);
asserter.assertExpression("foo[0][1] = 43", i43);
asserter.assertExpression("foo[0][1]", i43);
asserter.assertExpression("foo[0][1] = 42", i42);
asserter.assertExpression("foo[0][1]", i42);
asserter.assertExpression("foo[0][0][1]", foo[1]);
asserter.assertExpression("foo[0][0][1] = 43", i43);
asserter.assertExpression("foo[0][0][1]", i43);
asserter.assertExpression("foo[0][0][1] = 42", i42);
asserter.assertExpression("foo[0][0][1]", i42);
asserter.assertExpression("foo[2]", foo[2]);
asserter.assertExpression("foo[0][2]", foo[2]);
asserter.assertExpression("foo[0][2] = 'fourty-three'", s43);
asserter.assertExpression("foo[0][2]", s43);
asserter.assertExpression("foo[0][2] = 'fourty-two'", s42);
asserter.assertExpression("foo[0][2]", s42);
asserter.assertExpression("foo[0][0][2]", foo[2]);
asserter.assertExpression("foo[0][0][2] = 'fourty-three'", s43);
asserter.assertExpression("foo[0][0][2]", s43);
asserter.assertExpression("foo[0][0][2] = 'fourty-two'", s42);
asserter.assertExpression("foo[0][0][2]", s42);
asserter.assertExpression("foo[zero]", foo);
asserter.assertExpression("foo[zero][zero]", foo);
asserter.assertExpression("foo[one]", foo[1]);
asserter.assertExpression("foo[zero][one]", foo[1]);
asserter.assertExpression("foo[zero][one] = 43", i43);
asserter.assertExpression("foo[zero][one]", i43);
asserter.assertExpression("foo[zero][one] = 42", i42);
asserter.assertExpression("foo[zero][one]", i42);
asserter.assertExpression("foo[zero][zero][one]", foo[1]);
asserter.assertExpression("foo[zero][zero][one] = 43", i43);
asserter.assertExpression("foo[zero][zero][one]", i43);
asserter.assertExpression("foo[zero][zero][one] = 42", i42);
asserter.assertExpression("foo[zero][zero][one]", i42);
asserter.assertExpression("foo[two]", foo[2]);
asserter.assertExpression("foo[zero][two]", foo[2]);
asserter.assertExpression("foo[zero][two] = 'fourty-three'", s43);
asserter.assertExpression("foo[zero][two]", s43);
asserter.assertExpression("foo[zero][two] = 'fourty-two'", s42);
asserter.assertExpression("foo[zero][two]", s42);
asserter.assertExpression("foo[zero][zero][two]", foo[2]);
asserter.assertExpression("foo[zero][zero][two] = 'fourty-three'", s43);
asserter.assertExpression("foo[zero][zero][two]", s43);
asserter.assertExpression("foo[zero][zero][two] = 'fourty-two'", s42);
asserter.assertExpression("foo[zero][zero][two]", s42);
}
}
public void testMathSetOperation() throws Exception {
asserter.assertExpression("size( set(1,1) )" , 1);
}
}