1a48a12cfSAlexander Kornienko //===- unittest/Format/FormatTestJS.cpp - Formatting unit tests for JS ----===//
2a48a12cfSAlexander Kornienko //
3a48a12cfSAlexander Kornienko //                     The LLVM Compiler Infrastructure
4a48a12cfSAlexander Kornienko //
5a48a12cfSAlexander Kornienko // This file is distributed under the University of Illinois Open Source
6a48a12cfSAlexander Kornienko // License. See LICENSE.TXT for details.
7a48a12cfSAlexander Kornienko //
8a48a12cfSAlexander Kornienko //===----------------------------------------------------------------------===//
9a48a12cfSAlexander Kornienko 
10a48a12cfSAlexander Kornienko #include "FormatTestUtils.h"
11a48a12cfSAlexander Kornienko #include "clang/Format/Format.h"
12a48a12cfSAlexander Kornienko #include "llvm/Support/Debug.h"
13a48a12cfSAlexander Kornienko #include "gtest/gtest.h"
14a48a12cfSAlexander Kornienko 
1510346667SChandler Carruth #define DEBUG_TYPE "format-test"
1610346667SChandler Carruth 
17a48a12cfSAlexander Kornienko namespace clang {
18a48a12cfSAlexander Kornienko namespace format {
19a48a12cfSAlexander Kornienko 
20a48a12cfSAlexander Kornienko class FormatTestJS : public ::testing::Test {
21a48a12cfSAlexander Kornienko protected:
22a48a12cfSAlexander Kornienko   static std::string format(llvm::StringRef Code, unsigned Offset,
23a48a12cfSAlexander Kornienko                             unsigned Length, const FormatStyle &Style) {
24a48a12cfSAlexander Kornienko     DEBUG(llvm::errs() << "---\n");
25a48a12cfSAlexander Kornienko     DEBUG(llvm::errs() << Code << "\n\n");
26a48a12cfSAlexander Kornienko     std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length));
27a48a12cfSAlexander Kornienko     tooling::Replacements Replaces = reformat(Style, Code, Ranges);
28a48a12cfSAlexander Kornienko     std::string Result = applyAllReplacements(Code, Replaces);
29a48a12cfSAlexander Kornienko     EXPECT_NE("", Result);
30a48a12cfSAlexander Kornienko     DEBUG(llvm::errs() << "\n" << Result << "\n\n");
31a48a12cfSAlexander Kornienko     return Result;
32a48a12cfSAlexander Kornienko   }
33a48a12cfSAlexander Kornienko 
34514ecc8cSNico Weber   static std::string format(llvm::StringRef Code, const FormatStyle &Style) {
35a48a12cfSAlexander Kornienko     return format(Code, 0, Code.size(), Style);
36a48a12cfSAlexander Kornienko   }
37a48a12cfSAlexander Kornienko 
38c1637f16SAlexander Kornienko   static FormatStyle getGoogleJSStyleWithColumns(unsigned ColumnLimit) {
39514ecc8cSNico Weber     FormatStyle Style = getGoogleStyle(FormatStyle::LK_JavaScript);
40a48a12cfSAlexander Kornienko     Style.ColumnLimit = ColumnLimit;
41a48a12cfSAlexander Kornienko     return Style;
42a48a12cfSAlexander Kornienko   }
43a48a12cfSAlexander Kornienko 
44514ecc8cSNico Weber   static void verifyFormat(
45514ecc8cSNico Weber       llvm::StringRef Code,
46514ecc8cSNico Weber       const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_JavaScript)) {
47a48a12cfSAlexander Kornienko     EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
48a48a12cfSAlexander Kornienko   }
49a48a12cfSAlexander Kornienko };
50a48a12cfSAlexander Kornienko 
51a48a12cfSAlexander Kornienko TEST_F(FormatTestJS, UnderstandsJavaScriptOperators) {
52a48a12cfSAlexander Kornienko   verifyFormat("a == = b;");
53a48a12cfSAlexander Kornienko   verifyFormat("a != = b;");
54a48a12cfSAlexander Kornienko 
55a48a12cfSAlexander Kornienko   verifyFormat("a === b;");
56c1637f16SAlexander Kornienko   verifyFormat("aaaaaaa ===\n    b;", getGoogleJSStyleWithColumns(10));
57a48a12cfSAlexander Kornienko   verifyFormat("a !== b;");
58c1637f16SAlexander Kornienko   verifyFormat("aaaaaaa !==\n    b;", getGoogleJSStyleWithColumns(10));
59a48a12cfSAlexander Kornienko   verifyFormat("if (a + b + c +\n"
60a48a12cfSAlexander Kornienko                "        d !==\n"
61a48a12cfSAlexander Kornienko                "    e + f + g)\n"
62a48a12cfSAlexander Kornienko                "  q();",
63c1637f16SAlexander Kornienko                getGoogleJSStyleWithColumns(20));
64a48a12cfSAlexander Kornienko 
65a48a12cfSAlexander Kornienko   verifyFormat("a >> >= b;");
66a48a12cfSAlexander Kornienko 
67a48a12cfSAlexander Kornienko   verifyFormat("a >>> b;");
68c1637f16SAlexander Kornienko   verifyFormat("aaaaaaa >>>\n    b;", getGoogleJSStyleWithColumns(10));
69a48a12cfSAlexander Kornienko   verifyFormat("a >>>= b;");
70c1637f16SAlexander Kornienko   verifyFormat("aaaaaaa >>>=\n    b;", getGoogleJSStyleWithColumns(10));
71a48a12cfSAlexander Kornienko   verifyFormat("if (a + b + c +\n"
72a48a12cfSAlexander Kornienko                "        d >>>\n"
73a48a12cfSAlexander Kornienko                "    e + f + g)\n"
74a48a12cfSAlexander Kornienko                "  q();",
75c1637f16SAlexander Kornienko                getGoogleJSStyleWithColumns(20));
76c1637f16SAlexander Kornienko   verifyFormat("var x = aaaaaaaaaa ?\n"
77c1637f16SAlexander Kornienko                "            bbbbbb :\n"
78c1637f16SAlexander Kornienko                "            ccc;",
79c1637f16SAlexander Kornienko                getGoogleJSStyleWithColumns(20));
80a48a12cfSAlexander Kornienko }
81a48a12cfSAlexander Kornienko 
82b2e10a54SDaniel Jasper TEST_F(FormatTestJS, SpacesInContainerLiterals) {
83b2e10a54SDaniel Jasper   verifyFormat("var arr = [1, 2, 3];");
84b2e10a54SDaniel Jasper   verifyFormat("var obj = {a: 1, b: 2, c: 3};");
85514ecc8cSNico Weber 
86514ecc8cSNico Weber   verifyFormat("var obj = {a: 1, b: 2, c: 3};",
87514ecc8cSNico Weber                getChromiumStyle(FormatStyle::LK_JavaScript));
88b2e10a54SDaniel Jasper }
89b2e10a54SDaniel Jasper 
9086fee2faSDaniel Jasper TEST_F(FormatTestJS, SingleQuoteStrings) {
9186fee2faSDaniel Jasper   verifyFormat("this.function('', true);");
9286fee2faSDaniel Jasper }
9386fee2faSDaniel Jasper 
944a39c84cSDaniel Jasper TEST_F(FormatTestJS, GoogScopes) {
954a39c84cSDaniel Jasper   verifyFormat("goog.scope(function() {\n"
964a39c84cSDaniel Jasper                "var x = a.b;\n"
974a39c84cSDaniel Jasper                "var y = c.d;\n"
984a39c84cSDaniel Jasper                "});  // goog.scope");
994a39c84cSDaniel Jasper }
1004a39c84cSDaniel Jasper 
101*166c19bdSDaniel Jasper TEST_F(FormatTestJS, ReturnStatements) {
102*166c19bdSDaniel Jasper   verifyFormat("function() { return [hello, world]; }");
103*166c19bdSDaniel Jasper }
104*166c19bdSDaniel Jasper 
105a48a12cfSAlexander Kornienko } // end namespace tooling
106a48a12cfSAlexander Kornienko } // end namespace clang
107