blob: 7141df5d459053d79107ef64e7c91fecde698d8f [file] [log] [blame]
#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(Trivia::spaces(2));
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(Trivia::spaces(2))
.withTrailingTrivia(Trivia::spaces(2));
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({}, Trivia::spaces(1));
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(Trivia::spaces(1)))
.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({}, Trivia::spaces(1));
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({}, Trivia::spaces(1));
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(Trivia::spaces(1)))
.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({}, Trivia::spaces(1));
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({}, Trivia::spaces(1));
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({}, Trivia::spaces(1));
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({}, Trivia::spaces(1));
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");
}
}