#include "swift/Syntax/SyntaxFactory.h" #include "llvm/ADT/SmallString.h" #include "gtest/gtest.h" using namespace swift; using namespace swift::syntax; #pragma mark - fallthrough-statement TEST(StmtSyntaxTests, FallthroughStmtGetAPIs) { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); auto FallthroughKW = SyntaxFactory::makeFallthroughKeyword("", ""); auto Fallthrough = SyntaxFactory::makeBlankFallthroughStmt() .withFallthroughKeyword(FallthroughKW); /// This should be directly shared through reference-counting. ASSERT_EQ(FallthroughKW.getRaw(), Fallthrough.getFallthroughKeyword() .getRaw()); } TEST(StmtSyntaxTests, FallthroughStmtWithAPIs) { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); auto FallthroughKW = SyntaxFactory::makeFallthroughKeyword("", ""); SyntaxFactory::makeBlankFallthroughStmt() .withFallthroughKeyword(FallthroughKW) .print(OS); ASSERT_EQ(OS.str().str(), "fallthrough"); } TEST(StmtSyntaxTests, FallthroughStmtMakeAPIs) { auto FallthroughKW = SyntaxFactory::makeFallthroughKeyword("", ""); { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeFallthroughStmt(FallthroughKW).print(OS); ASSERT_EQ(OS.str().str(), "fallthrough"); } { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); auto NewFallthroughKW = FallthroughKW.withLeadingTrivia(" "); SyntaxFactory::makeFallthroughStmt(NewFallthroughKW).print(OS); ASSERT_EQ(OS.str().str(), " fallthrough"); } { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); auto NewFallthroughKW = FallthroughKW.withLeadingTrivia(" ").withTrailingTrivia(" "); SyntaxFactory::makeFallthroughStmt(NewFallthroughKW).print(OS); ASSERT_EQ(OS.str().str(), " fallthrough "); } { llvm::SmallString<1> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankFallthroughStmt().print(OS); ASSERT_EQ(OS.str().str(), ""); } } #pragma mark - break-statement TEST(StmtSyntaxTests, BreakStmtGetAPIs) { auto BreakKW = SyntaxFactory::makeBreakKeyword("", " "); auto Label = SyntaxFactory::makeIdentifier("sometimesYouNeedTo", "", ""); auto Break = SyntaxFactory::makeBreakStmt(BreakKW, Label); /// These should be directly shared through reference-counting. ASSERT_EQ(BreakKW.getRaw(), Break.getBreakKeyword().getRaw()); ASSERT_EQ(Label.getRaw(), Break.getLabel()->getRaw()); } TEST(StmtSyntaxTests, BreakStmtWithAPIs) { auto BreakKW = SyntaxFactory::makeBreakKeyword("", ""); auto Label = SyntaxFactory::makeIdentifier("theRules", "", ""); auto Break = SyntaxFactory::makeBlankBreakStmt(); { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); Break.print(OS); ASSERT_EQ(OS.str().str(), ""); } { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); Break.withBreakKeyword(BreakKW) .print(OS); ASSERT_EQ(OS.str().str(), "break"); } { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); Break.withLabel(Label).print(OS); ASSERT_EQ(OS.str().str(), "theRules"); } { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); Break.withBreakKeyword(BreakKW.withTrailingTrivia(" ")) .withLabel(Label) .print(OS); ASSERT_EQ(OS.str().str(), "break theRules"); // sometimes } } TEST(StmtSyntaxTests, BreakStmtMakeAPIs) { { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); auto BreakKW = SyntaxFactory::makeBreakKeyword("", " "); auto Label = SyntaxFactory::makeIdentifier("theBuild", "", ""); auto Break = SyntaxFactory::makeBreakStmt(BreakKW, Label); Break.print(OS); ASSERT_EQ(OS.str().str(), "break theBuild"); // don't you dare } { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankBreakStmt().print(OS); ASSERT_EQ(OS.str().str(), ""); } } #pragma mark - continue-statement TEST(StmtSyntaxTests, ContinueStmtGetAPIs) { auto ContinueKW = SyntaxFactory::makeContinueKeyword("", " "); auto Label = SyntaxFactory::makeIdentifier("always", "", ""); auto Continue = SyntaxFactory::makeContinueStmt(ContinueKW, Label); /// These should be directly shared through reference-counting. ASSERT_EQ(ContinueKW.getRaw(), Continue.getContinueKeyword().getRaw()); ASSERT_EQ(Label.getRaw(), Continue.getLabel()->getRaw()); } TEST(StmtSyntaxTests, ContinueStmtWithAPIs) { auto ContinueKW = SyntaxFactory::makeContinueKeyword("", ""); auto Label = SyntaxFactory::makeIdentifier("toCare", "", ""); auto Continue = SyntaxFactory::makeBlankContinueStmt(); { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); Continue.print(OS); ASSERT_EQ(OS.str().str(), ""); } { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); Continue.withContinueKeyword(ContinueKW) .print(OS); ASSERT_EQ(OS.str().str(), "continue"); } { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); Continue.withLabel(Label).print(OS); ASSERT_EQ(OS.str().str(), "toCare"); } { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); Continue.withContinueKeyword(ContinueKW.withTrailingTrivia(" ")) .withLabel(Label) .print(OS); ASSERT_EQ(OS.str().str(), "continue toCare"); // for each other } } TEST(StmtSyntaxTests, ContinueStmtMakeAPIs) { { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); auto ContinueKW = SyntaxFactory::makeContinueKeyword("", " "); auto Label = SyntaxFactory::makeIdentifier("toLead", "", ""); auto Continue = SyntaxFactory::makeContinueStmt(ContinueKW, Label); Continue.print(OS); ASSERT_EQ(OS.str().str(), "continue toLead"); // by example } { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankContinueStmt().print(OS); ASSERT_EQ(OS.str().str(), ""); } } #pragma mark - return-statement TEST(StmtSyntaxTests, ReturnStmtMakeAPIs) { auto ReturnKW = SyntaxFactory::makeReturnKeyword("", " "); auto Minus = SyntaxFactory::makePrefixOperator("-", "", ""); auto OneDigits = SyntaxFactory::makeIntegerLiteral("1", "", ""); auto MinusOne = SyntaxFactory::makePrefixOperatorExpr(Minus, SyntaxFactory::makeIntegerLiteralExpr(OneDigits)); { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankReturnStmt().print(OS); ASSERT_EQ(OS.str().str(), ""); } { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeReturnStmt(ReturnKW, MinusOne).print(OS); ASSERT_EQ(OS.str().str(), "return -1"); } } TEST(StmtSyntaxTests, ReturnStmtGetAPIs) { auto ReturnKW = SyntaxFactory::makeReturnKeyword("", " "); auto Minus = SyntaxFactory::makePrefixOperator("-", "", ""); auto OneDigits = SyntaxFactory::makeIntegerLiteral("1", "", ""); auto MinusOne = SyntaxFactory::makePrefixOperatorExpr(Minus, SyntaxFactory::makeIntegerLiteralExpr(OneDigits)); auto Return = SyntaxFactory::makeReturnStmt(ReturnKW, MinusOne); ASSERT_EQ(ReturnKW.getRaw(), Return.getReturnKeyword().getRaw()); auto GottenExpression = Return.getExpression().getValue(); auto GottenExpression2 = Return.getExpression().getValue(); ASSERT_TRUE(GottenExpression.hasSameIdentityAs(GottenExpression2)); } TEST(StmtSyntaxTests, ReturnStmtWithAPIs) { auto ReturnKW = SyntaxFactory::makeReturnKeyword("", " "); auto Minus = SyntaxFactory::makePrefixOperator("-", "", ""); auto OneDigits = SyntaxFactory::makeIntegerLiteral("1", "", ""); auto MinusOne = SyntaxFactory::makePrefixOperatorExpr(Minus, SyntaxFactory::makeIntegerLiteralExpr(OneDigits)); { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankReturnStmt().withReturnKeyword(ReturnKW).print(OS); ASSERT_EQ(OS.str().str(), "return "); } { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankReturnStmt().withExpression(MinusOne).print(OS); ASSERT_EQ(OS.str().str(), "-1"); } { llvm::SmallString<48> Scratch; llvm::raw_svector_ostream OS(Scratch); SyntaxFactory::makeBlankReturnStmt() .withReturnKeyword(ReturnKW) .withExpression(MinusOne).print(OS); ASSERT_EQ(OS.str().str(), "return -1"); } }