diff options
Diffstat (limited to 'clang/unittests/Format/FormatTestJS.cpp')
-rw-r--r-- | clang/unittests/Format/FormatTestJS.cpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/clang/unittests/Format/FormatTestJS.cpp b/clang/unittests/Format/FormatTestJS.cpp index 1df7859..bc4c7ff 100644 --- a/clang/unittests/Format/FormatTestJS.cpp +++ b/clang/unittests/Format/FormatTestJS.cpp @@ -1505,6 +1505,97 @@ TEST_F(FormatTestJS, TryCatch) { TEST_F(FormatTestJS, StringLiteralConcatenation) { verifyFormat("var literal = 'hello ' +\n" " 'world';"); + + // Long strings should be broken. + verifyFormat("var literal =\n" + " 'xxxxxxxx ' +\n" + " 'xxxxxxxx';", + "var literal = 'xxxxxxxx xxxxxxxx';", + getGoogleJSStyleWithColumns(17)); + verifyFormat("var literal =\n" + " 'xxxxxxxx ' +\n" + " 'xxxxxxxx';", + "var literal = 'xxxxxxxx xxxxxxxx';", + getGoogleJSStyleWithColumns(18)); + verifyFormat("var literal =\n" + " 'xxxxxxxx' +\n" + " ' xxxxxxxx';", + "var literal = 'xxxxxxxx xxxxxxxx';", + getGoogleJSStyleWithColumns(16)); + // The quotes should be correct. + for (char OriginalQuote : {'\'', '"'}) { + auto VerifyQuotes = [=](FormatStyle::JavaScriptQuoteStyle StyleQuote, + char TargetQuote) { + auto Style = getGoogleJSStyleWithColumns(17); + Style.JavaScriptQuotes = StyleQuote; + std::string Target{"var literal =\n" + " \"xxxxxxxx \" +\n" + " \"xxxxxxxx\";"}; + std::string Original{"var literal = \"xxxxxxxx xxxxxxxx\";"}; + std::replace(Target.begin(), Target.end(), '"', TargetQuote); + std::replace(Original.begin(), Original.end(), '"', OriginalQuote); + verifyFormat(Target, Original, Style); + }; + VerifyQuotes(FormatStyle::JSQS_Leave, OriginalQuote); + VerifyQuotes(FormatStyle::JSQS_Single, '\''); + VerifyQuotes(FormatStyle::JSQS_Double, '"'); + } + // Parentheses should be added when necessary. + verifyFormat("var literal =\n" + " ('xxxxxxxx ' +\n" + " 'xxxxxx')[0];", + "var literal = 'xxxxxxxx xxxxxx'[0];", + getGoogleJSStyleWithColumns(18)); + auto Style = getGoogleJSStyleWithColumns(20); + Style.SpacesInParens = FormatStyle::SIPO_Custom; + Style.SpacesInParensOptions.Other = true; + verifyFormat("var literal =\n" + " ( 'xxxxxxxx ' +\n" + " 'xxxxxx' )[0];", + "var literal = 'xxxxxxxx xxxxxx'[0];", Style); + // FIXME: When the part before the string literal is shorter than the + // continuation indentation, and the option AlignAfterOpenBracket is set to + // AlwaysBreak which is the default for the Google style, the unbroken string + // does not get to a new line while the broken string does due to the added + // parentheses. The formatter does not do it in one pass. + EXPECT_EQ( + "x = ('xxxxxxxx ' +\n" + " 'xxxxxx')[0];", + format("x = 'xxxxxxxx xxxxxx'[0];", getGoogleJSStyleWithColumns(18))); + verifyFormat("x =\n" + " ('xxxxxxxx ' +\n" + " 'xxxxxx')[0];", + getGoogleJSStyleWithColumns(18)); + // Breaking of template strings and regular expressions is not implemented. + verifyFormat("var literal =\n" + " `xxxxxxxx xxxxxxxx`;", + getGoogleJSStyleWithColumns(18)); + verifyFormat("var literal =\n" + " /xxxxxxxx xxxxxxxx/;", + getGoogleJSStyleWithColumns(18)); + // There can be breaks in the code inside a template string. + verifyFormat("var literal = `xxxxxx ${\n" + " xxxxxxxxxx} xxxxxx`;", + "var literal = `xxxxxx ${xxxxxxxxxx} xxxxxx`;", + getGoogleJSStyleWithColumns(14)); + verifyFormat("var literal = `xxxxxx ${\n" + " xxxxxxxxxx} xxxxxx`;", + "var literal = `xxxxxx ${xxxxxxxxxx} xxxxxx`;", + getGoogleJSStyleWithColumns(15)); + // Identifiers inside the code inside a template string should not be broken + // even if the column limit is exceeded. This following behavior is not + // optimal. The part after the closing brace which exceeds the column limit + // can be put on a new line. Change this test when it is implemented. + verifyFormat("var literal = `xxxxxx ${\n" + " xxxxxxxxxxxxxxxxxxxxxx} xxxxxx`;", + "var literal = `xxxxxx ${xxxxxxxxxxxxxxxxxxxxxx} xxxxxx`;", + getGoogleJSStyleWithColumns(14)); + verifyFormat("var literal = `xxxxxx ${\n" + " xxxxxxxxxxxxxxxxxxxxxx +\n" + " xxxxxxxxxxxxxxxxxxxxxx} xxxxxx`;", + "var literal = `xxxxxx ${xxxxxxxxxxxxxxxxxxxxxx + " + "xxxxxxxxxxxxxxxxxxxxxx} xxxxxx`;", + getGoogleJSStyleWithColumns(14)); } TEST_F(FormatTestJS, RegexLiteralClassification) { |