1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===- unittest/Format/FormatTestJS.cpp - Formatting unit tests for JS ----===//
2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//
3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//                     The LLVM Compiler Infrastructure
4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//
5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// This file is distributed under the University of Illinois Open Source
6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// License. See LICENSE.TXT for details.
7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//
8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===//
9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "FormatTestUtils.h"
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Format/Format.h"
12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Support/Debug.h"
13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "gtest/gtest.h"
14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEBUG_TYPE "format-test"
166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace clang {
18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace format {
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass FormatTestJS : public ::testing::Test {
21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesprotected:
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static std::string format(llvm::StringRef Code, unsigned Offset,
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                            unsigned Length, const FormatStyle &Style) {
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    DEBUG(llvm::errs() << "---\n");
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    DEBUG(llvm::errs() << Code << "\n\n");
26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length));
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    tooling::Replacements Replaces = reformat(Style, Code, Ranges);
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    std::string Result = applyAllReplacements(Code, Replaces);
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    EXPECT_NE("", Result);
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    DEBUG(llvm::errs() << "\n" << Result << "\n\n");
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return Result;
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  static std::string format(
356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      llvm::StringRef Code,
366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_JavaScript)) {
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return format(Code, 0, Code.size(), Style);
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static FormatStyle getGoogleJSStyleWithColumns(unsigned ColumnLimit) {
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    FormatStyle Style = getGoogleStyle(FormatStyle::LK_JavaScript);
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Style.ColumnLimit = ColumnLimit;
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return Style;
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static void verifyFormat(
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      llvm::StringRef Code,
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_JavaScript)) {
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
53651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTEST_F(FormatTestJS, UnderstandsJavaScriptOperators) {
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("a == = b;");
55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("a != = b;");
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("a === b;");
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("aaaaaaa ===\n    b;", getGoogleJSStyleWithColumns(10));
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("a !== b;");
60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("aaaaaaa !==\n    b;", getGoogleJSStyleWithColumns(10));
61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("if (a + b + c +\n"
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               "        d !==\n"
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               "    e + f + g)\n"
64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               "  q();",
65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               getGoogleJSStyleWithColumns(20));
66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("a >> >= b;");
68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("a >>> b;");
70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("aaaaaaa >>>\n    b;", getGoogleJSStyleWithColumns(10));
71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("a >>>= b;");
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("aaaaaaa >>>=\n    b;", getGoogleJSStyleWithColumns(10));
73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("if (a + b + c +\n"
74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               "        d >>>\n"
75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               "    e + f + g)\n"
76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               "  q();",
77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               getGoogleJSStyleWithColumns(20));
78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("var x = aaaaaaaaaa ?\n"
79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               "            bbbbbb :\n"
80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               "            ccc;",
81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               getGoogleJSStyleWithColumns(20));
826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var b = a.map((x) => x + 1);");
846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, ES6DestructuringAssignment) {
876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var [a, b, c] = [1, 2, 3];");
886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var {a, b} = {a: 1, b: 2};");
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
91ef8225444452a1486bd721f3285301fe84643b00Stephen HinesTEST_F(FormatTestJS, ContainerLiterals) {
92ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  verifyFormat("return {\n"
93ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  link: function() {\n"
94ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    f();  //\n"
95ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  }\n"
96ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "};");
97ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  verifyFormat("return {\n"
98ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  a: a,\n"
99ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  link: function() {\n"
100ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    f();  //\n"
101ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  }\n"
102ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "};");
103ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  verifyFormat("return {\n"
104ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  a: a,\n"
105ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  link:\n"
106ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "      function() {\n"
107ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "        f();  //\n"
108ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "      },\n"
109ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  link:\n"
110ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "      function() {\n"
111ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "        f();  //\n"
112ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "      }\n"
113ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "};");
114ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
115ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
116651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTEST_F(FormatTestJS, SpacesInContainerLiterals) {
117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("var arr = [1, 2, 3];");
118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("var obj = {a: 1, b: 2, c: 3};");
119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var object_literal_with_long_name = {\n"
1216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  a: 'aaaaaaaaaaaaaaaaaa',\n"
1226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  b: 'bbbbbbbbbbbbbbbbbb'\n"
1236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "};");
1246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("var obj = {a: 1, b: 2, c: 3};",
126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               getChromiumStyle(FormatStyle::LK_JavaScript));
1276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("someVariable = {'a': [{}]};");
128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
130651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTEST_F(FormatTestJS, SingleQuoteStrings) {
131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("this.function('', true);");
132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, GoogScopes) {
1356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("goog.scope(function() {\n"
1366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "var x = a.b;\n"
1376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "var y = c.d;\n"
1386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "});  // goog.scope");
1396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
1406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
141ef8225444452a1486bd721f3285301fe84643b00Stephen HinesTEST_F(FormatTestJS, FormatsFreestandingFunctions) {
142ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  verifyFormat("function outer1(a, b) {\n"
143ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  function inner1(a, b) { return a; }\n"
144ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  inner1(a, b);\n"
145ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "}\n"
146ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "function outer2(a, b) {\n"
147ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  function inner2(a, b) { return a; }\n"
148ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  inner2(a, b);\n"
149ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "}");
150ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
151ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
152ef8225444452a1486bd721f3285301fe84643b00Stephen HinesTEST_F(FormatTestJS, FunctionLiterals) {
1536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("doFoo(function() { return 1; });");
1546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var func = function() { return 1; };");
1556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("return {\n"
1566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  body: {\n"
1576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    setAttribute: function(key, val) { this[key] = val; },\n"
1586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    getAttribute: function(key) { return this[key]; },\n"
1596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    style: {direction: ''}\n"
1606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  }\n"
1616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "};");
1626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  EXPECT_EQ("abc = xyz ? function() { return 1; } : function() { return -1; };",
1636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines            format("abc=xyz?function(){return 1;}:function(){return -1;};"));
1646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var closure = goog.bind(\n"
1666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    function() {  // comment\n"
1676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "      foo();\n"
1686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "      bar();\n"
1696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    },\n"
1706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    this, arg1IsReallyLongAndNeeedsLineBreaks,\n"
1716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    arg3IsReallyLongAndNeeedsLineBreaks);");
1726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var closure = goog.bind(function() {  // comment\n"
1736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  foo();\n"
1746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  bar();\n"
1756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "}, this);");
176ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  verifyFormat("return {\n"
177ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  a: 'E',\n"
178ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  b: function() {\n"
179ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    return function() {\n"
180ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "      f();  //\n"
181ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    };\n"
182ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  }\n"
183ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "};");
1846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var x = {a: function() { return 1; }};",
1866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               getGoogleJSStyleWithColumns(38));
1876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var x = {\n"
1886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  a: function() { return 1; }\n"
1896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "};",
1906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               getGoogleJSStyleWithColumns(37));
191ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
192ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  verifyFormat("return {\n"
193ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  a: function SomeFunction() {\n"
194ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    // ...\n"
195ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    return 1;\n"
196ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "  }\n"
197ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "};");
198ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
199ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
200ef8225444452a1486bd721f3285301fe84643b00Stephen HinesTEST_F(FormatTestJS, MultipleFunctionLiterals) {
201ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  verifyFormat("promise.then(\n"
202ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    function success() {\n"
203ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "      doFoo();\n"
204ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "      doBar();\n"
205ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    },\n"
206ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    function error() {\n"
207ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "      doFoo();\n"
208ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "      doBaz();\n"
209ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    },\n"
210ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    []);\n");
211ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  verifyFormat("promise.then(\n"
212ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    function success() {\n"
213ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "      doFoo();\n"
214ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "      doBar();\n"
215ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    },\n"
216ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    [],\n"
217ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    function error() {\n"
218ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "      doFoo();\n"
219ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "      doBaz();\n"
220ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "    });\n");
221ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // FIXME: Here, we should probably break right after the "(" for consistency.
222ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  verifyFormat("promise.then([],\n"
223ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "             function success() {\n"
224ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "               doFoo();\n"
225ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "               doBar();\n"
226ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "             },\n"
227ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "             function error() {\n"
228ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "               doFoo();\n"
229ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "               doBaz();\n"
230ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               "             });\n");
2316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
2326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, ReturnStatements) {
2346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("function() { return [hello, world]; }");
2356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
2366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, ClosureStyleComments) {
2386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var x = /** @type {foo} */ (bar);");
2396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
2406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, TryCatch) {
2426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("try {\n"
2436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  f();\n"
2446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "} catch (e) {\n"
2456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  g();\n"
2466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "} finally {\n"
2476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  h();\n"
2486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "}");
2496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
2506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, StringLiteralConcatenation) {
2526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var literal = 'hello ' +\n"
2536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "              'world';");
2546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
2556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, RegexLiteralClassification) {
2576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Regex literals.
2586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /abc/;");
2596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("f(/abc/);");
2606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("f(abc, /abc/);");
2616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("some_map[/abc/];");
2626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var x = a ? /abc/ : /abc/;");
2636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("for (var i = 0; /abc/.test(s[i]); i++) {\n}");
2646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var x = !/abc/.test(y);");
2656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var x = a && /abc/.test(y);");
2666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var x = a || /abc/.test(y);");
2676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var x = a + /abc/.search(y);");
2686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regexs = {/abc/, /abc/};");
2696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("return /abc/;");
2706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Not regex literals.
2726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var a = a / 2 + b / 3;");
2736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
2746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, RegexLiteralSpecialCharacters) {
2766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /a*/;");
2776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /a+/;");
2786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /a?/;");
2796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /.a./;");
2806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /a\\*/;");
2816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /^a$/;");
2826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\/a/;");
2836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /(?:x)/;");
2846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /x(?=y)/;");
2856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /x(?!y)/;");
2866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /x|y/;");
2876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /a{2}/;");
2886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /a{1,3}/;");
2896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /[abc]/;");
2906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /[^abc]/;");
2916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /[\\b]/;");
2926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\b/;");
2936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\B/;");
2946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\d/;");
2956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\D/;");
2966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\f/;");
2976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\n/;");
2986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\r/;");
2996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\s/;");
3006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\S/;");
3016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\t/;");
3026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\v/;");
3036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\w/;");
3046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\W/;");
3056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /a(a)\\1/;");
3066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\0/;");
3076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\\\/g;");
3086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\a\\\\/g;");
3096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\a\\//g;");
3106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
3116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, RegexLiteralModifiers) {
3136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /abc/g;");
3146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /abc/i;");
3156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /abc/m;");
3166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /abc/y;");
3176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
3186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, RegexLiteralLength) {
3206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/;",
3216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               getGoogleJSStyleWithColumns(60));
3226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex =\n"
3236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    /aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/;",
3246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               getGoogleJSStyleWithColumns(60));
3256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
3266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, RegexLiteralExamples) {
3286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = search.match(/(?:\?|&)times=([^?&]+)/i);");
3296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
3306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} // end namespace tooling
332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} // end namespace clang
333