/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
*
* 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.google.dart.engine.parser;
import com.google.dart.engine.ast.ArgumentList;
import com.google.dart.engine.ast.AssignmentExpression;
import com.google.dart.engine.ast.BinaryExpression;
import com.google.dart.engine.ast.CascadeExpression;
import com.google.dart.engine.ast.CompilationUnit;
import com.google.dart.engine.ast.CompilationUnitMember;
import com.google.dart.engine.ast.ConditionalExpression;
import com.google.dart.engine.ast.Expression;
import com.google.dart.engine.ast.FunctionExpressionInvocation;
import com.google.dart.engine.ast.IndexExpression;
import com.google.dart.engine.ast.IntegerLiteral;
import com.google.dart.engine.ast.IsExpression;
import com.google.dart.engine.ast.LabeledStatement;
import com.google.dart.engine.ast.MethodInvocation;
import com.google.dart.engine.ast.NodeList;
import com.google.dart.engine.ast.PrefixExpression;
import com.google.dart.engine.ast.PrefixedIdentifier;
import com.google.dart.engine.ast.PropertyAccess;
import com.google.dart.engine.ast.ReturnStatement;
import com.google.dart.engine.ast.SimpleIdentifier;
/**
* The class {@code ComplexParserTest} defines parser tests that test the parsing of more complex
* code fragments or the interactions between multiple parsing methods. For example, tests to ensure
* that the precedence of operations is being handled correctly should be defined in this class.
* <p>
* Simpler tests should be defined in the class {@link SimpleParserTest}.
*/
public class ComplexParserTest extends ParserTestCase {
public void test_additiveExpression_normal() throws Exception {
BinaryExpression expression = parseExpression("x + y - z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_additiveExpression_noSpaces() throws Exception {
BinaryExpression expression = parseExpression("i+1");
assertInstanceOf(SimpleIdentifier.class, expression.getLeftOperand());
assertInstanceOf(IntegerLiteral.class, expression.getRightOperand());
}
public void test_additiveExpression_precedence_multiplicative_left() throws Exception {
BinaryExpression expression = parseExpression("x * y + z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_additiveExpression_precedence_multiplicative_left_withSuper() throws Exception {
BinaryExpression expression = parseExpression("super * y - z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_additiveExpression_precedence_multiplicative_right() throws Exception {
BinaryExpression expression = parseExpression("x + y * z");
assertInstanceOf(BinaryExpression.class, expression.getRightOperand());
}
public void test_additiveExpression_super() throws Exception {
BinaryExpression expression = parseExpression("super + y - z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_assignableExpression_arguments_normal_chain() throws Exception {
PropertyAccess propertyAccess1 = parseExpression("a(b)(c).d(e).f");
assertEquals("f", propertyAccess1.getPropertyName().getName());
//
// a(b)(c).d(e)
//
MethodInvocation invocation2 = assertInstanceOf(
MethodInvocation.class,
propertyAccess1.getTarget());
assertEquals("d", invocation2.getMethodName().getName());
ArgumentList argumentList2 = invocation2.getArgumentList();
assertNotNull(argumentList2);
assertSizeOfList(1, argumentList2.getArguments());
//
// a(b)(c)
//
FunctionExpressionInvocation invocation3 = assertInstanceOf(
FunctionExpressionInvocation.class,
invocation2.getTarget());
ArgumentList argumentList3 = invocation3.getArgumentList();
assertNotNull(argumentList3);
assertSizeOfList(1, argumentList3.getArguments());
//
// a(b)
//
MethodInvocation invocation4 = assertInstanceOf(
MethodInvocation.class,
invocation3.getFunction());
assertEquals("a", invocation4.getMethodName().getName());
ArgumentList argumentList4 = invocation4.getArgumentList();
assertNotNull(argumentList4);
assertSizeOfList(1, argumentList4.getArguments());
}
public void test_assignmentExpression_compound() throws Exception {
AssignmentExpression expression = parseExpression("x = y = 0");
assertInstanceOf(SimpleIdentifier.class, expression.getLeftHandSide());
assertInstanceOf(AssignmentExpression.class, expression.getRightHandSide());
}
public void test_assignmentExpression_indexExpression() throws Exception {
AssignmentExpression expression = parseExpression("x[1] = 0");
assertInstanceOf(IndexExpression.class, expression.getLeftHandSide());
assertInstanceOf(IntegerLiteral.class, expression.getRightHandSide());
}
public void test_assignmentExpression_prefixedIdentifier() throws Exception {
AssignmentExpression expression = parseExpression("x.y = 0");
assertInstanceOf(PrefixedIdentifier.class, expression.getLeftHandSide());
assertInstanceOf(IntegerLiteral.class, expression.getRightHandSide());
}
public void test_assignmentExpression_propertyAccess() throws Exception {
AssignmentExpression expression = parseExpression("super.y = 0");
assertInstanceOf(PropertyAccess.class, expression.getLeftHandSide());
assertInstanceOf(IntegerLiteral.class, expression.getRightHandSide());
}
public void test_bitwiseAndExpression_normal() throws Exception {
BinaryExpression expression = parseExpression("x & y & z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_bitwiseAndExpression_precedence_equality_left() throws Exception {
BinaryExpression expression = parseExpression("x == y && z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_bitwiseAndExpression_precedence_equality_right() throws Exception {
BinaryExpression expression = parseExpression("x && y == z");
assertInstanceOf(BinaryExpression.class, expression.getRightOperand());
}
public void test_bitwiseAndExpression_super() throws Exception {
BinaryExpression expression = parseExpression("super & y & z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_bitwiseOrExpression_normal() throws Exception {
BinaryExpression expression = parseExpression("x | y | z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_bitwiseOrExpression_precedence_xor_left() throws Exception {
BinaryExpression expression = parseExpression("x ^ y | z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_bitwiseOrExpression_precedence_xor_right() throws Exception {
BinaryExpression expression = parseExpression("x | y ^ z");
assertInstanceOf(BinaryExpression.class, expression.getRightOperand());
}
public void test_bitwiseOrExpression_super() throws Exception {
BinaryExpression expression = parseExpression("super | y | z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_bitwiseXorExpression_normal() throws Exception {
BinaryExpression expression = parseExpression("x ^ y ^ z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_bitwiseXorExpression_precedence_and_left() throws Exception {
BinaryExpression expression = parseExpression("x & y ^ z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_bitwiseXorExpression_precedence_and_right() throws Exception {
BinaryExpression expression = parseExpression("x ^ y & z");
assertInstanceOf(BinaryExpression.class, expression.getRightOperand());
}
public void test_bitwiseXorExpression_super() throws Exception {
BinaryExpression expression = parseExpression("super ^ y ^ z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_cascade_withAssignment() throws Exception {
CascadeExpression cascade = parseExpression("new Map()..[3] = 4 ..[0] = 11;");
Expression target = cascade.getTarget();
for (Expression section : cascade.getCascadeSections()) {
assertInstanceOf(AssignmentExpression.class, section);
Expression lhs = ((AssignmentExpression) section).getLeftHandSide();
assertInstanceOf(IndexExpression.class, lhs);
IndexExpression index = (IndexExpression) lhs;
assertTrue(index.isCascaded());
assertSame(target, index.getRealTarget());
}
}
public void test_conditionalExpression_precedence_logicalOrExpression() throws Exception {
ConditionalExpression expression = parseExpression("a | b ? y : z");
assertInstanceOf(BinaryExpression.class, expression.getCondition());
}
public void test_constructor_initializer_withParenthesizedExpression() throws Exception {
CompilationUnit unit = parseCompilationUnit(createSource(
"class C {",
" C() :",
" this.a = (b == null ? c : d) {",
" }",
"}"));
NodeList<CompilationUnitMember> declarations = unit.getDeclarations();
assertSizeOfList(1, declarations);
}
public void test_equalityExpression_normal() throws Exception {
BinaryExpression expression = parseExpression(
"x == y != z",
ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND);
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_equalityExpression_precedence_relational_left() throws Exception {
BinaryExpression expression = parseExpression("x is y == z");
assertInstanceOf(IsExpression.class, expression.getLeftOperand());
}
public void test_equalityExpression_precedence_relational_right() throws Exception {
BinaryExpression expression = parseExpression("x == y is z");
assertInstanceOf(IsExpression.class, expression.getRightOperand());
}
public void test_equalityExpression_super() throws Exception {
BinaryExpression expression = parseExpression(
"super == y != z",
ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND);
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_logicalAndExpression() throws Exception {
BinaryExpression expression = parseExpression("x && y && z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_logicalAndExpression_precedence_bitwiseOr_left() throws Exception {
BinaryExpression expression = parseExpression("x | y < z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_logicalAndExpression_precedence_bitwiseOr_right() throws Exception {
BinaryExpression expression = parseExpression("x < y | z");
assertInstanceOf(BinaryExpression.class, expression.getRightOperand());
}
public void test_logicalOrExpression() throws Exception {
BinaryExpression expression = parseExpression("x || y || z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_logicalOrExpression_precedence_logicalAnd_left() throws Exception {
BinaryExpression expression = parseExpression("x && y || z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_logicalOrExpression_precedence_logicalAnd_right() throws Exception {
BinaryExpression expression = parseExpression("x || y && z");
assertInstanceOf(BinaryExpression.class, expression.getRightOperand());
}
public void test_multipleLabels_statement() throws Exception {
LabeledStatement statement = parseStatement("a: b: c: return x;");
assertSizeOfList(3, statement.getLabels());
assertInstanceOf(ReturnStatement.class, statement.getStatement());
}
public void test_multiplicativeExpression_normal() throws Exception {
BinaryExpression expression = parseExpression("x * y / z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_multiplicativeExpression_precedence_unary_left() throws Exception {
BinaryExpression expression = parseExpression("-x * y");
assertInstanceOf(PrefixExpression.class, expression.getLeftOperand());
}
public void test_multiplicativeExpression_precedence_unary_right() throws Exception {
BinaryExpression expression = parseExpression("x * -y");
assertInstanceOf(PrefixExpression.class, expression.getRightOperand());
}
public void test_multiplicativeExpression_super() throws Exception {
BinaryExpression expression = parseExpression("super * y / z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_relationalExpression_precedence_shift_right() throws Exception {
IsExpression expression = parseExpression("x << y is z");
assertInstanceOf(BinaryExpression.class, expression.getExpression());
}
public void test_shiftExpression_normal() throws Exception {
BinaryExpression expression = parseExpression("x >> 4 << 3");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_shiftExpression_precedence_additive_left() throws Exception {
BinaryExpression expression = parseExpression("x + y << z");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_shiftExpression_precedence_additive_right() throws Exception {
BinaryExpression expression = parseExpression("x << y + z");
assertInstanceOf(BinaryExpression.class, expression.getRightOperand());
}
public void test_shiftExpression_super() throws Exception {
BinaryExpression expression = parseExpression("super >> 4 << 3");
assertInstanceOf(BinaryExpression.class, expression.getLeftOperand());
}
public void test_topLevelVariable_withMetadata() throws Exception {
parseCompilationUnit("String @A string;");
}
}