1 //===- NamespaceEndCommentsFixerTest.cpp - Formatting unit tests ----------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "clang/Format/Format.h" 11 12 #include "clang/Frontend/TextDiagnosticPrinter.h" 13 #include "llvm/Support/Debug.h" 14 #include "gtest/gtest.h" 15 16 #define DEBUG_TYPE "namespace-end-comments-fixer-test" 17 18 namespace clang { 19 namespace format { 20 namespace { 21 22 class NamespaceEndCommentsFixerTest : public ::testing::Test { 23 protected: 24 std::string 25 fixNamespaceEndComments(llvm::StringRef Code, 26 std::vector<tooling::Range> Ranges, 27 const FormatStyle &Style = getLLVMStyle()) { 28 DEBUG(llvm::errs() << "---\n"); 29 DEBUG(llvm::errs() << Code << "\n\n"); 30 tooling::Replacements Replaces = 31 clang::format::fixNamespaceEndComments(Style, Code, Ranges, "<stdin>"); 32 auto Result = applyAllReplacements(Code, Replaces); 33 EXPECT_TRUE(static_cast<bool>(Result)); 34 DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); 35 return *Result; 36 } 37 38 std::string 39 fixNamespaceEndComments(llvm::StringRef Code, 40 const FormatStyle &Style = getLLVMStyle()) { 41 return fixNamespaceEndComments( 42 Code, 43 /*Ranges=*/{1, tooling::Range(0, Code.size())}, Style); 44 } 45 }; 46 47 TEST_F(NamespaceEndCommentsFixerTest, AddsEndComment) { 48 EXPECT_EQ("namespace {\n" 49 " int i;\n" 50 "}// namespace", 51 fixNamespaceEndComments("namespace {\n" 52 " int i;\n" 53 "}")); 54 EXPECT_EQ("namespace {\n" 55 " int i;\n" 56 "}// namespace\n", 57 fixNamespaceEndComments("namespace {\n" 58 " int i;\n" 59 "}\n")); 60 EXPECT_EQ("namespace A {\n" 61 " int i;\n" 62 "}// namespace A", 63 fixNamespaceEndComments("namespace A {\n" 64 " int i;\n" 65 "}")); 66 EXPECT_EQ("inline namespace A {\n" 67 " int i;\n" 68 "}// namespace A", 69 fixNamespaceEndComments("inline namespace A {\n" 70 " int i;\n" 71 "}")); 72 EXPECT_EQ("namespace ::A {\n" 73 " int i;\n" 74 "}// namespace ::A", 75 fixNamespaceEndComments("namespace ::A {\n" 76 " int i;\n" 77 "}")); 78 EXPECT_EQ("namespace ::A::B {\n" 79 " int i;\n" 80 "}// namespace ::A::B", 81 fixNamespaceEndComments("namespace ::A::B {\n" 82 " int i;\n" 83 "}")); 84 EXPECT_EQ("namespace /**/::/**/A/**/::/**/B/**/ {\n" 85 " int i;\n" 86 "}// namespace ::A::B", 87 fixNamespaceEndComments("namespace /**/::/**/A/**/::/**/B/**/ {\n" 88 " int i;\n" 89 "}")); 90 EXPECT_EQ("namespace A {\n" 91 "namespace B {\n" 92 " int i;\n" 93 "}// namespace B\n" 94 "}// namespace A", 95 fixNamespaceEndComments("namespace A {\n" 96 "namespace B {\n" 97 " int i;\n" 98 "}\n" 99 "}")); 100 EXPECT_EQ("namespace A {\n" 101 " int a;\n" 102 "}// namespace A\n" 103 "namespace B {\n" 104 " int b;\n" 105 "}// namespace B", 106 fixNamespaceEndComments("namespace A {\n" 107 " int a;\n" 108 "}\n" 109 "namespace B {\n" 110 " int b;\n" 111 "}")); 112 EXPECT_EQ("namespace A {\n" 113 " int a1;\n" 114 "}// namespace A\n" 115 "namespace A {\n" 116 " int a2;\n" 117 "}// namespace A", 118 fixNamespaceEndComments("namespace A {\n" 119 " int a1;\n" 120 "}\n" 121 "namespace A {\n" 122 " int a2;\n" 123 "}")); 124 EXPECT_EQ("namespace A {\n" 125 " int a;\n" 126 "}// namespace A\n" 127 "// comment about b\n" 128 "int b;", 129 fixNamespaceEndComments("namespace A {\n" 130 " int a;\n" 131 "}\n" 132 "// comment about b\n" 133 "int b;")); 134 135 EXPECT_EQ("namespace A {\n" 136 "namespace B {\n" 137 "namespace C {\n" 138 "namespace D {\n" 139 "}// namespace D\n" 140 "}// namespace C\n" 141 "}// namespace B\n" 142 "}// namespace A", 143 fixNamespaceEndComments("namespace A {\n" 144 "namespace B {\n" 145 "namespace C {\n" 146 "namespace D {\n" 147 "}\n" 148 "}\n" 149 "}\n" 150 "}")); 151 } 152 153 TEST_F(NamespaceEndCommentsFixerTest, AddsNewlineIfNeeded) { 154 EXPECT_EQ("namespace A {\n" 155 " int i;\n" 156 "}// namespace A\n" 157 " int j;", 158 fixNamespaceEndComments("namespace A {\n" 159 " int i;\n" 160 "} int j;")); 161 EXPECT_EQ("namespace {\n" 162 " int i;\n" 163 "}// namespace\n" 164 " int j;", 165 fixNamespaceEndComments("namespace {\n" 166 " int i;\n" 167 "} int j;")); 168 EXPECT_EQ("namespace A {\n" 169 " int i;\n" 170 "}// namespace A\n" 171 " namespace B {\n" 172 " int j;\n" 173 "}// namespace B", 174 fixNamespaceEndComments("namespace A {\n" 175 " int i;\n" 176 "} namespace B {\n" 177 " int j;\n" 178 "}")); 179 } 180 181 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddEndCommentForShortNamespace) { 182 EXPECT_EQ("namespace {}", fixNamespaceEndComments("namespace {}")); 183 EXPECT_EQ("namespace A {}", fixNamespaceEndComments("namespace A {}")); 184 EXPECT_EQ("namespace A { int i; }", 185 fixNamespaceEndComments("namespace A { int i; }")); 186 } 187 188 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterUnaffectedRBrace) { 189 EXPECT_EQ("namespace A {\n" 190 " int i;\n" 191 "}", 192 fixNamespaceEndComments("namespace A {\n" 193 " int i;\n" 194 "}", 195 // The range (16, 3) spans the 'int' above. 196 /*Ranges=*/{1, tooling::Range(16, 3)})); 197 } 198 199 TEST_F(NamespaceEndCommentsFixerTest, DoesNotAddCommentAfterRBraceInPPDirective) { 200 EXPECT_EQ("#define SAD \\\n" 201 "namespace A { \\\n" 202 " int i; \\\n" 203 "}", 204 fixNamespaceEndComments("#define SAD \\\n" 205 "namespace A { \\\n" 206 " int i; \\\n" 207 "}")); 208 } 209 210 TEST_F(NamespaceEndCommentsFixerTest, KeepsValidEndComment) { 211 EXPECT_EQ("namespace {\n" 212 " int i;\n" 213 "} // end anonymous namespace", 214 fixNamespaceEndComments("namespace {\n" 215 " int i;\n" 216 "} // end anonymous namespace")); 217 EXPECT_EQ("namespace A {\n" 218 " int i;\n" 219 "} /* end of namespace A */", 220 fixNamespaceEndComments("namespace A {\n" 221 " int i;\n" 222 "} /* end of namespace A */")); 223 EXPECT_EQ("namespace A {\n" 224 " int i;\n" 225 "} // namespace A", 226 fixNamespaceEndComments("namespace A {\n" 227 " int i;\n" 228 "} // namespace A")); 229 EXPECT_EQ("namespace A::B {\n" 230 " int i;\n" 231 "} // end namespace A::B", 232 fixNamespaceEndComments("namespace A::B {\n" 233 " int i;\n" 234 "} // end namespace A::B")); 235 } 236 237 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndLineComment) { 238 EXPECT_EQ("namespace {\n" 239 " int i;\n" 240 "} // namespace", 241 fixNamespaceEndComments("namespace {\n" 242 " int i;\n" 243 "} // namespace A")); 244 EXPECT_EQ("namespace A {\n" 245 " int i;\n" 246 "} // namespace A", 247 fixNamespaceEndComments("namespace A {\n" 248 " int i;\n" 249 "} // namespace")); 250 EXPECT_EQ("namespace A {\n" 251 " int i;\n" 252 "} // namespace A", 253 fixNamespaceEndComments("namespace A {\n" 254 " int i;\n" 255 "} //")); 256 EXPECT_EQ("namespace A {\n" 257 " int i;\n" 258 "} // namespace A", 259 fixNamespaceEndComments("namespace A {\n" 260 " int i;\n" 261 "} //")); 262 EXPECT_EQ("namespace A {\n" 263 " int i;\n" 264 "} // namespace A", 265 fixNamespaceEndComments("namespace A {\n" 266 " int i;\n" 267 "} // banamespace A")); 268 269 // Updates invalid line comments even for short namespaces. 270 EXPECT_EQ("namespace A {} // namespace A", 271 fixNamespaceEndComments("namespace A {} // namespace")); 272 } 273 274 TEST_F(NamespaceEndCommentsFixerTest, UpdatesInvalidEndBlockComment) { 275 EXPECT_EQ("namespace {\n" 276 " int i;\n" 277 "} // namespace", 278 fixNamespaceEndComments("namespace {\n" 279 " int i;\n" 280 "} /* namespace A */")); 281 EXPECT_EQ("namespace A {\n" 282 " int i;\n" 283 "} // namespace A", 284 fixNamespaceEndComments("namespace A {\n" 285 " int i;\n" 286 "} /* end namespace */")); 287 EXPECT_EQ("namespace A {\n" 288 " int i;\n" 289 "} // namespace A", 290 fixNamespaceEndComments("namespace A {\n" 291 " int i;\n" 292 "} /**/")); 293 EXPECT_EQ("namespace A {\n" 294 " int i;\n" 295 "} // namespace A", 296 fixNamespaceEndComments("namespace A {\n" 297 " int i;\n" 298 "} /* end unnamed namespace */")); 299 EXPECT_EQ("namespace A {\n" 300 " int i;\n" 301 "} // namespace A", 302 fixNamespaceEndComments("namespace A {\n" 303 " int i;\n" 304 "} /* banamespace A */")); 305 EXPECT_EQ("namespace A {} // namespace A", 306 fixNamespaceEndComments("namespace A {} /**/")); 307 } 308 309 TEST_F(NamespaceEndCommentsFixerTest, 310 DoesNotAddEndCommentForNamespacesControlledByMacros) { 311 EXPECT_EQ("#ifdef 1\n" 312 "namespace A {\n" 313 "#elseif\n" 314 "namespace B {\n" 315 "#endif\n" 316 " int i;\n" 317 "}\n" 318 "}\n", 319 fixNamespaceEndComments("#ifdef 1\n" 320 "namespace A {\n" 321 "#elseif\n" 322 "namespace B {\n" 323 "#endif\n" 324 " int i;\n" 325 "}\n" 326 "}\n")); 327 } 328 329 TEST_F(NamespaceEndCommentsFixerTest, 330 DoesNotAddEndCommentForNamespacesInMacroDeclarations) { 331 EXPECT_EQ("#ifdef 1\n" 332 "namespace A {\n" 333 "#elseif\n" 334 "namespace B {\n" 335 "#endif\n" 336 " int i;\n" 337 "}\n" 338 "}\n", 339 fixNamespaceEndComments("#ifdef 1\n" 340 "namespace A {\n" 341 "#elseif\n" 342 "namespace B {\n" 343 "#endif\n" 344 " int i;\n" 345 "}\n" 346 "}\n")); 347 } 348 } // end namespace 349 } // end namespace format 350 } // end namespace clang 351