FormatTest.cpp revision 112fb27ab48ae3256173806a073ba7b88aa6531a
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Format/Format.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "../Tooling/RewriterTestContext.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Lex/Lexer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gtest/gtest.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace clang {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace format {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FormatTest : public ::testing::Test {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string format(llvm::StringRef Code, unsigned Offset, unsigned Length,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const FormatStyle &Style) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RewriterTestContext Context;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FileID ID = Context.createInMemoryFile("input.cc", Code);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SourceLocation Start =
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Context.Sources.getLocForStartOfFile(ID).getLocWithOffset(Offset);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<CharSourceRange> Ranges(
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        1,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CharSourceRange::getCharRange(Start, Start.getLocWithOffset(Length)));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LangOptions LangOpts;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LangOpts.CPlusPlus = 1;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Lexer Lex(ID, Context.Sources.getBuffer(ID), Context.Sources, LangOpts);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tooling::Replacements Replace =
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reformat(Style, Lex, Context.Sources, Ranges);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(applyAllReplacements(Replace, Context.Rewrite));
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Context.getRewrittenText(ID);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string format(llvm::StringRef Code,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const FormatStyle &Style = getLLVMStyle()) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return format(Code, 0, Code.size(), Style);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void verifyFormat(llvm::StringRef Code) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string WithoutFormat(Code.str());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (unsigned i = 0, e = WithoutFormat.size(); i != e; ++i) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (WithoutFormat[i] == '\n')
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WithoutFormat[i] = ' ';
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(Code.str(), format(WithoutFormat));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void verifyGoogleFormat(llvm::StringRef Code) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string WithoutFormat(Code.str());
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (unsigned i = 0, e = WithoutFormat.size(); i != e; ++i) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (WithoutFormat[i] == '\n')
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WithoutFormat[i] = ' ';
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(Code.str(), format(WithoutFormat, getGoogleStyle()));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, DoesNotChangeCorrectlyFormatedCode) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(";", format(";"));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("int i;", format("  int i;"));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("\nint i;", format(" \n\t \r  int i;"));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("int i;\nint j;", format("    int i; int j;"));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("int i;\nint j;", format("    int i;\n  int j;"));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("int i;", format("int\ni;"));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsNestedBlockStatements) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("{\n  {\n    {\n    }\n  }\n}", format("{{{}}}"));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsForLoop) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat(
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "     ++VeryVeryLongLoopVariable);");
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsWhileLoop) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("while (true) {\n}");
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsNestedCall) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("Method(f1, f2(f3));");
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("Method(f1(f2, f3()));");
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsAwesomeMethodCall) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat(
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    parameter, parameter, parameter)), SecondLongCall(parameter));");
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsFunctionDefinition) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("void f(int a, int b, int c, int d, int e, int f, int g,"
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               " int h, int j, int f,\n"
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "       int c, int ddddddddddddd) {\n"
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "}");
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(FormatTest, FormatIfWithoutCompountStatement) {
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  verifyFormat("if (true)\n  f();\ng();");
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  verifyFormat("if (a)\n  if (b)\n    if (c)\n      g();\nh();");
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  verifyFormat("if (a)\n  if (b) {\n    f();\n  }\ng();");
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FormatTest, ParseIfThenElse) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("if (true)\n"
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  if (true)\n"
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "    if (true)\n"
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "      f();\n"
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "    else\n"
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "      g();\n"
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  else\n"
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "    h();\n"
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "else\n"
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  i();");
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("if (true)\n"
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  if (true)\n"
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "    if (true) {\n"
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "      if (true)\n"
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "        f();\n"
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "    } else {\n"
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "      g();\n"
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "    }\n"
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  else\n"
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "    h();\n"
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "else {\n"
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  i();\n"
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "}");
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, UnderstandsSingleLineComments) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("// line 1\n// line 2\nvoid f() {\n}\n",
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            format("// line 1\n// line 2\nvoid f() {}\n"));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("void f() {\n  // Doesn't do anything\n}",
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            format("void f() {\n// Doesn't do anything\n}"));
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("int i  // This is a fancy variable\n    = 5;",
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            format("int i  // This is a fancy variable\n= 5;"));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("f(/*test=*/ true);");
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("class A {\n};");
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, BreaksAsHighAsPossible) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat(
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  f();");
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, ElseIf) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("if (a) {\n"
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "} else if (b) {\n"
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "}");
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("if (a)\n"
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  f();\n"
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "else if (b)\n"
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  g();\n"
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "else\n"
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  h();");
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("class A {\n"
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "public:\n"
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "protected:\n"
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "private:\n"
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  void f() {\n"
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  }\n"
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "};");
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyGoogleFormat("class A {\n"
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     " public:\n"
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     " protected:\n"
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     " private:\n"
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "  void f() {\n"
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "  }\n"
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "};");
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, SwitchStatement) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("switch (x) {\n"
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "case 1:\n"
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  f();\n"
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  break;\n"
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "case kFoo:\n"
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "case ns::kBar:\n"
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "case kBaz:\n"
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  break;\n"
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "default:\n"
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  g();\n"
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  break;\n"
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "}");
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("switch (x) {\n"
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "case 1: {\n"
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  f();\n"
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  break;\n"
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "}\n"
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "}");
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("switch (test)\n"
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  ;");
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, Labels) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("void f() {\n"
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  some_code();\n"
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "test_label:\n"
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  some_other_code();\n"
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  {\n"
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "    some_more_code();\n"
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  another_label:\n"
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "    some_more_code();\n"
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  }\n"
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               "}");
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("some_code();\n"
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "test_label:\n"
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "some_other_code();");
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, DerivedClass) {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("class A : public B {\n"
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "};");
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, DoWhile) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("do {\n"
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  do_something();\n"
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "} while (something());");
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("do\n"
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  do_something();\n"
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "while (something());");
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, Enum) {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("enum {\n"
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  Zero,\n"
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  One = 1,\n"
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  Two = One + 1,\n"
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  Three = (One + Two),\n"
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  Five = (One, Two, Three, Four, 5)\n"
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "};");
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("enum Enum {\n"
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "};");
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("enum {\n"
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "};");
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, BreaksDesireably) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n};");
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat(
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat(
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "aaaaaaaa(aaaaaaaaaaaaa, aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "                            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, AlignsStringLiterals) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "                                      \"short literal\");");
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat(
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "looooooooooooooooooooooooongFunction(\n"
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"short literal\"\n"
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, UnderstandsEquals) {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "aaaaaaaaaaaaaaaaa =\n"
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat(
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}");
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat(
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "if (a) {\n"
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}");
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "        100000000 + 100000000) {\n}");
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, UnderstandsTemplateParameters) {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verifyFormat("A<int> a;");
311  verifyFormat("A<A<A<int> > > a;");
312  verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
313  verifyFormat("bool x = a < 1 || 2 > a;");
314  verifyFormat("bool x = 5 < f<int>();");
315  verifyFormat("bool x = f<int>() > 5;");
316  verifyFormat("bool x = 5 < a<int>::x;");
317  verifyFormat("bool x = a < 4 ? a > 2 : false;");
318  verifyFormat("bool x = f() ? a < 2 : a > 2;");
319
320  verifyGoogleFormat("A<A<int>> a;");
321  verifyGoogleFormat("A<A<A<int>>> a;");
322  verifyGoogleFormat("A<A<A<A<int>>>> a;");
323
324  verifyFormat("test >> a >> b;");
325  verifyFormat("test << a >> b;");
326
327  verifyFormat("f<int>();");
328  verifyFormat("template <typename T> void f() {\n}");
329}
330
331TEST_F(FormatTest, UndestandsUnaryOperators) {
332  verifyFormat("int a = -2;");
333  verifyFormat("f(-1, -2, -3);");
334  verifyFormat("a[-1] = 5;");
335  verifyFormat("int a = 5 + -2;");
336  verifyFormat("if (i == -1) {\n}");
337  verifyFormat("if (i != -1) {\n}");
338  verifyFormat("if (i > -1) {\n}");
339  verifyFormat("if (i < -1) {\n}");
340}
341
342TEST_F(FormatTest, UndestandsOverloadedOperators) {
343  verifyFormat("bool operator<() {\n}");
344}
345
346TEST_F(FormatTest, UnderstandsUsesOfStar) {
347  verifyFormat("int *f(int *a) {\n}");
348  verifyFormat("f(a, *a);");
349  verifyFormat("f(*a);");
350  verifyFormat("int a = b * 10;");
351  verifyFormat("int a = 10 * b;");
352  verifyFormat("int a = b * c;");
353  verifyFormat("int a = *b;");
354  verifyFormat("int a = *b * c;");
355  verifyFormat("int a = b * *c;");
356}
357
358TEST_F(FormatTest, HandlesIncludeDirectives) {
359  EXPECT_EQ("#include <string>\n", format("#include <string>\n"));
360  EXPECT_EQ("#include \"a/b/string\"\n", format("#include \"a/b/string\"\n"));
361  EXPECT_EQ("#include \"string.h\"\n", format("#include \"string.h\"\n"));
362  EXPECT_EQ("#include \"string.h\"\n", format("#include \"string.h\"\n"));
363}
364
365//TEST_F(FormatTest, IncorrectDerivedClass) {
366//  verifyFormat("public B {\n"
367//               "};");
368//}
369
370TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
371  verifyFormat("{");
372}
373
374TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
375  verifyFormat("do {\n"
376               "};");
377  verifyFormat("do {\n"
378               "};\n"
379               "f();");
380  verifyFormat("do {\n"
381               "}\n"
382               "wheeee(fun);");
383  verifyFormat("do {\n"
384               "  f();\n"
385               "};");
386}
387
388TEST_F(FormatTest, IncorrectCodeErrorDetection) {
389  EXPECT_EQ("{\n{\n}\n", format("{\n{\n}\n"));
390  EXPECT_EQ("{\n  {\n}\n", format("{\n  {\n}\n"));
391  EXPECT_EQ("{\n  {\n  }\n", format("{\n  {\n  }\n"));
392
393  FormatStyle Style = getLLVMStyle();
394  Style.ColumnLimit = 10;
395  EXPECT_EQ("{\n"
396            "    {\n"
397            " breakme(\n"
398            "     qwe);\n"
399            "}\n", format("{\n"
400                          "    {\n"
401                          " breakme(qwe);\n"
402                          "}\n", Style));
403
404}
405
406}  // end namespace tooling
407}  // end namespace clang
408