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));
27b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    bool IncompleteFormat = false;
28b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    tooling::Replacements Replaces =
29b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat);
30b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    EXPECT_FALSE(IncompleteFormat);
314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto Result = applyAllReplacements(Code, Replaces);
324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    EXPECT_TRUE(static_cast<bool>(Result));
334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return *Result;
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  static std::string format(
386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      llvm::StringRef Code,
396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_JavaScript)) {
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return format(Code, 0, Code.size(), Style);
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static FormatStyle getGoogleJSStyleWithColumns(unsigned ColumnLimit) {
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    FormatStyle Style = getGoogleStyle(FormatStyle::LK_JavaScript);
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Style.ColumnLimit = ColumnLimit;
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return Style;
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static void verifyFormat(
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      llvm::StringRef Code,
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_JavaScript)) {
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    std::string Result = format(test::messUp(Code), Style);
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    EXPECT_EQ(Code.str(), Result) << "Formatted:\n" << Result;
544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static void verifyFormat(
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      llvm::StringRef Expected,
584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      llvm::StringRef Code,
594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_JavaScript)) {
604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    std::string Result = format(Code, Style);
614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    EXPECT_EQ(Expected.str(), Result) << "Formatted:\n" << Result;
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
654967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, BlockComments) {
664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("/* aaaaaaaaaaaaa */ aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
70651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTEST_F(FormatTestJS, UnderstandsJavaScriptOperators) {
71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("a == = b;");
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("a != = b;");
73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("a === b;");
75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("aaaaaaa ===\n    b;", getGoogleJSStyleWithColumns(10));
76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("a !== b;");
77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("aaaaaaa !==\n    b;", getGoogleJSStyleWithColumns(10));
78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("if (a + b + c +\n"
79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               "        d !==\n"
80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               "    e + f + g)\n"
81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               "  q();",
82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               getGoogleJSStyleWithColumns(20));
83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("a >> >= b;");
85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("a >>> b;");
87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("aaaaaaa >>>\n    b;", getGoogleJSStyleWithColumns(10));
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("a >>>= b;");
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("aaaaaaa >>>=\n    b;", getGoogleJSStyleWithColumns(10));
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("if (a + b + c +\n"
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               "        d >>>\n"
92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               "    e + f + g)\n"
93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               "  q();",
94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               getGoogleJSStyleWithColumns(20));
95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("var x = aaaaaaaaaa ?\n"
9687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    bbbbbb :\n"
9787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    ccc;",
98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               getGoogleJSStyleWithColumns(20));
996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var b = a.map((x) => x + 1);");
101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("return ('aaa') in bbbb;");
1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = aaaaaaaaaaaaaaaaaaaaaaaaa() in\n"
1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "    aaaa.aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  FormatStyle Style = getGoogleJSStyleWithColumns(80);
1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Style.AlignOperands = true;
1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = aaaaaaaaaaaaaaaaaaaaaaaaa() in\n"
1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "        aaaa.aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               Style);
1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = aaaaaaaaaaaaaaaaaaaaaaaaa()\n"
1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "            in aaaa.aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               Style);
113b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
114b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // ES6 spread operator.
115b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("someFunction(...a);");
116b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var x = [1, ...a, 2];");
117176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
118176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST_F(FormatTestJS, UnderstandsAmpAmp) {
120176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("e && e.SomeFunction();");
121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
122176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST_F(FormatTestJS, LiteralOperatorsCanBeKeywords) {
124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("not.and.or.not_eq = 1;");
1256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
1266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
12787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(FormatTestJS, ReservedWords) {
12887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // JavaScript reserved words (aka keywords) are only illegal when used as
12987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Identifiers, but are legal as IdentifierNames.
13087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("x.class.struct = 1;");
13187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("x.case = 1;");
13287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("x.interface = 1;");
1334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("x.for = 1;");
1344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("x.of() = 1;");
1354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("x.in() = 1;");
1364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("x.let() = 1;");
1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("x.var() = 1;");
13887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("x = {\n"
13987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  a: 12,\n"
14087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  interface: 1,\n"
14187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  switch: 1,\n"
14287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "};");
14387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var struct = 2;");
14487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var union = 2;");
1454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var interface = 2;");
1464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("interface = 2;");
1474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("x = interface instanceof y;");
1484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1504967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, CppKeywords) {
1514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Make sure we don't mess stuff up because of C++ keywords.
1524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("return operator && (aa);");
15387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
15487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, ES6DestructuringAssignment) {
1566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var [a, b, c] = [1, 2, 3];");
1574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("const [a, b, c] = [1, 2, 3];");
15887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("let [a, b, c] = [1, 2, 3];");
1593ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  verifyFormat("var {a, b} = {a: 1, b: 2};");
16087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("let {a, b} = {a: 1, b: 2};");
161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
163c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesTEST_F(FormatTestJS, ContainerLiterals) {
164b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var x = {y: function(a) { return a; }};");
165c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  verifyFormat("return {\n"
166c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "  link: function() {\n"
167c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    f();  //\n"
168c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "  }\n"
169c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "};");
170c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  verifyFormat("return {\n"
171c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "  a: a,\n"
172c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "  link: function() {\n"
173c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    f();  //\n"
174c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "  }\n"
175c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "};");
176c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  verifyFormat("return {\n"
177c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "  a: a,\n"
178176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  link: function() {\n"
179176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "    f();  //\n"
180176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  },\n"
181176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  link: function() {\n"
182176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "    f();  //\n"
183176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  }\n"
184176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "};");
185176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("var stuff = {\n"
186176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  // comment for update\n"
187176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  update: false,\n"
188176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  // comment for modules\n"
189176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  modules: false,\n"
190176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  // comment for tasks\n"
191176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  tasks: false\n"
192176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "};");
193176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("return {\n"
194176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  'finish':\n"
195176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "      //\n"
196176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "      a\n"
197c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "};");
1980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("var obj = {\n"
1990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "  fooooooooo: function(x) {\n"
2000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "    return x.zIsTooLongForOneLineWithTheDeclarationLine();\n"
2010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "  }\n"
2020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "};");
2033ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // Simple object literal, as opposed to enum style below.
2043ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  verifyFormat("var obj = {a: 123};");
2053ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // Enum style top level assignment.
2063ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  verifyFormat("X = {\n  a: 123\n};");
2073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  verifyFormat("X.Y = {\n  a: 123\n};");
208b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // But only on the top level, otherwise its a plain object literal assignment.
209b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("function x() {\n"
210b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  y = {z: 1};\n"
211b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "}");
2123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  verifyFormat("x = foo && {a: 123};");
213b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
214b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // Arrow functions in object literals.
215b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var x = {y: (a) => { return a; }};");
216b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var x = {y: (a) => a};");
217b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
218b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // Computed keys.
219b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var x = {[a]: 1, b: 2, [c]: 3};");
220b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var x = {\n"
221b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  [a]: 1,\n"
222b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  b: 2,\n"
223b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  [c]: 3,\n"
224b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "};");
2254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Object literals can leave out labels.
2274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("f({a}, () => {\n"
2284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  g();  //\n"
2294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "});");
2304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Keys can be quoted.
2324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = {\n"
2334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  a: a,\n"
2344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  b: b,\n"
2354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  'c': c,\n"
2364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "};");
237c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
238c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
23958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga NainarTEST_F(FormatTestJS, MethodsInObjectLiterals) {
24058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  verifyFormat("var o = {\n"
24158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "  value: 'test',\n"
24258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "  get value() {  // getter\n"
24358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "    return this.value;\n"
24458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "  }\n"
24558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "};");
24658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  verifyFormat("var o = {\n"
24758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "  value: 'test',\n"
24858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "  set value(val) {  // setter\n"
24958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "    this.value = val;\n"
25058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "  }\n"
25158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "};");
25258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  verifyFormat("var o = {\n"
25358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "  value: 'test',\n"
25458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "  someMethod(val) {  // method\n"
25558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "    doSomething(this.value + val);\n"
25658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "  }\n"
25758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "};");
25858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  verifyFormat("var o = {\n"
25958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "  someMethod(val) {  // method\n"
26058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "    doSomething(this.value + val);\n"
26158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "  },\n"
26258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "  someOtherMethod(val) {  // method\n"
26358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "    doSomething(this.value + val);\n"
26458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "  }\n"
26558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "};");
26658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}
26758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
268651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTEST_F(FormatTestJS, SpacesInContainerLiterals) {
269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("var arr = [1, 2, 3];");
2700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("f({a: 1, b: 2, c: 3});");
271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var object_literal_with_long_name = {\n"
2736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  a: 'aaaaaaaaaaaaaaaaaa',\n"
2746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  b: 'bbbbbbbbbbbbbbbbbb'\n"
2756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "};");
2766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("f({a: 1, b: 2, c: 3});",
278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               getChromiumStyle(FormatStyle::LK_JavaScript));
2790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("f({'a': [{}]});");
280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2824967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, SingleQuotedStrings) {
283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  verifyFormat("this.function('', true);");
284651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, GoogScopes) {
2876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("goog.scope(function() {\n"
2886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "var x = a.b;\n"
2896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "var y = c.d;\n"
2906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "});  // goog.scope");
29158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  verifyFormat("goog.scope(function() {\n"
29258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "// test\n"
29358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "var x = 0;\n"
29458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "// test\n"
29558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "});");
2966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
2976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2980e2c34f92f00628d48968dfea096d36381f494cbStephen HinesTEST_F(FormatTestJS, GoogModules) {
2990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("goog.module('this.is.really.absurdly.long');",
3000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               getGoogleJSStyleWithColumns(40));
3010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("goog.require('this.is.really.absurdly.long');",
3020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               getGoogleJSStyleWithColumns(40));
3030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("goog.provide('this.is.really.absurdly.long');",
3040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               getGoogleJSStyleWithColumns(40));
3050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("var long = goog.require('this.is.really.absurdly.long');",
3060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               getGoogleJSStyleWithColumns(40));
30787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("goog.setTestOnly('this.is.really.absurdly.long');",
30887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               getGoogleJSStyleWithColumns(40));
3094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("goog.forwardDeclare('this.is.really.absurdly.long');",
3104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               getGoogleJSStyleWithColumns(40));
3110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
3120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // These should be wrapped normally.
3130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat(
3140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      "var MyLongClassName =\n"
3150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      "    goog.module.get('my.long.module.name.followedBy.MyLongClassName');");
3160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
3170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
3184967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, FormatsNamespaces) {
3194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("namespace Foo {\n"
3204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  export let x = 1;\n"
3214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}\n");
3224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("declare namespace Foo {\n"
3234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  export let x: number;\n"
3244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}\n");
3254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
327c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesTEST_F(FormatTestJS, FormatsFreestandingFunctions) {
328c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  verifyFormat("function outer1(a, b) {\n"
329c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "  function inner1(a, b) { return a; }\n"
330c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "  inner1(a, b);\n"
331c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "}\n"
332c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "function outer2(a, b) {\n"
333c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "  function inner2(a, b) { return a; }\n"
334c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "  inner2(a, b);\n"
335c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "}");
336b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("function f() {}");
337b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar}
338b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
3394967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, GeneratorFunctions) {
3404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("function* f() {\n"
3414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  let x = 1;\n"
3424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  yield x;\n"
3434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  yield* something();\n"
3444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
3454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("function*\n"
3464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "    f() {\n"
3474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}",
3484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               getGoogleJSStyleWithColumns(8));
3494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("export function* f() {\n"
3504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  yield 1;\n"
3514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}\n");
3524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("class X {\n"
3534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  * generatorMethod() { yield x; }\n"
3544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
3554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3574967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, AsyncFunctions) {
3584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("async function f() {\n"
3594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  let x = 1;\n"
3604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  return fetch(x);\n"
3614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
3624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("async function* f() {\n"
3634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  yield fetch(x);\n"
3644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
3654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("export async function f() {\n"
3664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  return fetch(x);\n"
3674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
3684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("class X {\n"
3694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  async asyncMethod() { return fetch(1); }\n"
3704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
3714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("function initialize() {\n"
3724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  // Comment.\n"
3734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  return async.then();\n"
3744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}\n");
3754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
377b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarTEST_F(FormatTestJS, ArrayLiterals) {
37887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var aaaaa: List<SomeThing> =\n"
37987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    [new SomeThingAAAAAAAAAAAA(), new SomeThingBBBBBBBBB()];");
380b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("return [\n"
3814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
382b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  ccccccccccccccccccccccccccc\n"
383b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "];");
3844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("return [\n"
3854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  aaaa().bbbbbbbb('A'),\n"
3864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  aaaa().bbbbbbbb('B'),\n"
3874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  aaaa().bbbbbbbb('C'),\n"
3884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "];");
38987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var someVariable = SomeFunction([\n"
3904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
391b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  ccccccccccccccccccccccccccc\n"
392b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "]);");
39387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var someVariable = SomeFunction([\n"
394b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  [aaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbbbbbbbbb],\n"
395b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "]);",
396b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               getGoogleJSStyleWithColumns(51));
39787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var someVariable = SomeFunction(aaaa, [\n"
3984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
399b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  ccccccccccccccccccccccccccc\n"
400b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "]);");
40187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var someVariable = SomeFunction(\n"
40287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    aaaa,\n"
40387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    [\n"
4044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "      aaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
4054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "      cccccccccccccccccccccccccc\n"
40687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    ],\n"
40787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    aaaa);");
4084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var aaaa = aaaaa ||  // wrap\n"
4094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "    [];");
410b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
411b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("someFunction([], {a: a});");
412c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
413c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
4144967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, ColumnLayoutForArrayLiterals) {
4154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var array = [\n"
4164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  a, a, a, a, a, a, a, a, a, a, a, a, a, a, a,\n"
4174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  a, a, a, a, a, a, a, a, a, a, a, a, a, a, a,\n"
4184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "];");
4194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var array = someFunction([\n"
4204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  a, a, a, a, a, a, a, a, a, a, a, a, a, a, a,\n"
4214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  a, a, a, a, a, a, a, a, a, a, a, a, a, a, a,\n"
4224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "]);");
4234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
425c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesTEST_F(FormatTestJS, FunctionLiterals) {
426176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("doFoo(function() {});");
4276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("doFoo(function() { return 1; });");
428176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("var func = function() {\n"
429176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  return 1;\n"
430176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "};");
43187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var func =  //\n"
43287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    function() {\n"
43387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  return 1;\n"
43487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "};");
4356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("return {\n"
4366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  body: {\n"
4376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    setAttribute: function(key, val) { this[key] = val; },\n"
4386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    getAttribute: function(key) { return this[key]; },\n"
4396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    style: {direction: ''}\n"
4406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  }\n"
4416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "};");
44287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("abc = xyz ? function() {\n"
44387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  return 1;\n"
44487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "} : function() {\n"
44587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  return -1;\n"
44687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "};");
4476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var closure = goog.bind(\n"
4496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    function() {  // comment\n"
4506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "      foo();\n"
4516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "      bar();\n"
4526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    },\n"
4536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    this, arg1IsReallyLongAndNeeedsLineBreaks,\n"
4546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    arg3IsReallyLongAndNeeedsLineBreaks);");
4556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var closure = goog.bind(function() {  // comment\n"
4566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  foo();\n"
4576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  bar();\n"
4586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "}, this);");
459c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  verifyFormat("return {\n"
460c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "  a: 'E',\n"
461c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "  b: function() {\n"
462c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    return function() {\n"
463c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "      f();  //\n"
464c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    };\n"
465c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "  }\n"
466c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "};");
4670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("{\n"
4680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "  var someVariable = function(x) {\n"
4690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "    return x.zIsTooLongForOneLineWithTheDeclarationLine();\n"
4700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "  };\n"
4710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "}");
472b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("someLooooooooongFunction(\n"
473b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
474b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
475b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "    function(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
476b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "      // code\n"
477b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "    });");
4786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("f({a: function() { return 1; }});",
4800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               getGoogleJSStyleWithColumns(33));
4810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("f({\n"
4826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  a: function() { return 1; }\n"
4830e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "});",
4840e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               getGoogleJSStyleWithColumns(32));
485c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
486c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  verifyFormat("return {\n"
487c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "  a: function SomeFunction() {\n"
488c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    // ...\n"
489c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    return 1;\n"
490c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "  }\n"
491c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "};");
4920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("this.someObject.doSomething(aaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "    .then(goog.bind(function(aaaaaaaaaaa) {\n"
4940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "      someFunction();\n"
4950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "      someFunction();\n"
4960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "    }, this), aaaaaaaaaaaaaaaaa);");
4970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
49887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("someFunction(goog.bind(function() {\n"
49987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  doSomething();\n"
50087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  doSomething();\n"
50187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "}, this), goog.bind(function() {\n"
50287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  doSomething();\n"
50387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  doSomething();\n"
50487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "}, this));");
505b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
506b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // FIXME: This is bad, we should be wrapping before "function() {".
507b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("someFunction(function() {\n"
508b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  doSomething();  // break\n"
509b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "})\n"
510b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "    .doSomethingElse(\n"
511b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "        // break\n"
512b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "        );");
513c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
514c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
515176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST_F(FormatTestJS, InliningFunctionLiterals) {
516176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  FormatStyle Style = getGoogleStyle(FormatStyle::LK_JavaScript);
517176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
518176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("var func = function() {\n"
519176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  return 1;\n"
520176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "};",
521176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               Style);
522176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("var func = doSomething(function() { return 1; });", Style);
523176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("var outer = function() {\n"
524176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  var inner = function() { return 1; }\n"
525176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "};",
526176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               Style);
527176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("function outer1(a, b) {\n"
528176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  function inner1(a, b) { return a; }\n"
529176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "}",
530176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               Style);
531176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
532176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
533176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("var func = function() { return 1; };", Style);
534176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("var func = doSomething(function() { return 1; });", Style);
535176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat(
536176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      "var outer = function() { var inner = function() { return 1; } };",
537176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      Style);
538176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("function outer1(a, b) {\n"
539176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  function inner1(a, b) { return a; }\n"
540176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "}",
541176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               Style);
542176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
543176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
544176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("var func = function() {\n"
545176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  return 1;\n"
546176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "};",
547176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               Style);
548176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("var func = doSomething(function() {\n"
549176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  return 1;\n"
550176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "});",
551176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               Style);
552176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("var outer = function() {\n"
553176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  var inner = function() {\n"
554176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "    return 1;\n"
555176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  }\n"
556176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "};",
557176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               Style);
558176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("function outer1(a, b) {\n"
559176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  function inner1(a, b) {\n"
560176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "    return a;\n"
561176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  }\n"
562176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "}",
563176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               Style);
56487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
56587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
56687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var func = function() {\n"
56787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  return 1;\n"
56887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "};",
56987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               Style);
570176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
571176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
572c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesTEST_F(FormatTestJS, MultipleFunctionLiterals) {
573c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  verifyFormat("promise.then(\n"
574c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    function success() {\n"
575c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "      doFoo();\n"
576c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "      doBar();\n"
577c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    },\n"
578c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    function error() {\n"
579c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "      doFoo();\n"
580c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "      doBaz();\n"
581c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    },\n"
582c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    []);\n");
583c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  verifyFormat("promise.then(\n"
584c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    function success() {\n"
585c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "      doFoo();\n"
586c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "      doBar();\n"
587c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    },\n"
588c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    [],\n"
589c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    function error() {\n"
590c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "      doFoo();\n"
591c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "      doBaz();\n"
592c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines               "    });\n");
59387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("promise.then(\n"
59487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    [],\n"
59587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    function success() {\n"
59687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "      doFoo();\n"
59787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "      doBar();\n"
59887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    },\n"
59987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    function error() {\n"
60087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "      doFoo();\n"
60187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "      doBaz();\n"
60287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    });\n");
603176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
604176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("getSomeLongPromise()\n"
605176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "    .then(function(value) { body(); })\n"
6060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "    .thenCatch(function(error) {\n"
6070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "      body();\n"
6080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "      body();\n"
6090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "    });");
610176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("getSomeLongPromise()\n"
611176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "    .then(function(value) {\n"
612176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "      body();\n"
613176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "      body();\n"
614176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "    })\n"
615176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "    .thenCatch(function(error) {\n"
616176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "      body();\n"
617176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "      body();\n"
618176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "    });");
6190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
62058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  verifyFormat("getSomeLongPromise()\n"
62158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "    .then(function(value) { body(); })\n"
62258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "    .thenCatch(function(error) { body(); });");
6234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("return [aaaaaaaaaaaaaaaaaaaaaa]\n"
6254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "    .aaaaaaa(function() {\n"
6264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "      //\n"
6274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "    })\n"
6284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "    .bbbbbb();");
6296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
6306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
631b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarTEST_F(FormatTestJS, ArrowFunctions) {
632b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var x = (a) => {\n"
633b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  return a;\n"
634b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "};");
635b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var x = (a) => {\n"
636b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  function y() { return 42; }\n"
637b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  return a;\n"
638b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "};");
639b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var x = (a: type): {some: type} => {\n"
640b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  return a;\n"
641b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "};");
642b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var x = (a) => a;");
643b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("return () => [];");
644b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var aaaaaaaaaaaaaaaaaaaa = {\n"
645b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  aaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
646b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "      (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
647b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) =>\n"
648b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
649b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "};");
65087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var a = a.aaaaaaa(\n"
65187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    (a: a) => aaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbb) &&\n"
65287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "        aaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbb));");
65387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var a = a.aaaaaaa(\n"
65487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    (a: a) => aaaaaaaaaaaaaaaaaaaaa(bbbbbbbbb) ?\n"
65587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "        aaaaaaaaaaaaaaaaaaaaa(bbbbbbb) :\n"
65687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "        aaaaaaaaaaaaaaaaaaaaa(bbbbbbb));");
657b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
658b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // FIXME: This is bad, we should be wrapping before "() => {".
659b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("someFunction(() => {\n"
660b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  doSomething();  // break\n"
661b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "})\n"
662b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "    .doSomethingElse(\n"
663b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "        // break\n"
664b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "        );");
665b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar}
666b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
6676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, ReturnStatements) {
668176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("function() {\n"
669176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "  return [hello, world];\n"
670176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "}");
6716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
6726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
67387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(FormatTestJS, ForLoops) {
67487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("for (var i in [2, 3]) {\n"
67587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "}");
6764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("for (var i of [2, 3]) {\n"
6774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
6784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("for (let {a, b} of x) {\n"
6794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
6804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("for (let {a, b} in x) {\n"
6814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
68287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
68387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
6844967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, WrapRespectsAutomaticSemicolonInsertion) {
685b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // The following statements must not wrap, as otherwise the program meaning
686b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // would change due to automatic semicolon insertion.
687b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // See http://www.ecma-international.org/ecma-262/5.1/#sec-7.9.1.
688b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("return aaaaa;", getGoogleJSStyleWithColumns(10));
689b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("continue aaaaa;", getGoogleJSStyleWithColumns(10));
690b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("break aaaaa;", getGoogleJSStyleWithColumns(10));
691b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("throw aaaaa;", getGoogleJSStyleWithColumns(10));
692b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("aaaaaaaaa++;", getGoogleJSStyleWithColumns(10));
693b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("aaaaaaaaa--;", getGoogleJSStyleWithColumns(10));
6944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("return [\n"
6954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  aaa\n"
6964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "];",
6974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               getGoogleJSStyleWithColumns(12));
6984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7004967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, AutomaticSemicolonInsertionHeuristic) {
7014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("a\n"
7024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "b;",
7034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               " a \n"
7044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               " b ;");
7054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("a()\n"
7064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "b;",
7074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               " a ()\n"
7084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               " b ;");
7094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("a[b]\n"
7104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "c;",
7114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "a [b]\n"
7124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "c ;");
7134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("1\n"
7144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "a;",
7154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "1 \n"
7164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "a ;");
7174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("a\n"
7184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "1;",
7194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "a \n"
7204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "1 ;");
7214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("a\n"
7224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "'x';",
7234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "a \n"
7244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               " 'x';");
7254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("a++\n"
7264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "b;",
7274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "a ++\n"
7284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "b ;");
7294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("a\n"
7304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "!b && c;",
7314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "a \n"
7324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               " ! b && c;");
7334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("a\n"
7344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "if (1) f();",
7354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               " a\n"
7364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               " if (1) f();");
7374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("a\n"
7384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "class X {}",
7394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               " a\n"
7404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               " class X {}");
7414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var a", "var\n"
7424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "a");
7434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("x instanceof String", "x\n"
7444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                      "instanceof\n"
7454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                      "String");
7464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("function f(@Foo bar) {}", "function f(@Foo\n"
7474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                          "  bar) {}");
748b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar}
749b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
750b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarTEST_F(FormatTestJS, ClosureStyleCasts) {
7516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var x = /** @type {foo} */ (bar);");
7526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
7536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
7546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, TryCatch) {
7556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("try {\n"
7566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  f();\n"
7576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "} catch (e) {\n"
7586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  g();\n"
7596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "} finally {\n"
7606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "  h();\n"
7616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "}");
762176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
763176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // But, of course, "catch" is a perfectly fine function name in JavaScript.
764176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("someObject.catch();");
7650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("someObject.new();");
7660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("someObject.delete();");
7676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
7686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
7696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, StringLiteralConcatenation) {
7706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var literal = 'hello ' +\n"
77187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    'world';");
7726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
7736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
7746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, RegexLiteralClassification) {
7756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Regex literals.
7766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /abc/;");
7776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("f(/abc/);");
7786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("f(abc, /abc/);");
7796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("some_map[/abc/];");
7806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var x = a ? /abc/ : /abc/;");
7816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("for (var i = 0; /abc/.test(s[i]); i++) {\n}");
7826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var x = !/abc/.test(y);");
7836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var x = a && /abc/.test(y);");
7846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var x = a || /abc/.test(y);");
7856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var x = a + /abc/.search(y);");
78687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("/abc/.search(y);");
7876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regexs = {/abc/, /abc/};");
7886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("return /abc/;");
7896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
7906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Not regex literals.
7916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var a = a / 2 + b / 3;");
79287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var a = a++ / 2;");
79387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Prefix unary can operate on regex literals, not that it makes sense.
79487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var a = ++/a/;");
79587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
79687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // This is a known issue, regular expressions are incorrectly detected if
79787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // directly following a closing parenthesis.
79887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("if (foo) / bar /.exec(baz);");
7996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
8006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
8016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, RegexLiteralSpecialCharacters) {
802b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var regex = /=/;");
8036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /a*/;");
8046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /a+/;");
8056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /a?/;");
8066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /.a./;");
8076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /a\\*/;");
8086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /^a$/;");
8096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\/a/;");
8106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /(?:x)/;");
8116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /x(?=y)/;");
8126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /x(?!y)/;");
8136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /x|y/;");
8146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /a{2}/;");
8156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /a{1,3}/;");
81687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
8176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /[abc]/;");
8186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /[^abc]/;");
8196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /[\\b]/;");
82087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var regex = /[/]/;");
82187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var regex = /[\\/]/;");
82287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var regex = /\\[/;");
82387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var regex = /\\\\[/]/;");
82487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var regex = /}[\"]/;");
82587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var regex = /}[/\"]/;");
82687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var regex = /}[\"/]/;");
82787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
8286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\b/;");
8296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\B/;");
8306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\d/;");
8316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\D/;");
8326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\f/;");
8336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\n/;");
8346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\r/;");
8356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\s/;");
8366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\S/;");
8376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\t/;");
8386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\v/;");
8396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\w/;");
8406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\W/;");
8416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /a(a)\\1/;");
8426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\0/;");
8436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\\\/g;");
8446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\\a\\\\/g;");
8456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /\a\\//g;");
846176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  verifyFormat("var regex = /a\\//;\n"
847176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines               "var x = 0;");
8484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var regex = /'/g;", "var regex = /'/g ;");
8494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var regex = /'/g;  //'", "var regex = /'/g ; //'");
8504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var regex = /\\/*/;\n"
8514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "var x = 0;",
8524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "var regex = /\\/*/;\n"
8534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "var x=0;");
8544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = /a\\//;", "var x = /a\\//  \n;");
85587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var regex = /\"/;", getGoogleJSStyleWithColumns(16));
85687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var regex =\n"
85787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    /\"/;",
85887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               getGoogleJSStyleWithColumns(15));
85987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var regex =  //\n"
86087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    /a/;");
86187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var regexs = [\n"
86287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  /d/,   //\n"
86387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  /aa/,  //\n"
86487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "];");
8656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
8666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
8676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, RegexLiteralModifiers) {
8686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /abc/g;");
8696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /abc/i;");
8706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /abc/m;");
8716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /abc/y;");
8726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
8736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
8746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, RegexLiteralLength) {
8756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = /aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/;",
8766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               getGoogleJSStyleWithColumns(60));
8776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex =\n"
8786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               "    /aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/;",
8796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines               getGoogleJSStyleWithColumns(60));
8800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("var regex = /\\xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/;",
8810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               getGoogleJSStyleWithColumns(50));
8826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
8836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
8846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST_F(FormatTestJS, RegexLiteralExamples) {
8856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  verifyFormat("var regex = search.match(/(?:\?|&)times=([^?&]+)/i);");
8866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
8876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
8880e2c34f92f00628d48968dfea096d36381f494cbStephen HinesTEST_F(FormatTestJS, TypeAnnotations) {
8890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("var x: string;");
8904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x: {a: string; b: number;} = {};");
8910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("function x(): string {\n  return 'x';\n}");
892b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("function x(): {x: string} {\n  return {x: 'x'};\n}");
8930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("function x(y: string): string {\n  return 'x';\n}");
8940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("for (var y: string in x) {\n  x();\n}");
8954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("for (var y: string of x) {\n  x();\n}");
8964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("function x(y: {a?: number;} = {}): number {\n"
8974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  return 12;\n"
8984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
8990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("((a: string, b: number): string => a + b);");
9000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("var x: (y: number) => string;");
9010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("var x: P<string, (a: number) => string>;");
902b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var x = {y: function(): z { return 1; }};");
903b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var x = {y: function(): {a: number} { return 1; }};");
9044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("function someFunc(args: string[]):\n"
9054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "    {longReturnValue: string[]} {}",
9064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               getGoogleJSStyleWithColumns(60));
9074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
9084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9094967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, UnionIntersectionTypes) {
9104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("let x: A|B = A | B;");
9114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("let x: A&B|C = A & B;");
9124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("let x: Foo<A|B> = new Foo<A|B>();");
9134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("function(x: A|B): C&D {}");
9144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("function(x: A|B = A | B): C&D {}");
9154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("function x(path: number|string) {}");
9164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("function x(): string|number {}");
9174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("type Foo = Bar|Baz;");
9184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("type Foo = Bar<X>|Baz;");
9194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("type Foo = (Bar<X>|Baz);");
9204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("let x: Bar|Baz;");
9214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("let x: Bar<X>|Baz;");
9224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("let x: (Foo|Bar)[];");
9230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
9240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
9250e2c34f92f00628d48968dfea096d36381f494cbStephen HinesTEST_F(FormatTestJS, ClassDeclarations) {
9260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("class C {\n  x: string = 12;\n}");
9270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("class C {\n  x(): string => 12;\n}");
9280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("class C {\n  ['x' + 2]: string = 12;\n}");
9290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("class C {\n  private x: string = 12;\n}");
9300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("class C {\n  private static x: string = 12;\n}");
9310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("class C {\n  static x(): string { return 'asd'; }\n}");
9320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("class C extends P implements I {}");
93358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  verifyFormat("class C extends p.P implements i.I {}");
93487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("class Test {\n"
93587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa: aaaaaaaaaaaaaaaaaaaa):\n"
93687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "      aaaaaaaaaaaaaaaaaaaaaa {}\n"
93787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "}");
9384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("foo = class Name {\n"
9394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  constructor() {}\n"
9404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "};");
9414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("foo = class {\n"
9424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  constructor() {}\n"
9434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "};");
9444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("class C {\n"
9454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  x: {y: Z;} = {};\n"
9464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  private y: {y: Z;} = {};\n"
9474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
948b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
949b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // ':' is not a type declaration here.
950b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("class X {\n"
951b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  subs = {\n"
952b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "    'b': {\n"
953b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "      'c': 1,\n"
954b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "    },\n"
955b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  };\n"
956b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "}");
9574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("@Component({\n"
9584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  moduleId: module.id,\n"
9594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "})\n"
9604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "class SessionListComponent implements OnDestroy, OnInit {\n"
9614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
962b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar}
963b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
964b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarTEST_F(FormatTestJS, InterfaceDeclarations) {
965b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("interface I {\n"
966b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  x: string;\n"
9674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  enum: string[];\n"
9684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  enum?: string[];\n"
969b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "}\n"
970b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "var y;");
97187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Ensure that state is reset after parsing the interface.
97287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("interface a {}\n"
97387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "export function b() {}\n"
97487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "var x;");
9754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Arrays of object type literals.
9774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("interface I {\n"
9784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  o: {}[];\n"
9794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
98087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
98187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
98287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(FormatTestJS, EnumDeclarations) {
98387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("enum Foo {\n"
98487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  A = 1,\n"
98587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  B\n"
98687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "}");
98787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("export /* somecomment*/ enum Foo {\n"
98887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  A = 1,\n"
98987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  B\n"
99087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "}");
99187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("enum Foo {\n"
99287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  A = 1,  // comment\n"
99387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "  B\n"
99487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "}\n"
99587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "var x = 1;");
9960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
9970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
9980e2c34f92f00628d48968dfea096d36381f494cbStephen HinesTEST_F(FormatTestJS, MetadataAnnotations) {
9990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("@A\nclass C {\n}");
10000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("@A({arg: 'value'})\nclass C {\n}");
10010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("@A\n@B\nclass C {\n}");
10020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("class C {\n  @A x: string;\n}");
10030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("class C {\n"
10040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "  @A\n"
10050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "  private x(): string {\n"
10060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "    return 'y';\n"
10070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "  }\n"
10080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "}");
10094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("class C {\n"
10104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  private x(@A x: string) {}\n"
10114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
10120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("class X {}\n"
10130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "class Y {}");
10140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
10150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
10164967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, TypeAliases) {
10174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("type X = number;\n"
10184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "class C {}");
10194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("type X<Y> = Z<Y>;");
10204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("type X = {\n"
10214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  y: number\n"
10224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "};\n"
10234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "class C {}");
10244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
10254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10260e2c34f92f00628d48968dfea096d36381f494cbStephen HinesTEST_F(FormatTestJS, Modules) {
10270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("import SomeThing from 'some/module.js';");
10280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("import {X, Y} from 'some/module.js';");
10294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("import a, {X, Y} from 'some/module.js';");
10304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("import {X, Y,} from 'some/module.js';");
10310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("import {X as myLocalX, Y as myLocalY} from 'some/module.js';");
10324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Ensure Automatic Semicolon Insertion does not break on "as\n".
10334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("import {X as myX} from 'm';", "import {X as\n"
10344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                              " myX} from 'm';");
10350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("import * as lib from 'some/module.js';");
10363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  verifyFormat("var x = {import: 1};\nx.import = 2;");
10370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
10380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("export function fn() {\n"
10390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "  return 'fn';\n"
10400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "}");
1041b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("export function A() {}\n"
1042b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "export default function B() {}\n"
1043b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "export function C() {}");
10444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("export default () => {\n"
10454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  let x = 1;\n"
10464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  return x;\n"
10474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
10480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("export const x = 12;");
10490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("export default class X {}");
10500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("export {X, Y} from 'some/module.js';");
10514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("export {X, Y,} from 'some/module.js';");
10524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("export {SomeVeryLongExport as X, "
10534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "SomeOtherVeryLongExport as Y} from 'some/module.js';");
10544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // export without 'from' is wrapped.
10554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("export let someRatherLongVariableName =\n"
10564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "    someSurprisinglyLongVariable + someOtherRatherLongVar;");
10574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // ... but not if from is just an identifier.
10580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("export {\n"
10594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  from as from,\n"
10604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  someSurprisinglyLongVariable as\n"
10614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "      from\n"
10624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "};",
10634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               getGoogleJSStyleWithColumns(20));
10640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("export class C {\n"
10650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "  x: number;\n"
10660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "  y: string;\n"
10670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "}");
10680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("export class X { y: number; }");
10694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("export abstract class X { y: number; }");
10700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("export default class X { y: number }");
10710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("export default function() {\n  return 1;\n}");
10720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("export var x = 12;");
1073b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("class C {}\n"
1074b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "export function f() {}\n"
1075b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "var v;");
10760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("export var x: number = 12;");
10770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("export const y = {\n"
10780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "  a: 1,\n"
10790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "  b: 2\n"
10800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "};");
1081b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("export enum Foo {\n"
1082b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  BAR,\n"
1083b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  // adsdasd\n"
1084b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  BAZ\n"
1085b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "}");
10864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("export default [\n"
10874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
10884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
10894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "];");
10904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("export default [];");
10914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("export default () => {};");
10924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("export interface Foo { foo: number; }\n"
10934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "export class Bar {\n"
10944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  blah(): string { return this.blah; };\n"
10954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
10964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
10974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10984967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, ImportWrapping) {
10994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("import {VeryLongImportsAreAnnoying, VeryLongImportsAreAnnoying,"
11004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               " VeryLongImportsAreAnnoying, VeryLongImportsAreAnnoying"
11014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "} from 'some/module.js';");
11024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  FormatStyle Style = getGoogleJSStyleWithColumns(80);
11034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Style.JavaScriptWrapImports = true;
11044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("import {\n"
11054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  VeryLongImportsAreAnnoying,\n"
11064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  VeryLongImportsAreAnnoying,\n"
11074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  VeryLongImportsAreAnnoying,\n"
11084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "} from 'some/module.js';",
11094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               Style);
11104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("import {\n"
11114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  A,\n"
11124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  A,\n"
11134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "} from 'some/module.js';",
11144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               Style);
11154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("export {\n"
11164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  A,\n"
11174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  A,\n"
11184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "} from 'some/module.js';",
11194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               Style);
11200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
11210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
11220e2c34f92f00628d48968dfea096d36381f494cbStephen HinesTEST_F(FormatTestJS, TemplateStrings) {
11230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // Keeps any whitespace/indentation within the template string.
11244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = `hello\n"
11250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines            "     ${  name    }\n"
11260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines            "  !`;",
11274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            "var x    =    `hello\n"
11280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                   "     ${  name    }\n"
11294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                   "  !`;");
11300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
11310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("var x =\n"
11320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               "    `hello ${world}` >= some();",
11330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines               getGoogleJSStyleWithColumns(34)); // Barely doesn't fit.
11340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("var x = `hello ${world}` >= some();",
113587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               getGoogleJSStyleWithColumns(35)); // Barely fits.
11364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = `hellö ${wörld}` >= söme();",
11374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               getGoogleJSStyleWithColumns(35)); // Fits due to UTF-8.
11384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = `hello\n"
11390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines            "  ${world}` >=\n"
114087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "    some();",
11414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            "var x =\n"
11420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                   "    `hello\n"
11430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                   "  ${world}` >= some();",
11444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                   getGoogleJSStyleWithColumns(21)); // Barely doesn't fit.
11454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = `hello\n"
11460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines            "  ${world}` >= some();",
11474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            "var x =\n"
11480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                   "    `hello\n"
11490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                   "  ${world}` >= some();",
11504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                   getGoogleJSStyleWithColumns(22)); // Barely fits.
11510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
115287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("var x =\n"
115387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    `h`;",
115487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               getGoogleJSStyleWithColumns(11));
11554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x =\n    `multi\n  line`;", "var x = `multi\n  line`;",
11564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               getGoogleJSStyleWithColumns(13));
115787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
115887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`);");
11594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Repro for an obscure width-miscounting issue with template strings.
11604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat(
11614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "someLongVariable =\n"
11624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "    "
11634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "`${logPrefix[11]}/${logPrefix[12]}/${logPrefix[13]}${logPrefix[14]}`;",
11644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "someLongVariable = "
11654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "`${logPrefix[11]}/${logPrefix[12]}/${logPrefix[13]}${logPrefix[14]}`;");
11660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1167b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // Make sure template strings get a proper ColumnWidth assigned, even if they
1168b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // are first token in line.
1169b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat(
1170b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      "var a = aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
117187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "    `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`;");
1172b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
11730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // Two template strings.
11740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  verifyFormat("var x = `hello` == `hello`;");
117558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
117658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // Comments in template strings.
11774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = `//a`;\n"
117858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar            "var y;",
11794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            "var x =\n `//a`;\n"
11804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                   "var y  ;");
11814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = `/*a`;\n"
11824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "var y;",
11834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "var x =\n `/*a`;\n"
11844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "var y;");
1185b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // Unterminated string literals in a template string.
1186b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var x = `'`;  // comment with matching quote '\n"
1187b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "var y;");
1188b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("var x = `\"`;  // comment with matching quote \"\n"
1189b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "var y;");
11904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("it(`'aaaaaaaaaaaaaaa   `, aaaaaaaaa);",
11914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "it(`'aaaaaaaaaaaaaaa   `,   aaaaaaaaa) ;",
11924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               getGoogleJSStyleWithColumns(40));
119358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // Backticks in a comment - not a template string.
11944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = 1  // `/*a`;\n"
11954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "    ;",
11964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "var x =\n 1  // `/*a`;\n"
11974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "    ;");
11984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("/* ` */ var x = 1; /* ` */", "/* ` */ var x\n= 1; /* ` */");
119958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // Comment spans multiple template strings.
12004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = `/*a`;\n"
12014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "var y = ` */ `;",
12024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "var x =\n `/*a`;\n"
12034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "var y =\n ` */ `;");
120458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // Escaped backtick.
12054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = ` \\` a`;\n"
12064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "var y;",
12074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "var x = ` \\` a`;\n"
12084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "var y;");
12090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
12100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
12114967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, CastSyntax) {
12124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = <type>foo;");
12134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = foo as type;");
12144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("let x = (a + b) as\n"
12154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "    LongTypeIsLong;",
12164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               getGoogleJSStyleWithColumns(20));
12174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("foo = <Bar[]>[\n"
12184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  1,  //\n"
12194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  2\n"
12204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "];");
12214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
12233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga NainarTEST_F(FormatTestJS, TypeArguments) {
12243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  verifyFormat("class X<Y> {}");
12253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  verifyFormat("new X<Y>();");
12263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  verifyFormat("foo<Y>(a);");
12273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  verifyFormat("var x: X<Y>[];");
12283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  verifyFormat("class C extends D<E> implements F<G>, H<I> {}");
1229b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("function f(a: List<any> = null) {}");
1230b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("function f(): List<any> {}");
123187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("function aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa():\n"
123287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}");
123387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("function aaaaaaaaaa(\n"
123487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    aaaaaaaaaaaaaaaa: aaaaaaaaaaaaaaaaaaa,\n"
123587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    aaaaaaaaaaaaaaaa: aaaaaaaaaaaaaaaaaaa):\n"
123687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa {}");
12373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar}
12383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
12394967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, UserDefinedTypeGuards) {
12404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat(
12414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "function foo(check: Object):\n"
12424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "    check is {foo: string, bar: string, baz: string, foobar: string} {\n"
12434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  return 'bar' in check;\n"
12444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "}\n");
12454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
124758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga NainarTEST_F(FormatTestJS, OptionalTypes) {
1248b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("function x(a?: b, c?, d?) {}");
124958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  verifyFormat("class X {\n"
125058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "  y?: z;\n"
125158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "  z?;\n"
125258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar               "}");
1253b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("interface X {\n"
1254b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  y?(): z;\n"
1255b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "}");
1256b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  verifyFormat("constructor({aa}: {\n"
1257b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  aa?: string,\n"
1258b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  aaaaaaaa?: string,\n"
1259b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  aaaaaaaaaaaaaaa?: boolean,\n"
1260b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "  aaaaaa?: List<string>\n"
1261b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               "}) {}");
126258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}
126358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
126458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga NainarTEST_F(FormatTestJS, IndexSignature) {
126558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  verifyFormat("var x: {[k: string]: v};");
126658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}
126758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
126887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST_F(FormatTestJS, WrapAfterParen) {
126987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("xxxxxxxxxxx(\n"
127087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    aaa, aaa);",
127187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               getGoogleJSStyleWithColumns(20));
127287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("xxxxxxxxxxx(\n"
127387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    aaa, aaa, aaa,\n"
127487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    aaa, aaa, aaa);",
127587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               getGoogleJSStyleWithColumns(20));
127687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("xxxxxxxxxxx(\n"
127787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    aaaaaaaaaaaaaaaaaaaaaaaa,\n"
127887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    function(x) {\n"
127987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "      y();  //\n"
128087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "    });",
128187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               getGoogleJSStyleWithColumns(40));
128287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  verifyFormat("while (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
128387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               "       bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
128487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
128587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
12864967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, JSDocAnnotations) {
12874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("/**\n"
12884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               " * @export {this.is.a.long.path.to.a.Type}\n"
12894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               " */",
12904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "/**\n"
12914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               " * @export {this.is.a.long.path.to.a.Type}\n"
12924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               " */",
12934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               getGoogleJSStyleWithColumns(20));
12944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12964967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, RequoteStringsSingle) {
12974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = 'foo';", "var x = \"foo\";");
12984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = 'fo\\'o\\'';", "var x = \"fo'o'\";");
12994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = 'fo\\'o\\'';", "var x = \"fo\\'o'\";");
13004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat(
13014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "var x =\n"
13024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "    'foo\\'';",
13034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // Code below is 15 chars wide, doesn't fit into the line with the
13044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // \ escape added.
13054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "var x = \"foo'\";", getGoogleJSStyleWithColumns(15));
13064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Removes no-longer needed \ escape from ".
13074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = 'fo\"o';", "var x = \"fo\\\"o\";");
13084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Code below fits into 15 chars *after* removing the \ escape.
13094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = 'fo\"o';", "var x = \"fo\\\"o\";",
13104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               getGoogleJSStyleWithColumns(15));
13114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("// clang-format off\n"
13124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "let x = \"double\";\n"
13134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "// clang-format on\n"
13144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "let x = 'single';\n",
13154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "// clang-format off\n"
13164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "let x = \"double\";\n"
13174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "// clang-format on\n"
13184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "let x = \"single\";\n");
13194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13214967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, RequoteStringsDouble) {
13224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  FormatStyle DoubleQuotes = getGoogleStyle(FormatStyle::LK_JavaScript);
13234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  DoubleQuotes.JavaScriptQuotes = FormatStyle::JSQS_Double;
13244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = \"foo\";", DoubleQuotes);
13254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = \"foo\";", "var x = 'foo';", DoubleQuotes);
13264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = \"fo'o\";", "var x = 'fo\\'o';", DoubleQuotes);
13274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13294967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, RequoteStringsLeave) {
13304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  FormatStyle LeaveQuotes = getGoogleStyle(FormatStyle::LK_JavaScript);
13314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  LeaveQuotes.JavaScriptQuotes = FormatStyle::JSQS_Leave;
13324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = \"foo\";", LeaveQuotes);
13334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("var x = 'foo';", LeaveQuotes);
13344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13364967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, SupportShebangLines) {
13374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("#!/usr/bin/env node\n"
13384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "var x = hello();",
13394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "#!/usr/bin/env node\n"
13404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "var x   =  hello();");
13414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13434967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, NonNullAssertionOperator) {
13444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("let x = foo!.bar();\n");
13454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("let x = foo ? bar! : baz;\n");
13464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("let x = !foo;\n");
13474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("let x = foo[0]!;\n");
13484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("let x = (foo)!;\n");
13494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("let x = {foo: 1}!;\n");
13504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13524967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(FormatTestJS, Conditional) {
13534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("y = x ? 1 : 2;");
13544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("x ? 1 : 2;");
13554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  verifyFormat("class Foo {\n"
13564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  field = true ? 1 : 2;\n"
13574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "  method(a = true ? 1 : 2) {}\n"
13584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               "}");
13594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1361651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} // end namespace tooling
1362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} // end namespace clang
1363