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