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