1671bac74SJulie Hockett //===-- clang-doc/HTMLGeneratorTest.cpp -----------------------------------===// 2671bac74SJulie Hockett // 3671bac74SJulie Hockett // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4671bac74SJulie Hockett // See https://llvm.org/LICENSE.txt for license information. 5671bac74SJulie Hockett // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6671bac74SJulie Hockett // 7671bac74SJulie Hockett //===----------------------------------------------------------------------===// 8671bac74SJulie Hockett 9671bac74SJulie Hockett #include "ClangDocTest.h" 10671bac74SJulie Hockett #include "Generators.h" 11671bac74SJulie Hockett #include "Representation.h" 12d47be4daSDiego Astiazaran #include "Serialize.h" 133550da79SDiego Astiazaran #include "clang/Basic/Version.h" 14671bac74SJulie Hockett #include "gtest/gtest.h" 15671bac74SJulie Hockett 16671bac74SJulie Hockett namespace clang { 17671bac74SJulie Hockett namespace doc { 18671bac74SJulie Hockett 193550da79SDiego Astiazaran static const std::string ClangDocVersion = 203550da79SDiego Astiazaran clang::getClangToolFullVersion("clang-doc"); 213550da79SDiego Astiazaran 22671bac74SJulie Hockett std::unique_ptr<Generator> getHTMLGenerator() { 23671bac74SJulie Hockett auto G = doc::findGeneratorByName("html"); 24671bac74SJulie Hockett if (!G) 25671bac74SJulie Hockett return nullptr; 26671bac74SJulie Hockett return std::move(G.get()); 27671bac74SJulie Hockett } 28671bac74SJulie Hockett 29acd35f6cSDiego Astiazaran ClangDocContext 30665e9676SDiego Astiazaran getClangDocContext(std::vector<std::string> UserStylesheets = {}, 31665e9676SDiego Astiazaran StringRef RepositoryUrl = "") { 323550da79SDiego Astiazaran ClangDocContext CDCtx{ 33f14ad744SPeterChou1 {}, "test-project", {}, {}, {}, RepositoryUrl, UserStylesheets}; 34acd35f6cSDiego Astiazaran CDCtx.UserStylesheets.insert( 35acd35f6cSDiego Astiazaran CDCtx.UserStylesheets.begin(), 36acd35f6cSDiego Astiazaran "../share/clang/clang-doc-default-stylesheet.css"); 377dfe0bc3SDiego Astiazaran CDCtx.JsScripts.emplace_back("index.js"); 38acd35f6cSDiego Astiazaran return CDCtx; 39acd35f6cSDiego Astiazaran } 40acd35f6cSDiego Astiazaran 41671bac74SJulie Hockett TEST(HTMLGeneratorTest, emitNamespaceHTML) { 42671bac74SJulie Hockett NamespaceInfo I; 43671bac74SJulie Hockett I.Name = "Namespace"; 44671bac74SJulie Hockett I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace); 45671bac74SJulie Hockett 4621fb70c6SBrett Wilson I.Children.Namespaces.emplace_back(EmptySID, "ChildNamespace", 474a68babdSBrett Wilson InfoType::IT_namespace, 484a68babdSBrett Wilson "Namespace::ChildNamespace", "Namespace"); 4921fb70c6SBrett Wilson I.Children.Records.emplace_back(EmptySID, "ChildStruct", InfoType::IT_record, 504a68babdSBrett Wilson "Namespace::ChildStruct", "Namespace"); 5121fb70c6SBrett Wilson I.Children.Functions.emplace_back(); 5221fb70c6SBrett Wilson I.Children.Functions.back().Access = AccessSpecifier::AS_none; 5321fb70c6SBrett Wilson I.Children.Functions.back().Name = "OneFunction"; 5421fb70c6SBrett Wilson I.Children.Enums.emplace_back(); 5521fb70c6SBrett Wilson I.Children.Enums.back().Name = "OneEnum"; 56671bac74SJulie Hockett 57671bac74SJulie Hockett auto G = getHTMLGenerator(); 58671bac74SJulie Hockett assert(G); 59671bac74SJulie Hockett std::string Buffer; 60671bac74SJulie Hockett llvm::raw_string_ostream Actual(Buffer); 61acd35f6cSDiego Astiazaran ClangDocContext CDCtx = getClangDocContext({"user-provided-stylesheet.css"}); 62acd35f6cSDiego Astiazaran auto Err = G->generateDocForInfo(&I, Actual, CDCtx); 63671bac74SJulie Hockett assert(!Err); 64671bac74SJulie Hockett std::string Expected = R"raw(<!DOCTYPE html> 65671bac74SJulie Hockett <meta charset="utf-8"/> 66671bac74SJulie Hockett <title>namespace Namespace</title> 677003f64cSPetr Hosek <link rel="stylesheet" href="../clang-doc-default-stylesheet.css"/> 687003f64cSPetr Hosek <link rel="stylesheet" href="../user-provided-stylesheet.css"/> 69f14ad744SPeterChou1 <script src="../index_json.js"></script> 707003f64cSPetr Hosek <script src="../index.js"></script> 713550da79SDiego Astiazaran <header id="project-title">test-project</header> 723550da79SDiego Astiazaran <main> 737003f64cSPetr Hosek <div id="sidebar-left" path="Namespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div> 743550da79SDiego Astiazaran <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content"> 753550da79SDiego Astiazaran <h1>namespace Namespace</h1> 763550da79SDiego Astiazaran <h2 id="Namespaces">Namespaces</h2> 77d47be4daSDiego Astiazaran <ul> 78d47be4daSDiego Astiazaran <li> 797003f64cSPetr Hosek <a href="ChildNamespace/index.html">ChildNamespace</a> 803550da79SDiego Astiazaran </li> 813550da79SDiego Astiazaran </ul> 823550da79SDiego Astiazaran <h2 id="Records">Records</h2> 833550da79SDiego Astiazaran <ul> 843550da79SDiego Astiazaran <li> 857003f64cSPetr Hosek <a href="ChildStruct.html">ChildStruct</a> 863550da79SDiego Astiazaran </li> 873550da79SDiego Astiazaran </ul> 883550da79SDiego Astiazaran <h2 id="Functions">Functions</h2> 893550da79SDiego Astiazaran <div> 903550da79SDiego Astiazaran <h3 id="0000000000000000000000000000000000000000">OneFunction</h3> 913550da79SDiego Astiazaran <p>OneFunction()</p> 923550da79SDiego Astiazaran </div> 933550da79SDiego Astiazaran <h2 id="Enums">Enums</h2> 943550da79SDiego Astiazaran <div> 95*5ef2456aSPeterChou1 <table id="0000000000000000000000000000000000000000"> 96*5ef2456aSPeterChou1 <thead> 97*5ef2456aSPeterChou1 <tr> 98*5ef2456aSPeterChou1 <th colspan="2">enum OneEnum</th> 99*5ef2456aSPeterChou1 </tr> 100*5ef2456aSPeterChou1 </thead> 101*5ef2456aSPeterChou1 </table> 1023550da79SDiego Astiazaran </div> 1033550da79SDiego Astiazaran </div> 1043550da79SDiego Astiazaran <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right"> 1053550da79SDiego Astiazaran <ol> 1063550da79SDiego Astiazaran <li> 107d47be4daSDiego Astiazaran <span> 108d47be4daSDiego Astiazaran <a href="#Namespaces">Namespaces</a> 109d47be4daSDiego Astiazaran </span> 110d47be4daSDiego Astiazaran </li> 111d47be4daSDiego Astiazaran <li> 112d47be4daSDiego Astiazaran <span> 113d47be4daSDiego Astiazaran <a href="#Records">Records</a> 114d47be4daSDiego Astiazaran </span> 115d47be4daSDiego Astiazaran </li> 116d47be4daSDiego Astiazaran <li> 117d47be4daSDiego Astiazaran <span> 118d47be4daSDiego Astiazaran <a href="#Functions">Functions</a> 119d47be4daSDiego Astiazaran </span> 120d47be4daSDiego Astiazaran <ul> 121d47be4daSDiego Astiazaran <li> 122d47be4daSDiego Astiazaran <span> 123d47be4daSDiego Astiazaran <a href="#0000000000000000000000000000000000000000">OneFunction</a> 124d47be4daSDiego Astiazaran </span> 125d47be4daSDiego Astiazaran </li> 126d47be4daSDiego Astiazaran </ul> 127d47be4daSDiego Astiazaran </li> 128d47be4daSDiego Astiazaran <li> 129d47be4daSDiego Astiazaran <span> 130d47be4daSDiego Astiazaran <a href="#Enums">Enums</a> 131d47be4daSDiego Astiazaran </span> 132d47be4daSDiego Astiazaran <ul> 133d47be4daSDiego Astiazaran <li> 134d47be4daSDiego Astiazaran <span> 135d47be4daSDiego Astiazaran <a href="#0000000000000000000000000000000000000000">OneEnum</a> 136d47be4daSDiego Astiazaran </span> 137d47be4daSDiego Astiazaran </li> 138d47be4daSDiego Astiazaran </ul> 139d47be4daSDiego Astiazaran </li> 1403550da79SDiego Astiazaran </ol> 141671bac74SJulie Hockett </div> 1423550da79SDiego Astiazaran </main> 1433550da79SDiego Astiazaran <footer> 1443550da79SDiego Astiazaran <span class="no-break">)raw" + 1453550da79SDiego Astiazaran ClangDocVersion + R"raw(</span> 1463550da79SDiego Astiazaran </footer> 147671bac74SJulie Hockett )raw"; 148671bac74SJulie Hockett 149671bac74SJulie Hockett EXPECT_EQ(Expected, Actual.str()); 150671bac74SJulie Hockett } 151671bac74SJulie Hockett 152671bac74SJulie Hockett TEST(HTMLGeneratorTest, emitRecordHTML) { 153671bac74SJulie Hockett RecordInfo I; 154671bac74SJulie Hockett I.Name = "r"; 1552c1c9a24SJulie Hockett I.Path = "X/Y/Z"; 156671bac74SJulie Hockett I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace); 157671bac74SJulie Hockett 158665e9676SDiego Astiazaran I.DefLoc = Location(10, llvm::SmallString<16>{"dir/test.cpp"}, true); 159671bac74SJulie Hockett I.Loc.emplace_back(12, llvm::SmallString<16>{"test.cpp"}); 160671bac74SJulie Hockett 161b131ad0bSJulie Hockett SmallString<16> PathTo; 162b131ad0bSJulie Hockett llvm::sys::path::native("path/to", PathTo); 1634a68babdSBrett Wilson I.Members.emplace_back(TypeInfo("int"), "X", AccessSpecifier::AS_private); 164edd690b0SVlad Serebrennikov I.TagType = TagTypeKind::Class; 1654a68babdSBrett Wilson I.Parents.emplace_back(EmptySID, "F", InfoType::IT_record, "F", PathTo); 166671bac74SJulie Hockett I.VirtualParents.emplace_back(EmptySID, "G", InfoType::IT_record); 167671bac74SJulie Hockett 16821fb70c6SBrett Wilson I.Children.Records.emplace_back(EmptySID, "ChildStruct", InfoType::IT_record, 1694a68babdSBrett Wilson "X::Y::Z::r::ChildStruct", "X/Y/Z/r"); 17021fb70c6SBrett Wilson I.Children.Functions.emplace_back(); 17121fb70c6SBrett Wilson I.Children.Functions.back().Name = "OneFunction"; 17221fb70c6SBrett Wilson I.Children.Enums.emplace_back(); 17321fb70c6SBrett Wilson I.Children.Enums.back().Name = "OneEnum"; 174671bac74SJulie Hockett 175671bac74SJulie Hockett auto G = getHTMLGenerator(); 176671bac74SJulie Hockett assert(G); 177671bac74SJulie Hockett std::string Buffer; 178671bac74SJulie Hockett llvm::raw_string_ostream Actual(Buffer); 179665e9676SDiego Astiazaran ClangDocContext CDCtx = getClangDocContext({}, "http://www.repository.com"); 180acd35f6cSDiego Astiazaran auto Err = G->generateDocForInfo(&I, Actual, CDCtx); 181671bac74SJulie Hockett assert(!Err); 182671bac74SJulie Hockett std::string Expected = R"raw(<!DOCTYPE html> 183671bac74SJulie Hockett <meta charset="utf-8"/> 184671bac74SJulie Hockett <title>class r</title> 185d6cdd98aSDiego Astiazaran <link rel="stylesheet" href="../../../clang-doc-default-stylesheet.css"/> 186f14ad744SPeterChou1 <script src="../../../index_json.js"></script> 1877dfe0bc3SDiego Astiazaran <script src="../../../index.js"></script> 1883550da79SDiego Astiazaran <header id="project-title">test-project</header> 1893550da79SDiego Astiazaran <main> 1903550da79SDiego Astiazaran <div id="sidebar-left" path="X/Y/Z" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div> 1913550da79SDiego Astiazaran <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content"> 192671bac74SJulie Hockett <h1>class r</h1> 193665e9676SDiego Astiazaran <p> 194665e9676SDiego Astiazaran Defined at line 195665e9676SDiego Astiazaran <a href="http://www.repository.com/dir/test.cpp#10">10</a> 196665e9676SDiego Astiazaran of file 197665e9676SDiego Astiazaran <a href="http://www.repository.com/dir/test.cpp">test.cpp</a> 198665e9676SDiego Astiazaran </p> 199671bac74SJulie Hockett <p> 2002c1c9a24SJulie Hockett Inherits from 201d6cdd98aSDiego Astiazaran <a href="../../../path/to/F.html">F</a> 2022c1c9a24SJulie Hockett , G 203671bac74SJulie Hockett </p> 204d47be4daSDiego Astiazaran <h2 id="Members">Members</h2> 205671bac74SJulie Hockett <ul> 206b4bc7b18SPeterChou1 <li> 207b4bc7b18SPeterChou1 <div>private int X</div> 208b4bc7b18SPeterChou1 </li> 209671bac74SJulie Hockett </ul> 210d47be4daSDiego Astiazaran <h2 id="Records">Records</h2> 211671bac74SJulie Hockett <ul> 212e27f778aSDiego Astiazaran <li> 2137003f64cSPetr Hosek <a href="../../../X/Y/Z/r/ChildStruct.html">ChildStruct</a> 214e27f778aSDiego Astiazaran </li> 215671bac74SJulie Hockett </ul> 216d47be4daSDiego Astiazaran <h2 id="Functions">Functions</h2> 217671bac74SJulie Hockett <div> 218d47be4daSDiego Astiazaran <h3 id="0000000000000000000000000000000000000000">OneFunction</h3> 2196a29ae4bSDiego Astiazaran <p>public OneFunction()</p> 220671bac74SJulie Hockett </div> 221d47be4daSDiego Astiazaran <h2 id="Enums">Enums</h2> 222671bac74SJulie Hockett <div> 223*5ef2456aSPeterChou1 <table id="0000000000000000000000000000000000000000"> 224*5ef2456aSPeterChou1 <thead> 225*5ef2456aSPeterChou1 <tr> 226*5ef2456aSPeterChou1 <th colspan="2">enum OneEnum</th> 227*5ef2456aSPeterChou1 </tr> 228*5ef2456aSPeterChou1 </thead> 229*5ef2456aSPeterChou1 </table> 230671bac74SJulie Hockett </div> 231671bac74SJulie Hockett </div> 2323550da79SDiego Astiazaran <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right"> 2333550da79SDiego Astiazaran <ol> 2343550da79SDiego Astiazaran <li> 2353550da79SDiego Astiazaran <span> 2363550da79SDiego Astiazaran <a href="#Members">Members</a> 2373550da79SDiego Astiazaran </span> 2383550da79SDiego Astiazaran </li> 2393550da79SDiego Astiazaran <li> 2403550da79SDiego Astiazaran <span> 2413550da79SDiego Astiazaran <a href="#Records">Records</a> 2423550da79SDiego Astiazaran </span> 2433550da79SDiego Astiazaran </li> 2443550da79SDiego Astiazaran <li> 2453550da79SDiego Astiazaran <span> 2463550da79SDiego Astiazaran <a href="#Functions">Functions</a> 2473550da79SDiego Astiazaran </span> 2483550da79SDiego Astiazaran <ul> 2493550da79SDiego Astiazaran <li> 2503550da79SDiego Astiazaran <span> 2513550da79SDiego Astiazaran <a href="#0000000000000000000000000000000000000000">OneFunction</a> 2523550da79SDiego Astiazaran </span> 2533550da79SDiego Astiazaran </li> 2543550da79SDiego Astiazaran </ul> 2553550da79SDiego Astiazaran </li> 2563550da79SDiego Astiazaran <li> 2573550da79SDiego Astiazaran <span> 2583550da79SDiego Astiazaran <a href="#Enums">Enums</a> 2593550da79SDiego Astiazaran </span> 2603550da79SDiego Astiazaran <ul> 2613550da79SDiego Astiazaran <li> 2623550da79SDiego Astiazaran <span> 2633550da79SDiego Astiazaran <a href="#0000000000000000000000000000000000000000">OneEnum</a> 2643550da79SDiego Astiazaran </span> 2653550da79SDiego Astiazaran </li> 2663550da79SDiego Astiazaran </ul> 2673550da79SDiego Astiazaran </li> 2683550da79SDiego Astiazaran </ol> 2693550da79SDiego Astiazaran </div> 2703550da79SDiego Astiazaran </main> 2713550da79SDiego Astiazaran <footer> 2723550da79SDiego Astiazaran <span class="no-break">)raw" + 2733550da79SDiego Astiazaran ClangDocVersion + R"raw(</span> 2743550da79SDiego Astiazaran </footer> 275671bac74SJulie Hockett )raw"; 276671bac74SJulie Hockett 277671bac74SJulie Hockett EXPECT_EQ(Expected, Actual.str()); 278671bac74SJulie Hockett } 279671bac74SJulie Hockett 280671bac74SJulie Hockett TEST(HTMLGeneratorTest, emitFunctionHTML) { 281671bac74SJulie Hockett FunctionInfo I; 282671bac74SJulie Hockett I.Name = "f"; 283671bac74SJulie Hockett I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace); 284671bac74SJulie Hockett 285665e9676SDiego Astiazaran I.DefLoc = Location(10, llvm::SmallString<16>{"dir/test.cpp"}, false); 286671bac74SJulie Hockett I.Loc.emplace_back(12, llvm::SmallString<16>{"test.cpp"}); 287671bac74SJulie Hockett 2886a29ae4bSDiego Astiazaran I.Access = AccessSpecifier::AS_none; 2896a29ae4bSDiego Astiazaran 290b131ad0bSJulie Hockett SmallString<16> PathTo; 291b131ad0bSJulie Hockett llvm::sys::path::native("path/to", PathTo); 2924a68babdSBrett Wilson I.ReturnType = TypeInfo( 2934a68babdSBrett Wilson Reference(EmptySID, "float", InfoType::IT_default, "float", PathTo)); 2940afc6085SBrett Wilson I.Params.emplace_back(TypeInfo("int", PathTo), "P"); 295671bac74SJulie Hockett I.IsMethod = true; 296671bac74SJulie Hockett I.Parent = Reference(EmptySID, "Parent", InfoType::IT_record); 297671bac74SJulie Hockett 298671bac74SJulie Hockett auto G = getHTMLGenerator(); 299671bac74SJulie Hockett assert(G); 300671bac74SJulie Hockett std::string Buffer; 301671bac74SJulie Hockett llvm::raw_string_ostream Actual(Buffer); 302665e9676SDiego Astiazaran ClangDocContext CDCtx = getClangDocContext({}, "https://www.repository.com"); 303acd35f6cSDiego Astiazaran auto Err = G->generateDocForInfo(&I, Actual, CDCtx); 304671bac74SJulie Hockett assert(!Err); 305671bac74SJulie Hockett std::string Expected = R"raw(<!DOCTYPE html> 306671bac74SJulie Hockett <meta charset="utf-8"/> 307671bac74SJulie Hockett <title></title> 308db5d8e3dSDiego Astiazaran <link rel="stylesheet" href="clang-doc-default-stylesheet.css"/> 309f14ad744SPeterChou1 <script src="index_json.js"></script> 3107dfe0bc3SDiego Astiazaran <script src="index.js"></script> 3113550da79SDiego Astiazaran <header id="project-title">test-project</header> 3123550da79SDiego Astiazaran <main> 3133550da79SDiego Astiazaran <div id="sidebar-left" path="" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div> 3143550da79SDiego Astiazaran <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content"> 315d47be4daSDiego Astiazaran <h3 id="0000000000000000000000000000000000000000">f</h3> 316671bac74SJulie Hockett <p> 317dd7ee81eSDiego Astiazaran <a href="path/to/float.html">float</a> 3182c1c9a24SJulie Hockett f( 319dd7ee81eSDiego Astiazaran <a href="path/to/int.html">int</a> 3202c1c9a24SJulie Hockett P) 321671bac74SJulie Hockett </p> 322665e9676SDiego Astiazaran <p>Defined at line 10 of file dir/test.cpp</p> 323671bac74SJulie Hockett </div> 3243550da79SDiego Astiazaran <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right"></div> 3253550da79SDiego Astiazaran </main> 3263550da79SDiego Astiazaran <footer> 3273550da79SDiego Astiazaran <span class="no-break">)raw" + 3283550da79SDiego Astiazaran ClangDocVersion + R"raw(</span> 3293550da79SDiego Astiazaran </footer> 330671bac74SJulie Hockett )raw"; 331671bac74SJulie Hockett 332671bac74SJulie Hockett EXPECT_EQ(Expected, Actual.str()); 333671bac74SJulie Hockett } 334671bac74SJulie Hockett 335671bac74SJulie Hockett TEST(HTMLGeneratorTest, emitEnumHTML) { 336671bac74SJulie Hockett EnumInfo I; 337671bac74SJulie Hockett I.Name = "e"; 338671bac74SJulie Hockett I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace); 339671bac74SJulie Hockett 340665e9676SDiego Astiazaran I.DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"}, true); 341671bac74SJulie Hockett I.Loc.emplace_back(12, llvm::SmallString<16>{"test.cpp"}); 342671bac74SJulie Hockett 343671bac74SJulie Hockett I.Members.emplace_back("X"); 344671bac74SJulie Hockett I.Scoped = true; 345671bac74SJulie Hockett 346671bac74SJulie Hockett auto G = getHTMLGenerator(); 347671bac74SJulie Hockett assert(G); 348671bac74SJulie Hockett std::string Buffer; 349671bac74SJulie Hockett llvm::raw_string_ostream Actual(Buffer); 350665e9676SDiego Astiazaran ClangDocContext CDCtx = getClangDocContext({}, "www.repository.com"); 351acd35f6cSDiego Astiazaran auto Err = G->generateDocForInfo(&I, Actual, CDCtx); 352671bac74SJulie Hockett assert(!Err); 353671bac74SJulie Hockett std::string Expected = R"raw(<!DOCTYPE html> 354671bac74SJulie Hockett <meta charset="utf-8"/> 355671bac74SJulie Hockett <title></title> 356db5d8e3dSDiego Astiazaran <link rel="stylesheet" href="clang-doc-default-stylesheet.css"/> 357f14ad744SPeterChou1 <script src="index_json.js"></script> 3587dfe0bc3SDiego Astiazaran <script src="index.js"></script> 3593550da79SDiego Astiazaran <header id="project-title">test-project</header> 3603550da79SDiego Astiazaran <main> 3613550da79SDiego Astiazaran <div id="sidebar-left" path="" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div> 3623550da79SDiego Astiazaran <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content"> 363*5ef2456aSPeterChou1 <table id="0000000000000000000000000000000000000000"> 364*5ef2456aSPeterChou1 <thead> 365*5ef2456aSPeterChou1 <tr> 366*5ef2456aSPeterChou1 <th colspan="2">enum class e</th> 367*5ef2456aSPeterChou1 </tr> 368*5ef2456aSPeterChou1 </thead> 369*5ef2456aSPeterChou1 <tbody> 370*5ef2456aSPeterChou1 <tr> 371*5ef2456aSPeterChou1 <td>X</td> 372*5ef2456aSPeterChou1 <td>0</td> 373*5ef2456aSPeterChou1 </tr> 374*5ef2456aSPeterChou1 </tbody> 375*5ef2456aSPeterChou1 </table> 376665e9676SDiego Astiazaran <p> 377665e9676SDiego Astiazaran Defined at line 378665e9676SDiego Astiazaran <a href="https://www.repository.com/test.cpp#10">10</a> 379665e9676SDiego Astiazaran of file 380665e9676SDiego Astiazaran <a href="https://www.repository.com/test.cpp">test.cpp</a> 381665e9676SDiego Astiazaran </p> 382671bac74SJulie Hockett </div> 3833550da79SDiego Astiazaran <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right"></div> 3843550da79SDiego Astiazaran </main> 3853550da79SDiego Astiazaran <footer> 3863550da79SDiego Astiazaran <span class="no-break">)raw" + 3873550da79SDiego Astiazaran ClangDocVersion + R"raw(</span> 3883550da79SDiego Astiazaran </footer> 389671bac74SJulie Hockett )raw"; 390671bac74SJulie Hockett 391671bac74SJulie Hockett EXPECT_EQ(Expected, Actual.str()); 392671bac74SJulie Hockett } 393671bac74SJulie Hockett 394671bac74SJulie Hockett TEST(HTMLGeneratorTest, emitCommentHTML) { 395671bac74SJulie Hockett FunctionInfo I; 396671bac74SJulie Hockett I.Name = "f"; 397671bac74SJulie Hockett I.DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"}); 3980afc6085SBrett Wilson I.ReturnType = TypeInfo("void"); 3990afc6085SBrett Wilson I.Params.emplace_back(TypeInfo("int"), "I"); 4000afc6085SBrett Wilson I.Params.emplace_back(TypeInfo("int"), "J"); 4016a29ae4bSDiego Astiazaran I.Access = AccessSpecifier::AS_none; 402671bac74SJulie Hockett 403671bac74SJulie Hockett CommentInfo Top; 404671bac74SJulie Hockett Top.Kind = "FullComment"; 405671bac74SJulie Hockett 4061c705d9cSJonas Devlieghere Top.Children.emplace_back(std::make_unique<CommentInfo>()); 407671bac74SJulie Hockett CommentInfo *BlankLine = Top.Children.back().get(); 408671bac74SJulie Hockett BlankLine->Kind = "ParagraphComment"; 4091c705d9cSJonas Devlieghere BlankLine->Children.emplace_back(std::make_unique<CommentInfo>()); 410671bac74SJulie Hockett BlankLine->Children.back()->Kind = "TextComment"; 411671bac74SJulie Hockett 4121c705d9cSJonas Devlieghere Top.Children.emplace_back(std::make_unique<CommentInfo>()); 413671bac74SJulie Hockett CommentInfo *Brief = Top.Children.back().get(); 414671bac74SJulie Hockett Brief->Kind = "ParagraphComment"; 4151c705d9cSJonas Devlieghere Brief->Children.emplace_back(std::make_unique<CommentInfo>()); 416671bac74SJulie Hockett Brief->Children.back()->Kind = "TextComment"; 417671bac74SJulie Hockett Brief->Children.back()->Name = "ParagraphComment"; 418671bac74SJulie Hockett Brief->Children.back()->Text = " Brief description."; 419671bac74SJulie Hockett 4201c705d9cSJonas Devlieghere Top.Children.emplace_back(std::make_unique<CommentInfo>()); 421671bac74SJulie Hockett CommentInfo *Extended = Top.Children.back().get(); 422671bac74SJulie Hockett Extended->Kind = "ParagraphComment"; 4231c705d9cSJonas Devlieghere Extended->Children.emplace_back(std::make_unique<CommentInfo>()); 424671bac74SJulie Hockett Extended->Children.back()->Kind = "TextComment"; 425671bac74SJulie Hockett Extended->Children.back()->Text = " Extended description that"; 4261c705d9cSJonas Devlieghere Extended->Children.emplace_back(std::make_unique<CommentInfo>()); 427671bac74SJulie Hockett Extended->Children.back()->Kind = "TextComment"; 428671bac74SJulie Hockett Extended->Children.back()->Text = " continues onto the next line."; 429671bac74SJulie Hockett 4301c705d9cSJonas Devlieghere Top.Children.emplace_back(std::make_unique<CommentInfo>()); 431597b3fd3SDiego Astiazaran CommentInfo *Entities = Top.Children.back().get(); 432597b3fd3SDiego Astiazaran Entities->Kind = "ParagraphComment"; 4331c705d9cSJonas Devlieghere Entities->Children.emplace_back(std::make_unique<CommentInfo>()); 434597b3fd3SDiego Astiazaran Entities->Children.back()->Kind = "TextComment"; 435597b3fd3SDiego Astiazaran Entities->Children.back()->Name = "ParagraphComment"; 436597b3fd3SDiego Astiazaran Entities->Children.back()->Text = 437597b3fd3SDiego Astiazaran " Comment with html entities: &, <, >, \", \'."; 438597b3fd3SDiego Astiazaran 439671bac74SJulie Hockett I.Description.emplace_back(std::move(Top)); 440671bac74SJulie Hockett 441671bac74SJulie Hockett auto G = getHTMLGenerator(); 442671bac74SJulie Hockett assert(G); 443671bac74SJulie Hockett std::string Buffer; 444671bac74SJulie Hockett llvm::raw_string_ostream Actual(Buffer); 445acd35f6cSDiego Astiazaran ClangDocContext CDCtx = getClangDocContext(); 446acd35f6cSDiego Astiazaran auto Err = G->generateDocForInfo(&I, Actual, CDCtx); 447671bac74SJulie Hockett assert(!Err); 448671bac74SJulie Hockett std::string Expected = R"raw(<!DOCTYPE html> 449671bac74SJulie Hockett <meta charset="utf-8"/> 450671bac74SJulie Hockett <title></title> 451db5d8e3dSDiego Astiazaran <link rel="stylesheet" href="clang-doc-default-stylesheet.css"/> 452f14ad744SPeterChou1 <script src="index_json.js"></script> 4537dfe0bc3SDiego Astiazaran <script src="index.js"></script> 4543550da79SDiego Astiazaran <header id="project-title">test-project</header> 4553550da79SDiego Astiazaran <main> 4563550da79SDiego Astiazaran <div id="sidebar-left" path="" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div> 4573550da79SDiego Astiazaran <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content"> 458d47be4daSDiego Astiazaran <h3 id="0000000000000000000000000000000000000000">f</h3> 45964ca8570SDiego Astiazaran <p>void f(int I, int J)</p> 460665e9676SDiego Astiazaran <p>Defined at line 10 of file test.cpp</p> 461671bac74SJulie Hockett <div> 462671bac74SJulie Hockett <div> 46364ca8570SDiego Astiazaran <p> Brief description.</p> 46464ca8570SDiego Astiazaran <p> Extended description that continues onto the next line.</p> 46564ca8570SDiego Astiazaran <p> Comment with html entities: &, <, >, ", '.</p> 466671bac74SJulie Hockett </div> 467671bac74SJulie Hockett </div> 468671bac74SJulie Hockett </div> 4693550da79SDiego Astiazaran <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right"></div> 4703550da79SDiego Astiazaran </main> 4713550da79SDiego Astiazaran <footer> 4723550da79SDiego Astiazaran <span class="no-break">)raw" + 4733550da79SDiego Astiazaran ClangDocVersion + R"raw(</span> 4743550da79SDiego Astiazaran </footer> 475671bac74SJulie Hockett )raw"; 476671bac74SJulie Hockett 477671bac74SJulie Hockett EXPECT_EQ(Expected, Actual.str()); 478671bac74SJulie Hockett } 479671bac74SJulie Hockett 480671bac74SJulie Hockett } // namespace doc 481671bac74SJulie Hockett } // namespace clang 482