diff --git a/tests/auto/cplusplus/ast/tst_ast.cpp b/tests/auto/cplusplus/ast/tst_ast.cpp index 5638106ed832573609716d1356b3de82b1d82b62..b3ebc1135f9239379be8493190e06cdcf92be75d 100644 --- a/tests/auto/cplusplus/ast/tst_ast.cpp +++ b/tests/auto/cplusplus/ast/tst_ast.cpp @@ -31,7 +31,7 @@ public: private slots: void if_statement(); void if_else_statement(); - void cpp_initializer(); + void cpp_initializer_or_function_declaration(); }; void tst_AST::if_statement() @@ -78,13 +78,89 @@ void tst_AST::if_else_statement() QVERIFY(stmt->statement != 0); QCOMPARE(stmt->else_token, 7U); QVERIFY(stmt->else_statement != 0); + + // check the `then' statement + ExpressionStatementAST *then_stmt = stmt->statement->asExpressionStatement(); + QVERIFY(then_stmt != 0); + QVERIFY(then_stmt->expression != 0); + QCOMPARE(then_stmt->semicolon_token, 6U); + + SimpleNameAST *a_id_expr = then_stmt->expression->asSimpleName(); + QVERIFY(a_id_expr != 0); + QCOMPARE(a_id_expr->identifier_token, 5U); + + // check the `then' statement + ExpressionStatementAST *else_stmt = stmt->else_statement->asExpressionStatement(); + QVERIFY(else_stmt != 0); + QVERIFY(else_stmt->expression != 0); + QCOMPARE(else_stmt->semicolon_token, 9U); + + SimpleNameAST *b_id_expr = else_stmt->expression->asSimpleName(); + QVERIFY(b_id_expr != 0); + QCOMPARE(b_id_expr->identifier_token, 8U); } -void tst_AST::cpp_initializer() +void tst_AST::cpp_initializer_or_function_declaration() { QSharedPointer<TranslationUnit> unit(parseStatement("QFileInfo fileInfo(foo);")); AST *ast = unit->ast(); QVERIFY(ast != 0); + + DeclarationStatementAST *stmt = ast->asDeclarationStatement(); + QVERIFY(stmt != 0); + + QVERIFY(stmt->declaration != 0); + + SimpleDeclarationAST *simple_decl = stmt->declaration->asSimpleDeclaration(); + QVERIFY(simple_decl != 0); + + QVERIFY(simple_decl->decl_specifier_seq != 0); + QVERIFY(simple_decl->decl_specifier_seq->next == 0); + QVERIFY(simple_decl->declarators != 0); + QVERIFY(simple_decl->declarators->next == 0); + QCOMPARE(simple_decl->semicolon_token, 6U); + + NamedTypeSpecifierAST *named_ty = simple_decl->decl_specifier_seq->asNamedTypeSpecifier(); + QVERIFY(named_ty != 0); + QVERIFY(named_ty->name != 0); + + SimpleNameAST *simple_named_ty = named_ty->name->asSimpleName(); + QVERIFY(simple_named_ty != 0); + QCOMPARE(simple_named_ty->identifier_token, 1U); + + DeclaratorAST *declarator = simple_decl->declarators->declarator; + QVERIFY(declarator != 0); + QVERIFY(declarator->core_declarator != 0); + QVERIFY(declarator->postfix_declarators != 0); + QVERIFY(declarator->postfix_declarators->next == 0); + QVERIFY(declarator->initializer == 0); + + DeclaratorIdAST *decl_id = declarator->core_declarator->asDeclaratorId(); + QVERIFY(decl_id != 0); + QVERIFY(decl_id->name != 0); + QVERIFY(decl_id->name->asSimpleName() != 0); + QCOMPARE(decl_id->name->asSimpleName()->identifier_token, 2U); + + FunctionDeclaratorAST *fun_declarator = declarator->postfix_declarators->asFunctionDeclarator(); + QVERIFY(fun_declarator != 0); + QCOMPARE(fun_declarator->lparen_token, 3U); + QVERIFY(fun_declarator->parameters != 0); + QCOMPARE(fun_declarator->rparen_token, 5U); + + // check the formal arguments + ParameterDeclarationClauseAST *param_clause = fun_declarator->parameters; + QVERIFY(param_clause->parameter_declarations != 0); + QVERIFY(param_clause->parameter_declarations->next == 0); + QCOMPARE(param_clause->dot_dot_dot_token, 0U); + + // check the parameter + ParameterDeclarationAST *param = param_clause->parameter_declarations->asParameterDeclaration(); + QVERIFY(param->type_specifier != 0); + QVERIFY(param->type_specifier->next == 0); + QVERIFY(param->type_specifier->asNamedTypeSpecifier() != 0); + QVERIFY(param->type_specifier->asNamedTypeSpecifier()->name != 0); + QVERIFY(param->type_specifier->asNamedTypeSpecifier()->name->asSimpleName() != 0); + QCOMPARE(param->type_specifier->asNamedTypeSpecifier()->name->asSimpleName()->identifier_token, 4U); }