/
thomas-king
/
SyntacticAnalyzer
Обзор
Документация
Войти
/
thomas-king
/
SyntacticAnalyzer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
test/ParseExpressionTests.cpp
169 строк
6 KB
Ace Rodstin
Add ParseExpressionTests. Fix parenthesis parsing.
06 апр 2023, 13:52
06 апр 2023, 13:52
760e23e
Код
Авторство
О чём код?
// // ParseExpressionTests.cpp // Tests // // Created by Ace Rodstin on 4/6/23. // Copyright © 2023 Ace Rodstin. All rights reserved. // #include "gtest/gtest.h" #include "Services/SyntacticAnalyzer.h" using namespace std; using namespace ace; TEST(ParseExpressionTests, when_parseIntegerLiteral_then_treeCorrect) { // Given string source = "val value = 1"; auto expected = "1"; // When TokensParser tokensParser { source }; SyntacticAnalyzer syntacticAnalyzer { tokensParser }; auto statement = syntacticAnalyzer.parse(); auto declaration = statement->getDeclaration(); auto constantDeclaration = declaration->getConstantDeclaration(); auto constantSpecification = constantDeclaration->getConstantSpecification(); auto expression = constantSpecification->getExpression(); auto unaryExpression = dynamic_cast<const UnaryExpression*>(expression); auto primaryExpression = unaryExpression->getPrimaryExpression(); auto operand = primaryExpression->getOperand(); auto literal = operand->getLiteral(); auto output = literal->getLiteral(); // Then EXPECT_EQ(output, expected); } TEST(ParseExpressionTests, when_parseLiteralInParenthesis_then_treeCorrect) { // Given string source = "val value = (1)"; auto expected = "1"; // When TokensParser tokensParser { source }; SyntacticAnalyzer syntacticAnalyzer { tokensParser }; auto statement = syntacticAnalyzer.parse(); auto declaration = statement->getDeclaration(); auto constantDeclaration = declaration->getConstantDeclaration(); auto constantSpecification = constantDeclaration->getConstantSpecification(); auto expression = constantSpecification->getExpression(); auto unaryExpression = dynamic_cast<const UnaryExpression*>(expression); auto primaryExpression = unaryExpression->getPrimaryExpression(); auto operand = primaryExpression->getOperand(); expression = operand->getExpression(); unaryExpression = dynamic_cast<const UnaryExpression*>(expression); primaryExpression = unaryExpression->getPrimaryExpression(); operand = primaryExpression->getOperand(); auto literal = operand->getLiteral(); auto output = literal->getLiteral(); // Then EXPECT_EQ(output, expected); } TEST(ParseExpressionTests, when_parseFloatLiteral_then_treeCorrect) { // Given string source = "val value = 1.5"; auto expected = "1.5"; // When TokensParser tokensParser { source }; SyntacticAnalyzer syntacticAnalyzer { tokensParser }; auto statement = syntacticAnalyzer.parse(); auto declaration = statement->getDeclaration(); auto constantDeclaration = declaration->getConstantDeclaration(); auto constantSpecification = constantDeclaration->getConstantSpecification(); auto expression = constantSpecification->getExpression(); auto unaryExpression = dynamic_cast<const UnaryExpression*>(expression); auto primaryExpression = unaryExpression->getPrimaryExpression(); auto operand = primaryExpression->getOperand(); auto literal = operand->getLiteral(); auto output = literal->getLiteral(); // Then EXPECT_EQ(output, expected); } TEST(ParseExpressionTests, when_parseOneAddition_then_treeCorrect) { // Given string source = "val value = 1 + 2"; vector<string> expected = { "1", "+", "2" }; // When TokensParser tokensParser { source }; SyntacticAnalyzer syntacticAnalyzer { tokensParser }; vector<string> output; auto statement = syntacticAnalyzer.parse(); auto declaration = statement->getDeclaration(); auto constantDeclaration = declaration->getConstantDeclaration(); auto constantSpecification = constantDeclaration->getConstantSpecification(); auto expression = constantSpecification->getExpression(); auto binaryExpression = dynamic_cast<const BinaryExpression*>(expression); auto lhs = binaryExpression->getLhs(); auto lhsUnaryExpression = dynamic_cast<const UnaryExpression*>(lhs); auto lhsPrimaryExpression = lhsUnaryExpression->getPrimaryExpression(); auto lhsOperand = lhsPrimaryExpression->getOperand(); auto lhsLiteral = lhsOperand->getLiteral(); output.push_back(lhsLiteral->getLiteral()); auto binaryOperator = binaryExpression->getBinaryOperator(); auto op = binaryOperator->getOperator(); output.push_back(operators.at(op)); auto rhs = binaryExpression->getRhs(); auto rhsUnaryExpression = dynamic_cast<const UnaryExpression*>(rhs); auto rhsPrimaryExpression = rhsUnaryExpression->getPrimaryExpression(); auto rhsOperand = rhsPrimaryExpression->getOperand(); auto rhsLiteral = rhsOperand->getLiteral(); output.push_back(rhsLiteral->getLiteral()); // Then EXPECT_EQ(output, expected); } TEST(ParseExpressionTests, when_parseOneAdditionInParenthesis_then_treeCorrect) { // Given string source = "val value = (1 + 2)"; vector<string> expected = { "1", "+", "2" }; // When TokensParser tokensParser { source }; SyntacticAnalyzer syntacticAnalyzer { tokensParser }; vector<string> output; auto statement = syntacticAnalyzer.parse(); auto declaration = statement->getDeclaration(); auto constantDeclaration = declaration->getConstantDeclaration(); auto constantSpecification = constantDeclaration->getConstantSpecification(); auto expression = constantSpecification->getExpression(); auto unaryExpression = dynamic_cast<const UnaryExpression*>(expression); auto primaryExpression = unaryExpression->getPrimaryExpression(); auto operand = primaryExpression->getOperand(); expression = operand->getExpression(); auto binaryExpression = dynamic_cast<const BinaryExpression*>(expression); auto lhs = binaryExpression->getLhs(); auto lhsUnaryExpression = dynamic_cast<const UnaryExpression*>(lhs); auto lhsPrimaryExpression = lhsUnaryExpression->getPrimaryExpression(); auto lhsOperand = lhsPrimaryExpression->getOperand(); auto lhsLiteral = lhsOperand->getLiteral(); output.push_back(lhsLiteral->getLiteral()); auto binaryOperator = binaryExpression->getBinaryOperator(); auto op = binaryOperator->getOperator(); output.push_back(operators.at(op)); auto rhs = binaryExpression->getRhs(); auto rhsUnaryExpression = dynamic_cast<const UnaryExpression*>(rhs); auto rhsPrimaryExpression = rhsUnaryExpression->getPrimaryExpression(); auto rhsOperand = rhsPrimaryExpression->getOperand(); auto rhsLiteral = rhsOperand->getLiteral(); output.push_back(rhsLiteral->getLiteral()); // Then EXPECT_EQ(output, expected); }