blob: 8ecc53f92f730287809a9e8d2aa456ba7434537f [file] [log] [blame]
/*
* 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.netbeans.modules.web.el;
import com.sun.el.parser.*;
import javax.el.ELException;
import junit.framework.TestCase;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Currently no real tests but temporary test code just to help
* understanding and debug the EL parser.
*/
public class ELParserTest extends TestCase {
public ELParserTest(String name) {
super(name);
}
@Test
public void testParseDeferred() {
String expr = "#{taskController.removeTask(cc.attrs.story, cc.attrs.task)}";
Node result = ELParser.parse(expr);
assertNotNull(result);
assertNotNull(findIdentifier(result, "taskController"));
assertNotNull(findMethod(result, "removeTask"));
print(expr, result);
}
@Test
public void testParseDeferred2() {
String expr = "#{customer.name}";
Node result = ELParser.parse(expr);
assertNotNull(result);
assertNotNull(findIdentifier(result, "customer"));
assertNotNull(findProperty(result, "name"));
print(expr, result);
}
@Test
public void testParseImmediate() {
String expr = "${sessionScope.cart.numberOfItems > 0}";
Node result = ELParser.parse(expr);
assertNotNull(result);
assertNotNull(findIdentifier(result, "sessionScope"));
assertNotNull(findProperty(result, "cart"));
assertNotNull(findProperty(result, "numberOfItems"));
assertNotNull(findNode(result, "0", AstInteger.class));
print(expr, result);
}
@Test
public void testParseImmediate2() {
String expr = "${sessionScope.cart.total}";
Node result = ELParser.parse(expr);
assertNotNull(result);
assertNotNull(findIdentifier(result, "sessionScope"));
assertNotNull(findProperty(result, "cart"));
assertNotNull(findProperty(result, "total"));
print(expr, result);
}
@Test
public void testParseImmediate3() {
String expr = "${customer}";
Node result = ELParser.parse(expr);
assertNotNull(result);
assertNotNull(findIdentifier(result, "customer"));
print(expr, result);
}
@Test
public void testParseImmediate4() {
String expr = "${customer.address[\"street\"]}";
Node result = ELParser.parse(expr);
assertNotNull(result);
assertNotNull(findIdentifier(result, "customer"));
print(expr, result);
}
@Test
public void testParseInvalid() {
String expr = "${customer.ad";
try {
ELParser.parse(expr);
fail("Should not parse: " + expr);
} catch (ELException ele) {
assertNotNull(ele.getMessage());
}
}
@Test
public void testParseEscaped() {
String[] exprs = {"${'${'}cart.numberOfItems}",
"${'#{'}cart.numberOfItems}",
"\\#{cart.numberOfItems}", "\\${cart.numberOfItems}"};
for (String expr : exprs) {
Node result = ELParser.parse(expr);
assertNull(findIdentifier(result, "cart"));
assertNull(findProperty(result, "numberOfItems"));
print(expr, result);
}
}
public void testOffsets() {
String expr = "#{foo.bar.baz}";
Node result = ELParser.parse(expr);
Node foo = findIdentifier(result, "foo");
Node bar = findProperty(result, "bar");
Node baz = findProperty(result, "baz");
assertOffsets(foo, 2, 5);
assertOffsets(bar, 6, 9);
assertOffsets(baz, 10, 13);
}
public void testOffsets2() {
String expr = "#{foo.bar(baz)}";
Node result = ELParser.parse(expr);
Node foo = findIdentifier(result, "foo");
Node bar = findMethod(result, "bar");
Node baz = findIdentifier(result, "baz");
assertOffsets(foo, 2, 5);
assertOffsets(bar, 6, 14);
assertOffsets(baz, 10, 13);
print(expr, result);
}
public void testOffsets3() {
String expr = "#{foo.bar[\"baz\"]}";
Node result = ELParser.parse(expr);
Node foo = findIdentifier(result, "foo");
Node bar = findProperty(result, "bar");
Node brackets = findNode(result, AstBracketSuffix.class);
Node bazString = findNode(result, "\"baz\"", AstString.class);
assertOffsets(foo, 2, 5);
assertOffsets(bar, 6, 9);
assertOffsets(brackets, 9, 16);
assertOffsets(brackets, 9, 16);
assertOffsets(bazString, 10, 15);
}
public void testConcatenation() {
String expr = "${'Welcome ' + customer.name + ' to our site.'}";
Node result = ELParser.parse(expr);
Node customer = findIdentifier(result, "customer");
Node name = findProperty(result, "name");
assertNotNull(customer);
assertNotNull(name);
assertOffsets(customer, 15, 23);
assertOffsets(name, 24, 28);
}
public void testOperator01() {
String expr = "${employees.where(e->e.firstName == 'Larry')}";
Node result = ELParser.parse(expr);
Node empl = findIdentifier(result, "employees");
Node where = findMethod(result, "where");
assertNotNull(empl);
assertNotNull(where);
assertOffsets(empl, 2, 11);
assertOffsets(where, 12, 44);
}
public void testSemicolon01() {
String expr = "${a = mybean.property; b}";
Node result = ELParser.parse(expr);
Node a = findIdentifier(result, "a");
Node b = findIdentifier(result, "b");
Node mybean = findIdentifier(result, "mybean");
Node property = findProperty(result, "property");
assertNotNull(a);
assertNotNull(b);
assertNotNull(mybean);
assertNotNull(property);
assertOffsets(a, 2, 3);
assertOffsets(b, 23, 24);
assertOffsets(mybean, 6, 12);
assertOffsets(property, 13, 21);
}
public void testStaticField01() {
String expr = "${T(java.lang.Boolean).TRUE}";
Node result = ELParser.parse(expr);
Node T = findFunction(result, "T");
Node TRUE = findProperty(result, "TRUE");
assertNotNull(T);
assertNotNull(TRUE);
assertOffsets(T, 2, 22);
assertOffsets(TRUE, 23, 27);
}
public void testSet01() {
String expr = "${{1, 2, 3}}";
Node result = ELParser.parse(expr);
Node set = findNode(result, null, AstMapData.class);
Node entry = findNode(result, null, AstMapEntry.class);
Node value = findNode(result, "2", AstInteger.class);
assertNotNull(set);
assertNotNull(entry);
assertNotNull(value);
assertOffsets(set, 2, 11);
assertOffsets(value, 6, 7);
}
public void testList01() {
String expr = "${[1, \"two\", 3]}";
Node result = ELParser.parse(expr);
Node set = findNode(result, null, AstListData.class);
Node value = findNode(result, "\"two\"", AstString.class);
assertNotNull(set);
assertNotNull(value);
assertOffsets(set, 2, 15);
assertOffsets(value, 6, 11);
}
public void testMap01() {
String expr = "${{\"one\":1, \"two\":2}}";
Node result = ELParser.parse(expr);
Node set = findNode(result, null, AstMapData.class);
Node entry = findNode(result, null, AstMapEntry.class);
Node value = findNode(result, "1", AstInteger.class);
assertNotNull(set);
assertNotNull(entry);
assertNotNull(value);
assertOffsets(set, 2, 20);
assertOffsets(value, 9, 10);
}
private void assertOffsets(Node node, int start, int end) {
assertEquals("Start offset", start, node.startOffset());
assertEquals("End offset", end, node.endOffset());
}
private static Node findProperty(final Node root, final String image) {
return findNode(root, image, AstDotSuffix.class);
}
private static Node findIdentifier(final Node root, final String image) {
return findNode(root, image, AstIdentifier.class);
}
private static Node findMethod(final Node root, final String image) {
return findNode(root, image, AstDotSuffix.class);
}
private static Node findFunction(final Node root, final String localName) {
final Node[] result = new Node[1];
root.accept(new NodeVisitor() {
@Override
public void visit(Node node) throws ELException {
if (node.getClass().equals(AstFunction.class)) {
AstFunction function = (AstFunction) node;
if (function.getLocalName() == null) {
result[0] = node;
return;
} else if (localName.equals(function.getLocalName())) {
result[0] = node;
return;
}
}
}
});
return result[0];
}
private static Node findNode(final Node root, final Class clazz) {
return findNode(root, null, clazz);
}
private static Node findNode(final Node root, final String image, final Class clazz) {
final Node[] result = new Node[1];
root.accept(new NodeVisitor() {
@Override
public void visit(Node node) throws ELException {
if (node.getClass().equals(clazz)) {
if (image == null) {
result[0] = node;
return;
} else if (image.equals(node.getImage())) {
result[0] = node;
return;
}
}
}
});
return result[0];
}
static void print(String expr, Node node) {
System.out.println("------------------------------");
System.out.println("AST for " + expr);
System.out.println("------------------------------");
printTree(node, 0);
}
private static void printTree(Node node, int level) {
StringBuilder indent = new StringBuilder(level);
for (int i = 0; i < level; i++) {
indent.append(" ");
}
System.out.println(indent.toString() + node + ", offset: start - " + node.startOffset() + " end - " + node.endOffset() + ", image: " + node.getImage() + ", class: " + node.getClass().getSimpleName());
for (int i = 0; i < node.jjtGetNumChildren(); i++) {
Node child = node.jjtGetChild(i);
printTree(child, ++level);
}
}
}