1f4a2713aSLionel Sambuc //===- unittests/AST/CommentParser.cpp ------ Comment parser tests --------===//
2f4a2713aSLionel Sambuc //
3f4a2713aSLionel Sambuc // The LLVM Compiler Infrastructure
4f4a2713aSLionel Sambuc //
5f4a2713aSLionel Sambuc // This file is distributed under the University of Illinois Open Source
6f4a2713aSLionel Sambuc // License. See LICENSE.TXT for details.
7f4a2713aSLionel Sambuc //
8f4a2713aSLionel Sambuc //===----------------------------------------------------------------------===//
9f4a2713aSLionel Sambuc
10f4a2713aSLionel Sambuc #include "clang/AST/CommentParser.h"
11f4a2713aSLionel Sambuc #include "clang/AST/Comment.h"
12f4a2713aSLionel Sambuc #include "clang/AST/CommentCommandTraits.h"
13f4a2713aSLionel Sambuc #include "clang/AST/CommentLexer.h"
14f4a2713aSLionel Sambuc #include "clang/AST/CommentSema.h"
15f4a2713aSLionel Sambuc #include "clang/Basic/CommentOptions.h"
16f4a2713aSLionel Sambuc #include "clang/Basic/Diagnostic.h"
17f4a2713aSLionel Sambuc #include "clang/Basic/DiagnosticOptions.h"
18f4a2713aSLionel Sambuc #include "clang/Basic/FileManager.h"
19f4a2713aSLionel Sambuc #include "clang/Basic/SourceManager.h"
20f4a2713aSLionel Sambuc #include "llvm/ADT/STLExtras.h"
21f4a2713aSLionel Sambuc #include "llvm/Support/Allocator.h"
22f4a2713aSLionel Sambuc #include "gtest/gtest.h"
23f4a2713aSLionel Sambuc #include <vector>
24f4a2713aSLionel Sambuc
25f4a2713aSLionel Sambuc using namespace llvm;
26f4a2713aSLionel Sambuc using namespace clang;
27f4a2713aSLionel Sambuc
28f4a2713aSLionel Sambuc namespace clang {
29f4a2713aSLionel Sambuc namespace comments {
30f4a2713aSLionel Sambuc
31f4a2713aSLionel Sambuc namespace {
32f4a2713aSLionel Sambuc
33f4a2713aSLionel Sambuc const bool DEBUG = true;
34f4a2713aSLionel Sambuc
35f4a2713aSLionel Sambuc class CommentParserTest : public ::testing::Test {
36f4a2713aSLionel Sambuc protected:
CommentParserTest()37f4a2713aSLionel Sambuc CommentParserTest()
38f4a2713aSLionel Sambuc : FileMgr(FileMgrOpts),
39f4a2713aSLionel Sambuc DiagID(new DiagnosticIDs()),
40f4a2713aSLionel Sambuc Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()),
41f4a2713aSLionel Sambuc SourceMgr(Diags, FileMgr),
42f4a2713aSLionel Sambuc Traits(Allocator, CommentOptions()) {
43f4a2713aSLionel Sambuc }
44f4a2713aSLionel Sambuc
45f4a2713aSLionel Sambuc FileSystemOptions FileMgrOpts;
46f4a2713aSLionel Sambuc FileManager FileMgr;
47f4a2713aSLionel Sambuc IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
48f4a2713aSLionel Sambuc DiagnosticsEngine Diags;
49f4a2713aSLionel Sambuc SourceManager SourceMgr;
50f4a2713aSLionel Sambuc llvm::BumpPtrAllocator Allocator;
51f4a2713aSLionel Sambuc CommandTraits Traits;
52f4a2713aSLionel Sambuc
53f4a2713aSLionel Sambuc FullComment *parseString(const char *Source);
54f4a2713aSLionel Sambuc };
55f4a2713aSLionel Sambuc
parseString(const char * Source)56f4a2713aSLionel Sambuc FullComment *CommentParserTest::parseString(const char *Source) {
57*0a6a1f1dSLionel Sambuc std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Source);
58*0a6a1f1dSLionel Sambuc FileID File = SourceMgr.createFileID(std::move(Buf));
59f4a2713aSLionel Sambuc SourceLocation Begin = SourceMgr.getLocForStartOfFile(File);
60f4a2713aSLionel Sambuc
61f4a2713aSLionel Sambuc Lexer L(Allocator, Diags, Traits, Begin, Source, Source + strlen(Source));
62f4a2713aSLionel Sambuc
63*0a6a1f1dSLionel Sambuc Sema S(Allocator, SourceMgr, Diags, Traits, /*PP=*/ nullptr);
64f4a2713aSLionel Sambuc Parser P(L, S, Allocator, SourceMgr, Diags, Traits);
65f4a2713aSLionel Sambuc FullComment *FC = P.parseFullComment();
66f4a2713aSLionel Sambuc
67f4a2713aSLionel Sambuc if (DEBUG) {
68f4a2713aSLionel Sambuc llvm::errs() << "=== Source:\n" << Source << "\n=== AST:\n";
69f4a2713aSLionel Sambuc FC->dump(llvm::errs(), &Traits, &SourceMgr);
70f4a2713aSLionel Sambuc }
71f4a2713aSLionel Sambuc
72f4a2713aSLionel Sambuc Token Tok;
73f4a2713aSLionel Sambuc L.lex(Tok);
74f4a2713aSLionel Sambuc if (Tok.is(tok::eof))
75f4a2713aSLionel Sambuc return FC;
76f4a2713aSLionel Sambuc else
77*0a6a1f1dSLionel Sambuc return nullptr;
78f4a2713aSLionel Sambuc }
79f4a2713aSLionel Sambuc
HasChildCount(const Comment * C,size_t Count)80f4a2713aSLionel Sambuc ::testing::AssertionResult HasChildCount(const Comment *C, size_t Count) {
81f4a2713aSLionel Sambuc if (!C)
82f4a2713aSLionel Sambuc return ::testing::AssertionFailure() << "Comment is NULL";
83f4a2713aSLionel Sambuc
84f4a2713aSLionel Sambuc if (Count != C->child_count())
85f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
86f4a2713aSLionel Sambuc << "Count = " << Count
87f4a2713aSLionel Sambuc << ", child_count = " << C->child_count();
88f4a2713aSLionel Sambuc
89f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
90f4a2713aSLionel Sambuc }
91f4a2713aSLionel Sambuc
92f4a2713aSLionel Sambuc template <typename T>
GetChildAt(const Comment * C,size_t Idx,T * & Child)93f4a2713aSLionel Sambuc ::testing::AssertionResult GetChildAt(const Comment *C,
94f4a2713aSLionel Sambuc size_t Idx,
95f4a2713aSLionel Sambuc T *&Child) {
96f4a2713aSLionel Sambuc if (!C)
97f4a2713aSLionel Sambuc return ::testing::AssertionFailure() << "Comment is NULL";
98f4a2713aSLionel Sambuc
99f4a2713aSLionel Sambuc if (Idx >= C->child_count())
100f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
101f4a2713aSLionel Sambuc << "Idx out of range. Idx = " << Idx
102f4a2713aSLionel Sambuc << ", child_count = " << C->child_count();
103f4a2713aSLionel Sambuc
104f4a2713aSLionel Sambuc Comment::child_iterator I = C->child_begin() + Idx;
105f4a2713aSLionel Sambuc Comment *CommentChild = *I;
106f4a2713aSLionel Sambuc if (!CommentChild)
107f4a2713aSLionel Sambuc return ::testing::AssertionFailure() << "Child is NULL";
108f4a2713aSLionel Sambuc
109f4a2713aSLionel Sambuc Child = dyn_cast<T>(CommentChild);
110f4a2713aSLionel Sambuc if (!Child)
111f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
112f4a2713aSLionel Sambuc << "Child is not of requested type, but a "
113f4a2713aSLionel Sambuc << CommentChild->getCommentKindName();
114f4a2713aSLionel Sambuc
115f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
116f4a2713aSLionel Sambuc }
117f4a2713aSLionel Sambuc
HasTextAt(const Comment * C,size_t Idx,StringRef Text)118f4a2713aSLionel Sambuc ::testing::AssertionResult HasTextAt(const Comment *C,
119f4a2713aSLionel Sambuc size_t Idx,
120f4a2713aSLionel Sambuc StringRef Text) {
121f4a2713aSLionel Sambuc TextComment *TC;
122f4a2713aSLionel Sambuc ::testing::AssertionResult AR = GetChildAt(C, Idx, TC);
123f4a2713aSLionel Sambuc if (!AR)
124f4a2713aSLionel Sambuc return AR;
125f4a2713aSLionel Sambuc
126f4a2713aSLionel Sambuc StringRef ActualText = TC->getText();
127f4a2713aSLionel Sambuc if (ActualText != Text)
128f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
129f4a2713aSLionel Sambuc << "TextComment has text \"" << ActualText.str() << "\", "
130f4a2713aSLionel Sambuc "expected \"" << Text.str() << "\"";
131f4a2713aSLionel Sambuc
132f4a2713aSLionel Sambuc if (TC->hasTrailingNewline())
133f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
134f4a2713aSLionel Sambuc << "TextComment has a trailing newline";
135f4a2713aSLionel Sambuc
136f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
137f4a2713aSLionel Sambuc }
138f4a2713aSLionel Sambuc
HasTextWithNewlineAt(const Comment * C,size_t Idx,StringRef Text)139f4a2713aSLionel Sambuc ::testing::AssertionResult HasTextWithNewlineAt(const Comment *C,
140f4a2713aSLionel Sambuc size_t Idx,
141f4a2713aSLionel Sambuc StringRef Text) {
142f4a2713aSLionel Sambuc TextComment *TC;
143f4a2713aSLionel Sambuc ::testing::AssertionResult AR = GetChildAt(C, Idx, TC);
144f4a2713aSLionel Sambuc if (!AR)
145f4a2713aSLionel Sambuc return AR;
146f4a2713aSLionel Sambuc
147f4a2713aSLionel Sambuc StringRef ActualText = TC->getText();
148f4a2713aSLionel Sambuc if (ActualText != Text)
149f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
150f4a2713aSLionel Sambuc << "TextComment has text \"" << ActualText.str() << "\", "
151f4a2713aSLionel Sambuc "expected \"" << Text.str() << "\"";
152f4a2713aSLionel Sambuc
153f4a2713aSLionel Sambuc if (!TC->hasTrailingNewline())
154f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
155f4a2713aSLionel Sambuc << "TextComment has no trailing newline";
156f4a2713aSLionel Sambuc
157f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
158f4a2713aSLionel Sambuc }
159f4a2713aSLionel Sambuc
HasBlockCommandAt(const Comment * C,const CommandTraits & Traits,size_t Idx,BlockCommandComment * & BCC,StringRef Name,ParagraphComment * & Paragraph)160f4a2713aSLionel Sambuc ::testing::AssertionResult HasBlockCommandAt(const Comment *C,
161f4a2713aSLionel Sambuc const CommandTraits &Traits,
162f4a2713aSLionel Sambuc size_t Idx,
163f4a2713aSLionel Sambuc BlockCommandComment *&BCC,
164f4a2713aSLionel Sambuc StringRef Name,
165f4a2713aSLionel Sambuc ParagraphComment *&Paragraph) {
166f4a2713aSLionel Sambuc ::testing::AssertionResult AR = GetChildAt(C, Idx, BCC);
167f4a2713aSLionel Sambuc if (!AR)
168f4a2713aSLionel Sambuc return AR;
169f4a2713aSLionel Sambuc
170f4a2713aSLionel Sambuc StringRef ActualName = BCC->getCommandName(Traits);
171f4a2713aSLionel Sambuc if (ActualName != Name)
172f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
173f4a2713aSLionel Sambuc << "BlockCommandComment has name \"" << ActualName.str() << "\", "
174f4a2713aSLionel Sambuc "expected \"" << Name.str() << "\"";
175f4a2713aSLionel Sambuc
176f4a2713aSLionel Sambuc Paragraph = BCC->getParagraph();
177f4a2713aSLionel Sambuc
178f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
179f4a2713aSLionel Sambuc }
180f4a2713aSLionel Sambuc
HasParamCommandAt(const Comment * C,const CommandTraits & Traits,size_t Idx,ParamCommandComment * & PCC,StringRef CommandName,ParamCommandComment::PassDirection Direction,bool IsDirectionExplicit,StringRef ParamName,ParagraphComment * & Paragraph)181f4a2713aSLionel Sambuc ::testing::AssertionResult HasParamCommandAt(
182f4a2713aSLionel Sambuc const Comment *C,
183f4a2713aSLionel Sambuc const CommandTraits &Traits,
184f4a2713aSLionel Sambuc size_t Idx,
185f4a2713aSLionel Sambuc ParamCommandComment *&PCC,
186f4a2713aSLionel Sambuc StringRef CommandName,
187f4a2713aSLionel Sambuc ParamCommandComment::PassDirection Direction,
188f4a2713aSLionel Sambuc bool IsDirectionExplicit,
189f4a2713aSLionel Sambuc StringRef ParamName,
190f4a2713aSLionel Sambuc ParagraphComment *&Paragraph) {
191f4a2713aSLionel Sambuc ::testing::AssertionResult AR = GetChildAt(C, Idx, PCC);
192f4a2713aSLionel Sambuc if (!AR)
193f4a2713aSLionel Sambuc return AR;
194f4a2713aSLionel Sambuc
195f4a2713aSLionel Sambuc StringRef ActualCommandName = PCC->getCommandName(Traits);
196f4a2713aSLionel Sambuc if (ActualCommandName != CommandName)
197f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
198f4a2713aSLionel Sambuc << "ParamCommandComment has name \"" << ActualCommandName.str() << "\", "
199f4a2713aSLionel Sambuc "expected \"" << CommandName.str() << "\"";
200f4a2713aSLionel Sambuc
201f4a2713aSLionel Sambuc if (PCC->getDirection() != Direction)
202f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
203f4a2713aSLionel Sambuc << "ParamCommandComment has direction " << PCC->getDirection() << ", "
204f4a2713aSLionel Sambuc "expected " << Direction;
205f4a2713aSLionel Sambuc
206f4a2713aSLionel Sambuc if (PCC->isDirectionExplicit() != IsDirectionExplicit)
207f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
208f4a2713aSLionel Sambuc << "ParamCommandComment has "
209f4a2713aSLionel Sambuc << (PCC->isDirectionExplicit() ? "explicit" : "implicit")
210f4a2713aSLionel Sambuc << " direction, "
211f4a2713aSLionel Sambuc "expected " << (IsDirectionExplicit ? "explicit" : "implicit");
212f4a2713aSLionel Sambuc
213f4a2713aSLionel Sambuc if (!ParamName.empty() && !PCC->hasParamName())
214f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
215f4a2713aSLionel Sambuc << "ParamCommandComment has no parameter name";
216f4a2713aSLionel Sambuc
217f4a2713aSLionel Sambuc StringRef ActualParamName = PCC->hasParamName() ? PCC->getParamNameAsWritten() : "";
218f4a2713aSLionel Sambuc if (ActualParamName != ParamName)
219f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
220f4a2713aSLionel Sambuc << "ParamCommandComment has parameter name \"" << ActualParamName.str()
221f4a2713aSLionel Sambuc << "\", "
222f4a2713aSLionel Sambuc "expected \"" << ParamName.str() << "\"";
223f4a2713aSLionel Sambuc
224f4a2713aSLionel Sambuc Paragraph = PCC->getParagraph();
225f4a2713aSLionel Sambuc
226f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
227f4a2713aSLionel Sambuc }
228f4a2713aSLionel Sambuc
HasTParamCommandAt(const Comment * C,const CommandTraits & Traits,size_t Idx,TParamCommandComment * & TPCC,StringRef CommandName,StringRef ParamName,ParagraphComment * & Paragraph)229f4a2713aSLionel Sambuc ::testing::AssertionResult HasTParamCommandAt(
230f4a2713aSLionel Sambuc const Comment *C,
231f4a2713aSLionel Sambuc const CommandTraits &Traits,
232f4a2713aSLionel Sambuc size_t Idx,
233f4a2713aSLionel Sambuc TParamCommandComment *&TPCC,
234f4a2713aSLionel Sambuc StringRef CommandName,
235f4a2713aSLionel Sambuc StringRef ParamName,
236f4a2713aSLionel Sambuc ParagraphComment *&Paragraph) {
237f4a2713aSLionel Sambuc ::testing::AssertionResult AR = GetChildAt(C, Idx, TPCC);
238f4a2713aSLionel Sambuc if (!AR)
239f4a2713aSLionel Sambuc return AR;
240f4a2713aSLionel Sambuc
241f4a2713aSLionel Sambuc StringRef ActualCommandName = TPCC->getCommandName(Traits);
242f4a2713aSLionel Sambuc if (ActualCommandName != CommandName)
243f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
244f4a2713aSLionel Sambuc << "TParamCommandComment has name \"" << ActualCommandName.str() << "\", "
245f4a2713aSLionel Sambuc "expected \"" << CommandName.str() << "\"";
246f4a2713aSLionel Sambuc
247f4a2713aSLionel Sambuc if (!ParamName.empty() && !TPCC->hasParamName())
248f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
249f4a2713aSLionel Sambuc << "TParamCommandComment has no parameter name";
250f4a2713aSLionel Sambuc
251f4a2713aSLionel Sambuc StringRef ActualParamName = TPCC->hasParamName() ? TPCC->getParamNameAsWritten() : "";
252f4a2713aSLionel Sambuc if (ActualParamName != ParamName)
253f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
254f4a2713aSLionel Sambuc << "TParamCommandComment has parameter name \"" << ActualParamName.str()
255f4a2713aSLionel Sambuc << "\", "
256f4a2713aSLionel Sambuc "expected \"" << ParamName.str() << "\"";
257f4a2713aSLionel Sambuc
258f4a2713aSLionel Sambuc Paragraph = TPCC->getParagraph();
259f4a2713aSLionel Sambuc
260f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
261f4a2713aSLionel Sambuc }
262f4a2713aSLionel Sambuc
HasInlineCommandAt(const Comment * C,const CommandTraits & Traits,size_t Idx,InlineCommandComment * & ICC,StringRef Name)263f4a2713aSLionel Sambuc ::testing::AssertionResult HasInlineCommandAt(const Comment *C,
264f4a2713aSLionel Sambuc const CommandTraits &Traits,
265f4a2713aSLionel Sambuc size_t Idx,
266f4a2713aSLionel Sambuc InlineCommandComment *&ICC,
267f4a2713aSLionel Sambuc StringRef Name) {
268f4a2713aSLionel Sambuc ::testing::AssertionResult AR = GetChildAt(C, Idx, ICC);
269f4a2713aSLionel Sambuc if (!AR)
270f4a2713aSLionel Sambuc return AR;
271f4a2713aSLionel Sambuc
272f4a2713aSLionel Sambuc StringRef ActualName = ICC->getCommandName(Traits);
273f4a2713aSLionel Sambuc if (ActualName != Name)
274f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
275f4a2713aSLionel Sambuc << "InlineCommandComment has name \"" << ActualName.str() << "\", "
276f4a2713aSLionel Sambuc "expected \"" << Name.str() << "\"";
277f4a2713aSLionel Sambuc
278f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
279f4a2713aSLionel Sambuc }
280f4a2713aSLionel Sambuc
281f4a2713aSLionel Sambuc struct NoArgs {};
282f4a2713aSLionel Sambuc
HasInlineCommandAt(const Comment * C,const CommandTraits & Traits,size_t Idx,InlineCommandComment * & ICC,StringRef Name,NoArgs)283f4a2713aSLionel Sambuc ::testing::AssertionResult HasInlineCommandAt(const Comment *C,
284f4a2713aSLionel Sambuc const CommandTraits &Traits,
285f4a2713aSLionel Sambuc size_t Idx,
286f4a2713aSLionel Sambuc InlineCommandComment *&ICC,
287f4a2713aSLionel Sambuc StringRef Name,
288f4a2713aSLionel Sambuc NoArgs) {
289f4a2713aSLionel Sambuc ::testing::AssertionResult AR = HasInlineCommandAt(C, Traits, Idx, ICC, Name);
290f4a2713aSLionel Sambuc if (!AR)
291f4a2713aSLionel Sambuc return AR;
292f4a2713aSLionel Sambuc
293f4a2713aSLionel Sambuc if (ICC->getNumArgs() != 0)
294f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
295f4a2713aSLionel Sambuc << "InlineCommandComment has " << ICC->getNumArgs() << " arg(s), "
296f4a2713aSLionel Sambuc "expected 0";
297f4a2713aSLionel Sambuc
298f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
299f4a2713aSLionel Sambuc }
300f4a2713aSLionel Sambuc
HasInlineCommandAt(const Comment * C,const CommandTraits & Traits,size_t Idx,InlineCommandComment * & ICC,StringRef Name,StringRef Arg)301f4a2713aSLionel Sambuc ::testing::AssertionResult HasInlineCommandAt(const Comment *C,
302f4a2713aSLionel Sambuc const CommandTraits &Traits,
303f4a2713aSLionel Sambuc size_t Idx,
304f4a2713aSLionel Sambuc InlineCommandComment *&ICC,
305f4a2713aSLionel Sambuc StringRef Name,
306f4a2713aSLionel Sambuc StringRef Arg) {
307f4a2713aSLionel Sambuc ::testing::AssertionResult AR = HasInlineCommandAt(C, Traits, Idx, ICC, Name);
308f4a2713aSLionel Sambuc if (!AR)
309f4a2713aSLionel Sambuc return AR;
310f4a2713aSLionel Sambuc
311f4a2713aSLionel Sambuc if (ICC->getNumArgs() != 1)
312f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
313f4a2713aSLionel Sambuc << "InlineCommandComment has " << ICC->getNumArgs() << " arg(s), "
314f4a2713aSLionel Sambuc "expected 1";
315f4a2713aSLionel Sambuc
316f4a2713aSLionel Sambuc StringRef ActualArg = ICC->getArgText(0);
317f4a2713aSLionel Sambuc if (ActualArg != Arg)
318f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
319f4a2713aSLionel Sambuc << "InlineCommandComment has argument \"" << ActualArg.str() << "\", "
320f4a2713aSLionel Sambuc "expected \"" << Arg.str() << "\"";
321f4a2713aSLionel Sambuc
322f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
323f4a2713aSLionel Sambuc }
324f4a2713aSLionel Sambuc
HasHTMLStartTagAt(const Comment * C,size_t Idx,HTMLStartTagComment * & HST,StringRef TagName)325f4a2713aSLionel Sambuc ::testing::AssertionResult HasHTMLStartTagAt(const Comment *C,
326f4a2713aSLionel Sambuc size_t Idx,
327f4a2713aSLionel Sambuc HTMLStartTagComment *&HST,
328f4a2713aSLionel Sambuc StringRef TagName) {
329f4a2713aSLionel Sambuc ::testing::AssertionResult AR = GetChildAt(C, Idx, HST);
330f4a2713aSLionel Sambuc if (!AR)
331f4a2713aSLionel Sambuc return AR;
332f4a2713aSLionel Sambuc
333f4a2713aSLionel Sambuc StringRef ActualTagName = HST->getTagName();
334f4a2713aSLionel Sambuc if (ActualTagName != TagName)
335f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
336f4a2713aSLionel Sambuc << "HTMLStartTagComment has name \"" << ActualTagName.str() << "\", "
337f4a2713aSLionel Sambuc "expected \"" << TagName.str() << "\"";
338f4a2713aSLionel Sambuc
339f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
340f4a2713aSLionel Sambuc }
341f4a2713aSLionel Sambuc
342f4a2713aSLionel Sambuc struct SelfClosing {};
343f4a2713aSLionel Sambuc
HasHTMLStartTagAt(const Comment * C,size_t Idx,HTMLStartTagComment * & HST,StringRef TagName,SelfClosing)344f4a2713aSLionel Sambuc ::testing::AssertionResult HasHTMLStartTagAt(const Comment *C,
345f4a2713aSLionel Sambuc size_t Idx,
346f4a2713aSLionel Sambuc HTMLStartTagComment *&HST,
347f4a2713aSLionel Sambuc StringRef TagName,
348f4a2713aSLionel Sambuc SelfClosing) {
349f4a2713aSLionel Sambuc ::testing::AssertionResult AR = HasHTMLStartTagAt(C, Idx, HST, TagName);
350f4a2713aSLionel Sambuc if (!AR)
351f4a2713aSLionel Sambuc return AR;
352f4a2713aSLionel Sambuc
353f4a2713aSLionel Sambuc if (!HST->isSelfClosing())
354f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
355f4a2713aSLionel Sambuc << "HTMLStartTagComment is not self-closing";
356f4a2713aSLionel Sambuc
357f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
358f4a2713aSLionel Sambuc }
359f4a2713aSLionel Sambuc
360f4a2713aSLionel Sambuc
361f4a2713aSLionel Sambuc struct NoAttrs {};
362f4a2713aSLionel Sambuc
HasHTMLStartTagAt(const Comment * C,size_t Idx,HTMLStartTagComment * & HST,StringRef TagName,NoAttrs)363f4a2713aSLionel Sambuc ::testing::AssertionResult HasHTMLStartTagAt(const Comment *C,
364f4a2713aSLionel Sambuc size_t Idx,
365f4a2713aSLionel Sambuc HTMLStartTagComment *&HST,
366f4a2713aSLionel Sambuc StringRef TagName,
367f4a2713aSLionel Sambuc NoAttrs) {
368f4a2713aSLionel Sambuc ::testing::AssertionResult AR = HasHTMLStartTagAt(C, Idx, HST, TagName);
369f4a2713aSLionel Sambuc if (!AR)
370f4a2713aSLionel Sambuc return AR;
371f4a2713aSLionel Sambuc
372f4a2713aSLionel Sambuc if (HST->isSelfClosing())
373f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
374f4a2713aSLionel Sambuc << "HTMLStartTagComment is self-closing";
375f4a2713aSLionel Sambuc
376f4a2713aSLionel Sambuc if (HST->getNumAttrs() != 0)
377f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
378f4a2713aSLionel Sambuc << "HTMLStartTagComment has " << HST->getNumAttrs() << " attr(s), "
379f4a2713aSLionel Sambuc "expected 0";
380f4a2713aSLionel Sambuc
381f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
382f4a2713aSLionel Sambuc }
383f4a2713aSLionel Sambuc
HasHTMLStartTagAt(const Comment * C,size_t Idx,HTMLStartTagComment * & HST,StringRef TagName,StringRef AttrName,StringRef AttrValue)384f4a2713aSLionel Sambuc ::testing::AssertionResult HasHTMLStartTagAt(const Comment *C,
385f4a2713aSLionel Sambuc size_t Idx,
386f4a2713aSLionel Sambuc HTMLStartTagComment *&HST,
387f4a2713aSLionel Sambuc StringRef TagName,
388f4a2713aSLionel Sambuc StringRef AttrName,
389f4a2713aSLionel Sambuc StringRef AttrValue) {
390f4a2713aSLionel Sambuc ::testing::AssertionResult AR = HasHTMLStartTagAt(C, Idx, HST, TagName);
391f4a2713aSLionel Sambuc if (!AR)
392f4a2713aSLionel Sambuc return AR;
393f4a2713aSLionel Sambuc
394f4a2713aSLionel Sambuc if (HST->isSelfClosing())
395f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
396f4a2713aSLionel Sambuc << "HTMLStartTagComment is self-closing";
397f4a2713aSLionel Sambuc
398f4a2713aSLionel Sambuc if (HST->getNumAttrs() != 1)
399f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
400f4a2713aSLionel Sambuc << "HTMLStartTagComment has " << HST->getNumAttrs() << " attr(s), "
401f4a2713aSLionel Sambuc "expected 1";
402f4a2713aSLionel Sambuc
403f4a2713aSLionel Sambuc StringRef ActualName = HST->getAttr(0).Name;
404f4a2713aSLionel Sambuc if (ActualName != AttrName)
405f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
406f4a2713aSLionel Sambuc << "HTMLStartTagComment has attr \"" << ActualName.str() << "\", "
407f4a2713aSLionel Sambuc "expected \"" << AttrName.str() << "\"";
408f4a2713aSLionel Sambuc
409f4a2713aSLionel Sambuc StringRef ActualValue = HST->getAttr(0).Value;
410f4a2713aSLionel Sambuc if (ActualValue != AttrValue)
411f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
412f4a2713aSLionel Sambuc << "HTMLStartTagComment has attr value \"" << ActualValue.str() << "\", "
413f4a2713aSLionel Sambuc "expected \"" << AttrValue.str() << "\"";
414f4a2713aSLionel Sambuc
415f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
416f4a2713aSLionel Sambuc }
417f4a2713aSLionel Sambuc
HasHTMLEndTagAt(const Comment * C,size_t Idx,HTMLEndTagComment * & HET,StringRef TagName)418f4a2713aSLionel Sambuc ::testing::AssertionResult HasHTMLEndTagAt(const Comment *C,
419f4a2713aSLionel Sambuc size_t Idx,
420f4a2713aSLionel Sambuc HTMLEndTagComment *&HET,
421f4a2713aSLionel Sambuc StringRef TagName) {
422f4a2713aSLionel Sambuc ::testing::AssertionResult AR = GetChildAt(C, Idx, HET);
423f4a2713aSLionel Sambuc if (!AR)
424f4a2713aSLionel Sambuc return AR;
425f4a2713aSLionel Sambuc
426f4a2713aSLionel Sambuc StringRef ActualTagName = HET->getTagName();
427f4a2713aSLionel Sambuc if (ActualTagName != TagName)
428f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
429f4a2713aSLionel Sambuc << "HTMLEndTagComment has name \"" << ActualTagName.str() << "\", "
430f4a2713aSLionel Sambuc "expected \"" << TagName.str() << "\"";
431f4a2713aSLionel Sambuc
432f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
433f4a2713aSLionel Sambuc }
434f4a2713aSLionel Sambuc
HasParagraphCommentAt(const Comment * C,size_t Idx,StringRef Text)435f4a2713aSLionel Sambuc ::testing::AssertionResult HasParagraphCommentAt(const Comment *C,
436f4a2713aSLionel Sambuc size_t Idx,
437f4a2713aSLionel Sambuc StringRef Text) {
438f4a2713aSLionel Sambuc ParagraphComment *PC;
439f4a2713aSLionel Sambuc
440f4a2713aSLionel Sambuc {
441f4a2713aSLionel Sambuc ::testing::AssertionResult AR = GetChildAt(C, Idx, PC);
442f4a2713aSLionel Sambuc if (!AR)
443f4a2713aSLionel Sambuc return AR;
444f4a2713aSLionel Sambuc }
445f4a2713aSLionel Sambuc
446f4a2713aSLionel Sambuc {
447f4a2713aSLionel Sambuc ::testing::AssertionResult AR = HasChildCount(PC, 1);
448f4a2713aSLionel Sambuc if (!AR)
449f4a2713aSLionel Sambuc return AR;
450f4a2713aSLionel Sambuc }
451f4a2713aSLionel Sambuc
452f4a2713aSLionel Sambuc {
453f4a2713aSLionel Sambuc ::testing::AssertionResult AR = HasTextAt(PC, 0, Text);
454f4a2713aSLionel Sambuc if (!AR)
455f4a2713aSLionel Sambuc return AR;
456f4a2713aSLionel Sambuc }
457f4a2713aSLionel Sambuc
458f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
459f4a2713aSLionel Sambuc }
460f4a2713aSLionel Sambuc
HasVerbatimBlockAt(const Comment * C,const CommandTraits & Traits,size_t Idx,VerbatimBlockComment * & VBC,StringRef Name,StringRef CloseName)461f4a2713aSLionel Sambuc ::testing::AssertionResult HasVerbatimBlockAt(const Comment *C,
462f4a2713aSLionel Sambuc const CommandTraits &Traits,
463f4a2713aSLionel Sambuc size_t Idx,
464f4a2713aSLionel Sambuc VerbatimBlockComment *&VBC,
465f4a2713aSLionel Sambuc StringRef Name,
466f4a2713aSLionel Sambuc StringRef CloseName) {
467f4a2713aSLionel Sambuc ::testing::AssertionResult AR = GetChildAt(C, Idx, VBC);
468f4a2713aSLionel Sambuc if (!AR)
469f4a2713aSLionel Sambuc return AR;
470f4a2713aSLionel Sambuc
471f4a2713aSLionel Sambuc StringRef ActualName = VBC->getCommandName(Traits);
472f4a2713aSLionel Sambuc if (ActualName != Name)
473f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
474f4a2713aSLionel Sambuc << "VerbatimBlockComment has name \"" << ActualName.str() << "\", "
475f4a2713aSLionel Sambuc "expected \"" << Name.str() << "\"";
476f4a2713aSLionel Sambuc
477f4a2713aSLionel Sambuc StringRef ActualCloseName = VBC->getCloseName();
478f4a2713aSLionel Sambuc if (ActualCloseName != CloseName)
479f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
480f4a2713aSLionel Sambuc << "VerbatimBlockComment has closing command name \""
481f4a2713aSLionel Sambuc << ActualCloseName.str() << "\", "
482f4a2713aSLionel Sambuc "expected \"" << CloseName.str() << "\"";
483f4a2713aSLionel Sambuc
484f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
485f4a2713aSLionel Sambuc }
486f4a2713aSLionel Sambuc
487f4a2713aSLionel Sambuc struct NoLines {};
488f4a2713aSLionel Sambuc struct Lines {};
489f4a2713aSLionel Sambuc
HasVerbatimBlockAt(const Comment * C,const CommandTraits & Traits,size_t Idx,VerbatimBlockComment * & VBC,StringRef Name,StringRef CloseName,NoLines)490f4a2713aSLionel Sambuc ::testing::AssertionResult HasVerbatimBlockAt(const Comment *C,
491f4a2713aSLionel Sambuc const CommandTraits &Traits,
492f4a2713aSLionel Sambuc size_t Idx,
493f4a2713aSLionel Sambuc VerbatimBlockComment *&VBC,
494f4a2713aSLionel Sambuc StringRef Name,
495f4a2713aSLionel Sambuc StringRef CloseName,
496f4a2713aSLionel Sambuc NoLines) {
497f4a2713aSLionel Sambuc ::testing::AssertionResult AR = HasVerbatimBlockAt(C, Traits, Idx, VBC, Name,
498f4a2713aSLionel Sambuc CloseName);
499f4a2713aSLionel Sambuc if (!AR)
500f4a2713aSLionel Sambuc return AR;
501f4a2713aSLionel Sambuc
502f4a2713aSLionel Sambuc if (VBC->getNumLines() != 0)
503f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
504f4a2713aSLionel Sambuc << "VerbatimBlockComment has " << VBC->getNumLines() << " lines(s), "
505f4a2713aSLionel Sambuc "expected 0";
506f4a2713aSLionel Sambuc
507f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
508f4a2713aSLionel Sambuc }
509f4a2713aSLionel Sambuc
HasVerbatimBlockAt(const Comment * C,const CommandTraits & Traits,size_t Idx,VerbatimBlockComment * & VBC,StringRef Name,StringRef CloseName,Lines,StringRef Line0)510f4a2713aSLionel Sambuc ::testing::AssertionResult HasVerbatimBlockAt(const Comment *C,
511f4a2713aSLionel Sambuc const CommandTraits &Traits,
512f4a2713aSLionel Sambuc size_t Idx,
513f4a2713aSLionel Sambuc VerbatimBlockComment *&VBC,
514f4a2713aSLionel Sambuc StringRef Name,
515f4a2713aSLionel Sambuc StringRef CloseName,
516f4a2713aSLionel Sambuc Lines,
517f4a2713aSLionel Sambuc StringRef Line0) {
518f4a2713aSLionel Sambuc ::testing::AssertionResult AR = HasVerbatimBlockAt(C, Traits, Idx, VBC, Name,
519f4a2713aSLionel Sambuc CloseName);
520f4a2713aSLionel Sambuc if (!AR)
521f4a2713aSLionel Sambuc return AR;
522f4a2713aSLionel Sambuc
523f4a2713aSLionel Sambuc if (VBC->getNumLines() != 1)
524f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
525f4a2713aSLionel Sambuc << "VerbatimBlockComment has " << VBC->getNumLines() << " lines(s), "
526f4a2713aSLionel Sambuc "expected 1";
527f4a2713aSLionel Sambuc
528f4a2713aSLionel Sambuc StringRef ActualLine0 = VBC->getText(0);
529f4a2713aSLionel Sambuc if (ActualLine0 != Line0)
530f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
531f4a2713aSLionel Sambuc << "VerbatimBlockComment has lines[0] \"" << ActualLine0.str() << "\", "
532f4a2713aSLionel Sambuc "expected \"" << Line0.str() << "\"";
533f4a2713aSLionel Sambuc
534f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
535f4a2713aSLionel Sambuc }
536f4a2713aSLionel Sambuc
HasVerbatimBlockAt(const Comment * C,const CommandTraits & Traits,size_t Idx,VerbatimBlockComment * & VBC,StringRef Name,StringRef CloseName,Lines,StringRef Line0,StringRef Line1)537f4a2713aSLionel Sambuc ::testing::AssertionResult HasVerbatimBlockAt(const Comment *C,
538f4a2713aSLionel Sambuc const CommandTraits &Traits,
539f4a2713aSLionel Sambuc size_t Idx,
540f4a2713aSLionel Sambuc VerbatimBlockComment *&VBC,
541f4a2713aSLionel Sambuc StringRef Name,
542f4a2713aSLionel Sambuc StringRef CloseName,
543f4a2713aSLionel Sambuc Lines,
544f4a2713aSLionel Sambuc StringRef Line0,
545f4a2713aSLionel Sambuc StringRef Line1) {
546f4a2713aSLionel Sambuc ::testing::AssertionResult AR = HasVerbatimBlockAt(C, Traits, Idx, VBC, Name,
547f4a2713aSLionel Sambuc CloseName);
548f4a2713aSLionel Sambuc if (!AR)
549f4a2713aSLionel Sambuc return AR;
550f4a2713aSLionel Sambuc
551f4a2713aSLionel Sambuc if (VBC->getNumLines() != 2)
552f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
553f4a2713aSLionel Sambuc << "VerbatimBlockComment has " << VBC->getNumLines() << " lines(s), "
554f4a2713aSLionel Sambuc "expected 2";
555f4a2713aSLionel Sambuc
556f4a2713aSLionel Sambuc StringRef ActualLine0 = VBC->getText(0);
557f4a2713aSLionel Sambuc if (ActualLine0 != Line0)
558f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
559f4a2713aSLionel Sambuc << "VerbatimBlockComment has lines[0] \"" << ActualLine0.str() << "\", "
560f4a2713aSLionel Sambuc "expected \"" << Line0.str() << "\"";
561f4a2713aSLionel Sambuc
562f4a2713aSLionel Sambuc StringRef ActualLine1 = VBC->getText(1);
563f4a2713aSLionel Sambuc if (ActualLine1 != Line1)
564f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
565f4a2713aSLionel Sambuc << "VerbatimBlockComment has lines[1] \"" << ActualLine1.str() << "\", "
566f4a2713aSLionel Sambuc "expected \"" << Line1.str() << "\"";
567f4a2713aSLionel Sambuc
568f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
569f4a2713aSLionel Sambuc }
570f4a2713aSLionel Sambuc
HasVerbatimLineAt(const Comment * C,const CommandTraits & Traits,size_t Idx,VerbatimLineComment * & VLC,StringRef Name,StringRef Text)571f4a2713aSLionel Sambuc ::testing::AssertionResult HasVerbatimLineAt(const Comment *C,
572f4a2713aSLionel Sambuc const CommandTraits &Traits,
573f4a2713aSLionel Sambuc size_t Idx,
574f4a2713aSLionel Sambuc VerbatimLineComment *&VLC,
575f4a2713aSLionel Sambuc StringRef Name,
576f4a2713aSLionel Sambuc StringRef Text) {
577f4a2713aSLionel Sambuc ::testing::AssertionResult AR = GetChildAt(C, Idx, VLC);
578f4a2713aSLionel Sambuc if (!AR)
579f4a2713aSLionel Sambuc return AR;
580f4a2713aSLionel Sambuc
581f4a2713aSLionel Sambuc StringRef ActualName = VLC->getCommandName(Traits);
582f4a2713aSLionel Sambuc if (ActualName != Name)
583f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
584f4a2713aSLionel Sambuc << "VerbatimLineComment has name \"" << ActualName.str() << "\", "
585f4a2713aSLionel Sambuc "expected \"" << Name.str() << "\"";
586f4a2713aSLionel Sambuc
587f4a2713aSLionel Sambuc StringRef ActualText = VLC->getText();
588f4a2713aSLionel Sambuc if (ActualText != Text)
589f4a2713aSLionel Sambuc return ::testing::AssertionFailure()
590f4a2713aSLionel Sambuc << "VerbatimLineComment has text \"" << ActualText.str() << "\", "
591f4a2713aSLionel Sambuc "expected \"" << Text.str() << "\"";
592f4a2713aSLionel Sambuc
593f4a2713aSLionel Sambuc return ::testing::AssertionSuccess();
594f4a2713aSLionel Sambuc }
595f4a2713aSLionel Sambuc
596f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,Basic1)597f4a2713aSLionel Sambuc TEST_F(CommentParserTest, Basic1) {
598f4a2713aSLionel Sambuc const char *Source = "//";
599f4a2713aSLionel Sambuc
600f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
601f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 0));
602f4a2713aSLionel Sambuc }
603f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,Basic2)604f4a2713aSLionel Sambuc TEST_F(CommentParserTest, Basic2) {
605f4a2713aSLionel Sambuc const char *Source = "// Meow";
606f4a2713aSLionel Sambuc
607f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
608f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 1));
609f4a2713aSLionel Sambuc
610f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " Meow"));
611f4a2713aSLionel Sambuc }
612f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,Basic3)613f4a2713aSLionel Sambuc TEST_F(CommentParserTest, Basic3) {
614f4a2713aSLionel Sambuc const char *Source =
615f4a2713aSLionel Sambuc "// Aaa\n"
616f4a2713aSLionel Sambuc "// Bbb";
617f4a2713aSLionel Sambuc
618f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
619f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 1));
620f4a2713aSLionel Sambuc
621f4a2713aSLionel Sambuc {
622f4a2713aSLionel Sambuc ParagraphComment *PC;
623f4a2713aSLionel Sambuc ASSERT_TRUE(GetChildAt(FC, 0, PC));
624f4a2713aSLionel Sambuc
625f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 2));
626f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextWithNewlineAt(PC, 0, " Aaa"));
627f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 1, " Bbb"));
628f4a2713aSLionel Sambuc }
629f4a2713aSLionel Sambuc }
630f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,ParagraphSplitting1)631f4a2713aSLionel Sambuc TEST_F(CommentParserTest, ParagraphSplitting1) {
632f4a2713aSLionel Sambuc const char *Sources[] = {
633f4a2713aSLionel Sambuc "// Aaa\n"
634f4a2713aSLionel Sambuc "//\n"
635f4a2713aSLionel Sambuc "// Bbb",
636f4a2713aSLionel Sambuc
637f4a2713aSLionel Sambuc "// Aaa\n"
638f4a2713aSLionel Sambuc "// \n"
639f4a2713aSLionel Sambuc "// Bbb",
640f4a2713aSLionel Sambuc
641f4a2713aSLionel Sambuc "// Aaa\n"
642f4a2713aSLionel Sambuc "//\t\n"
643f4a2713aSLionel Sambuc "// Bbb",
644f4a2713aSLionel Sambuc
645f4a2713aSLionel Sambuc "// Aaa\n"
646f4a2713aSLionel Sambuc "//\n"
647f4a2713aSLionel Sambuc "//\n"
648f4a2713aSLionel Sambuc "// Bbb",
649f4a2713aSLionel Sambuc
650f4a2713aSLionel Sambuc "/**\n"
651f4a2713aSLionel Sambuc " Aaa\n"
652f4a2713aSLionel Sambuc "\n"
653f4a2713aSLionel Sambuc " Bbb\n"
654f4a2713aSLionel Sambuc "*/",
655f4a2713aSLionel Sambuc
656f4a2713aSLionel Sambuc "/**\n"
657f4a2713aSLionel Sambuc " Aaa\n"
658f4a2713aSLionel Sambuc " \n"
659f4a2713aSLionel Sambuc " Bbb\n"
660f4a2713aSLionel Sambuc "*/",
661f4a2713aSLionel Sambuc
662f4a2713aSLionel Sambuc "/**\n"
663f4a2713aSLionel Sambuc " Aaa\n"
664f4a2713aSLionel Sambuc "\t \n"
665f4a2713aSLionel Sambuc " Bbb\n"
666f4a2713aSLionel Sambuc "*/",
667f4a2713aSLionel Sambuc };
668f4a2713aSLionel Sambuc
669f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
670f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
671f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
672f4a2713aSLionel Sambuc
673f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " Aaa"));
674f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 1, " Bbb"));
675f4a2713aSLionel Sambuc }
676f4a2713aSLionel Sambuc }
677f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,Paragraph1)678f4a2713aSLionel Sambuc TEST_F(CommentParserTest, Paragraph1) {
679f4a2713aSLionel Sambuc const char *Source =
680f4a2713aSLionel Sambuc "// \\brief Aaa\n"
681f4a2713aSLionel Sambuc "//\n"
682f4a2713aSLionel Sambuc "// Bbb";
683f4a2713aSLionel Sambuc
684f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
685f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 3));
686f4a2713aSLionel Sambuc
687f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
688f4a2713aSLionel Sambuc {
689f4a2713aSLionel Sambuc BlockCommandComment *BCC;
690f4a2713aSLionel Sambuc ParagraphComment *PC;
691f4a2713aSLionel Sambuc ASSERT_TRUE(HasBlockCommandAt(FC, Traits, 1, BCC, "brief", PC));
692f4a2713aSLionel Sambuc
693f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(BCC, 0, " Aaa"));
694f4a2713aSLionel Sambuc }
695f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 2, " Bbb"));
696f4a2713aSLionel Sambuc }
697f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,Paragraph2)698f4a2713aSLionel Sambuc TEST_F(CommentParserTest, Paragraph2) {
699f4a2713aSLionel Sambuc const char *Source = "// \\brief \\author";
700f4a2713aSLionel Sambuc
701f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
702f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 3));
703f4a2713aSLionel Sambuc
704f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
705f4a2713aSLionel Sambuc {
706f4a2713aSLionel Sambuc BlockCommandComment *BCC;
707f4a2713aSLionel Sambuc ParagraphComment *PC;
708f4a2713aSLionel Sambuc ASSERT_TRUE(HasBlockCommandAt(FC, Traits, 1, BCC, "brief", PC));
709f4a2713aSLionel Sambuc
710f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(BCC, 0, " "));
711f4a2713aSLionel Sambuc }
712f4a2713aSLionel Sambuc {
713f4a2713aSLionel Sambuc BlockCommandComment *BCC;
714f4a2713aSLionel Sambuc ParagraphComment *PC;
715f4a2713aSLionel Sambuc ASSERT_TRUE(HasBlockCommandAt(FC, Traits, 2, BCC, "author", PC));
716f4a2713aSLionel Sambuc
717f4a2713aSLionel Sambuc ASSERT_TRUE(GetChildAt(BCC, 0, PC));
718f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 0));
719f4a2713aSLionel Sambuc }
720f4a2713aSLionel Sambuc }
721f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,Paragraph3)722f4a2713aSLionel Sambuc TEST_F(CommentParserTest, Paragraph3) {
723f4a2713aSLionel Sambuc const char *Source =
724f4a2713aSLionel Sambuc "// \\brief Aaa\n"
725f4a2713aSLionel Sambuc "// Bbb \\author\n"
726f4a2713aSLionel Sambuc "// Ccc";
727f4a2713aSLionel Sambuc
728f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
729f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 3));
730f4a2713aSLionel Sambuc
731f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
732f4a2713aSLionel Sambuc {
733f4a2713aSLionel Sambuc BlockCommandComment *BCC;
734f4a2713aSLionel Sambuc ParagraphComment *PC;
735f4a2713aSLionel Sambuc ASSERT_TRUE(HasBlockCommandAt(FC, Traits, 1, BCC, "brief", PC));
736f4a2713aSLionel Sambuc
737f4a2713aSLionel Sambuc ASSERT_TRUE(GetChildAt(BCC, 0, PC));
738f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 2));
739f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextWithNewlineAt(PC, 0, " Aaa"));
740f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 1, " Bbb "));
741f4a2713aSLionel Sambuc }
742f4a2713aSLionel Sambuc {
743f4a2713aSLionel Sambuc BlockCommandComment *BCC;
744f4a2713aSLionel Sambuc ParagraphComment *PC;
745f4a2713aSLionel Sambuc ASSERT_TRUE(HasBlockCommandAt(FC, Traits, 2, BCC, "author", PC));
746f4a2713aSLionel Sambuc
747f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(BCC, 0, " Ccc"));
748f4a2713aSLionel Sambuc }
749f4a2713aSLionel Sambuc }
750f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,ParamCommand1)751f4a2713aSLionel Sambuc TEST_F(CommentParserTest, ParamCommand1) {
752f4a2713aSLionel Sambuc const char *Source = "// \\param aaa";
753f4a2713aSLionel Sambuc
754f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
755f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
756f4a2713aSLionel Sambuc
757f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
758f4a2713aSLionel Sambuc {
759f4a2713aSLionel Sambuc ParamCommandComment *PCC;
760f4a2713aSLionel Sambuc ParagraphComment *PC;
761f4a2713aSLionel Sambuc ASSERT_TRUE(HasParamCommandAt(FC, Traits, 1, PCC, "param",
762f4a2713aSLionel Sambuc ParamCommandComment::In,
763f4a2713aSLionel Sambuc /* IsDirectionExplicit = */ false,
764f4a2713aSLionel Sambuc "aaa", PC));
765f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PCC, 1));
766f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 0));
767f4a2713aSLionel Sambuc }
768f4a2713aSLionel Sambuc }
769f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,ParamCommand2)770f4a2713aSLionel Sambuc TEST_F(CommentParserTest, ParamCommand2) {
771f4a2713aSLionel Sambuc const char *Source = "// \\param\\brief";
772f4a2713aSLionel Sambuc
773f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
774f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 3));
775f4a2713aSLionel Sambuc
776f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
777f4a2713aSLionel Sambuc {
778f4a2713aSLionel Sambuc ParamCommandComment *PCC;
779f4a2713aSLionel Sambuc ParagraphComment *PC;
780f4a2713aSLionel Sambuc ASSERT_TRUE(HasParamCommandAt(FC, Traits, 1, PCC, "param",
781f4a2713aSLionel Sambuc ParamCommandComment::In,
782f4a2713aSLionel Sambuc /* IsDirectionExplicit = */ false,
783f4a2713aSLionel Sambuc "", PC));
784f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PCC, 1));
785f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 0));
786f4a2713aSLionel Sambuc }
787f4a2713aSLionel Sambuc {
788f4a2713aSLionel Sambuc BlockCommandComment *BCC;
789f4a2713aSLionel Sambuc ParagraphComment *PC;
790f4a2713aSLionel Sambuc ASSERT_TRUE(HasBlockCommandAt(FC, Traits, 2, BCC, "brief", PC));
791f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 0));
792f4a2713aSLionel Sambuc }
793f4a2713aSLionel Sambuc }
794f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,ParamCommand3)795f4a2713aSLionel Sambuc TEST_F(CommentParserTest, ParamCommand3) {
796f4a2713aSLionel Sambuc const char *Sources[] = {
797f4a2713aSLionel Sambuc "// \\param aaa Bbb\n",
798f4a2713aSLionel Sambuc "// \\param\n"
799f4a2713aSLionel Sambuc "// aaa Bbb\n",
800f4a2713aSLionel Sambuc "// \\param \n"
801f4a2713aSLionel Sambuc "// aaa Bbb\n",
802f4a2713aSLionel Sambuc "// \\param aaa\n"
803f4a2713aSLionel Sambuc "// Bbb\n"
804f4a2713aSLionel Sambuc };
805f4a2713aSLionel Sambuc
806f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
807f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
808f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
809f4a2713aSLionel Sambuc
810f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
811f4a2713aSLionel Sambuc {
812f4a2713aSLionel Sambuc ParamCommandComment *PCC;
813f4a2713aSLionel Sambuc ParagraphComment *PC;
814f4a2713aSLionel Sambuc ASSERT_TRUE(HasParamCommandAt(FC, Traits, 1, PCC, "param",
815f4a2713aSLionel Sambuc ParamCommandComment::In,
816f4a2713aSLionel Sambuc /* IsDirectionExplicit = */ false,
817f4a2713aSLionel Sambuc "aaa", PC));
818f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PCC, 1));
819f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(PCC, 0, " Bbb"));
820f4a2713aSLionel Sambuc }
821f4a2713aSLionel Sambuc }
822f4a2713aSLionel Sambuc }
823f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,ParamCommand4)824f4a2713aSLionel Sambuc TEST_F(CommentParserTest, ParamCommand4) {
825f4a2713aSLionel Sambuc const char *Sources[] = {
826f4a2713aSLionel Sambuc "// \\param [in] aaa Bbb\n",
827f4a2713aSLionel Sambuc "// \\param[in] aaa Bbb\n",
828f4a2713aSLionel Sambuc "// \\param\n"
829f4a2713aSLionel Sambuc "// [in] aaa Bbb\n",
830f4a2713aSLionel Sambuc "// \\param [in]\n"
831f4a2713aSLionel Sambuc "// aaa Bbb\n",
832f4a2713aSLionel Sambuc "// \\param [in] aaa\n"
833f4a2713aSLionel Sambuc "// Bbb\n",
834f4a2713aSLionel Sambuc };
835f4a2713aSLionel Sambuc
836f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
837f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
838f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
839f4a2713aSLionel Sambuc
840f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
841f4a2713aSLionel Sambuc {
842f4a2713aSLionel Sambuc ParamCommandComment *PCC;
843f4a2713aSLionel Sambuc ParagraphComment *PC;
844f4a2713aSLionel Sambuc ASSERT_TRUE(HasParamCommandAt(FC, Traits, 1, PCC, "param",
845f4a2713aSLionel Sambuc ParamCommandComment::In,
846f4a2713aSLionel Sambuc /* IsDirectionExplicit = */ true,
847f4a2713aSLionel Sambuc "aaa", PC));
848f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PCC, 1));
849f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(PCC, 0, " Bbb"));
850f4a2713aSLionel Sambuc }
851f4a2713aSLionel Sambuc }
852f4a2713aSLionel Sambuc }
853f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,ParamCommand5)854f4a2713aSLionel Sambuc TEST_F(CommentParserTest, ParamCommand5) {
855f4a2713aSLionel Sambuc const char *Sources[] = {
856f4a2713aSLionel Sambuc "// \\param [out] aaa Bbb\n",
857f4a2713aSLionel Sambuc "// \\param[out] aaa Bbb\n",
858f4a2713aSLionel Sambuc "// \\param\n"
859f4a2713aSLionel Sambuc "// [out] aaa Bbb\n",
860f4a2713aSLionel Sambuc "// \\param [out]\n"
861f4a2713aSLionel Sambuc "// aaa Bbb\n",
862f4a2713aSLionel Sambuc "// \\param [out] aaa\n"
863f4a2713aSLionel Sambuc "// Bbb\n",
864f4a2713aSLionel Sambuc };
865f4a2713aSLionel Sambuc
866f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
867f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
868f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
869f4a2713aSLionel Sambuc
870f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
871f4a2713aSLionel Sambuc {
872f4a2713aSLionel Sambuc ParamCommandComment *PCC;
873f4a2713aSLionel Sambuc ParagraphComment *PC;
874f4a2713aSLionel Sambuc ASSERT_TRUE(HasParamCommandAt(FC, Traits, 1, PCC, "param",
875f4a2713aSLionel Sambuc ParamCommandComment::Out,
876f4a2713aSLionel Sambuc /* IsDirectionExplicit = */ true,
877f4a2713aSLionel Sambuc "aaa", PC));
878f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PCC, 1));
879f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(PCC, 0, " Bbb"));
880f4a2713aSLionel Sambuc }
881f4a2713aSLionel Sambuc }
882f4a2713aSLionel Sambuc }
883f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,ParamCommand6)884f4a2713aSLionel Sambuc TEST_F(CommentParserTest, ParamCommand6) {
885f4a2713aSLionel Sambuc const char *Sources[] = {
886f4a2713aSLionel Sambuc "// \\param [in,out] aaa Bbb\n",
887f4a2713aSLionel Sambuc "// \\param[in,out] aaa Bbb\n",
888f4a2713aSLionel Sambuc "// \\param [in, out] aaa Bbb\n",
889f4a2713aSLionel Sambuc "// \\param [in,\n"
890f4a2713aSLionel Sambuc "// out] aaa Bbb\n",
891f4a2713aSLionel Sambuc "// \\param [in,out]\n"
892f4a2713aSLionel Sambuc "// aaa Bbb\n",
893f4a2713aSLionel Sambuc "// \\param [in,out] aaa\n"
894f4a2713aSLionel Sambuc "// Bbb\n"
895f4a2713aSLionel Sambuc };
896f4a2713aSLionel Sambuc
897f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
898f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
899f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
900f4a2713aSLionel Sambuc
901f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
902f4a2713aSLionel Sambuc {
903f4a2713aSLionel Sambuc ParamCommandComment *PCC;
904f4a2713aSLionel Sambuc ParagraphComment *PC;
905f4a2713aSLionel Sambuc ASSERT_TRUE(HasParamCommandAt(FC, Traits, 1, PCC, "param",
906f4a2713aSLionel Sambuc ParamCommandComment::InOut,
907f4a2713aSLionel Sambuc /* IsDirectionExplicit = */ true,
908f4a2713aSLionel Sambuc "aaa", PC));
909f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PCC, 1));
910f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(PCC, 0, " Bbb"));
911f4a2713aSLionel Sambuc }
912f4a2713aSLionel Sambuc }
913f4a2713aSLionel Sambuc }
914f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,ParamCommand7)915f4a2713aSLionel Sambuc TEST_F(CommentParserTest, ParamCommand7) {
916f4a2713aSLionel Sambuc const char *Source =
917f4a2713aSLionel Sambuc "// \\param aaa \\% Bbb \\$ ccc\n";
918f4a2713aSLionel Sambuc
919f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
920f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
921f4a2713aSLionel Sambuc
922f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
923f4a2713aSLionel Sambuc {
924f4a2713aSLionel Sambuc ParamCommandComment *PCC;
925f4a2713aSLionel Sambuc ParagraphComment *PC;
926f4a2713aSLionel Sambuc ASSERT_TRUE(HasParamCommandAt(FC, Traits, 1, PCC, "param",
927f4a2713aSLionel Sambuc ParamCommandComment::In,
928f4a2713aSLionel Sambuc /* IsDirectionExplicit = */ false,
929f4a2713aSLionel Sambuc "aaa", PC));
930f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PCC, 1));
931f4a2713aSLionel Sambuc
932f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 5));
933f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 0, " "));
934f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 1, "%"));
935f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 2, " Bbb "));
936f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 3, "$"));
937f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 4, " ccc"));
938f4a2713aSLionel Sambuc }
939f4a2713aSLionel Sambuc }
940f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,TParamCommand1)941f4a2713aSLionel Sambuc TEST_F(CommentParserTest, TParamCommand1) {
942f4a2713aSLionel Sambuc const char *Sources[] = {
943f4a2713aSLionel Sambuc "// \\tparam aaa Bbb\n",
944f4a2713aSLionel Sambuc "// \\tparam\n"
945f4a2713aSLionel Sambuc "// aaa Bbb\n",
946f4a2713aSLionel Sambuc "// \\tparam \n"
947f4a2713aSLionel Sambuc "// aaa Bbb\n",
948f4a2713aSLionel Sambuc "// \\tparam aaa\n"
949f4a2713aSLionel Sambuc "// Bbb\n"
950f4a2713aSLionel Sambuc };
951f4a2713aSLionel Sambuc
952f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
953f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
954f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
955f4a2713aSLionel Sambuc
956f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
957f4a2713aSLionel Sambuc {
958f4a2713aSLionel Sambuc TParamCommandComment *TPCC;
959f4a2713aSLionel Sambuc ParagraphComment *PC;
960f4a2713aSLionel Sambuc ASSERT_TRUE(HasTParamCommandAt(FC, Traits, 1, TPCC, "tparam",
961f4a2713aSLionel Sambuc "aaa", PC));
962f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(TPCC, 1));
963f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(TPCC, 0, " Bbb"));
964f4a2713aSLionel Sambuc }
965f4a2713aSLionel Sambuc }
966f4a2713aSLionel Sambuc }
967f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,TParamCommand2)968f4a2713aSLionel Sambuc TEST_F(CommentParserTest, TParamCommand2) {
969f4a2713aSLionel Sambuc const char *Source = "// \\tparam\\brief";
970f4a2713aSLionel Sambuc
971f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
972f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 3));
973f4a2713aSLionel Sambuc
974f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
975f4a2713aSLionel Sambuc {
976f4a2713aSLionel Sambuc TParamCommandComment *TPCC;
977f4a2713aSLionel Sambuc ParagraphComment *PC;
978f4a2713aSLionel Sambuc ASSERT_TRUE(HasTParamCommandAt(FC, Traits, 1, TPCC, "tparam", "", PC));
979f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(TPCC, 1));
980f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 0));
981f4a2713aSLionel Sambuc }
982f4a2713aSLionel Sambuc {
983f4a2713aSLionel Sambuc BlockCommandComment *BCC;
984f4a2713aSLionel Sambuc ParagraphComment *PC;
985f4a2713aSLionel Sambuc ASSERT_TRUE(HasBlockCommandAt(FC, Traits, 2, BCC, "brief", PC));
986f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 0));
987f4a2713aSLionel Sambuc }
988f4a2713aSLionel Sambuc }
989f4a2713aSLionel Sambuc
990f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,InlineCommand1)991f4a2713aSLionel Sambuc TEST_F(CommentParserTest, InlineCommand1) {
992f4a2713aSLionel Sambuc const char *Source = "// \\c";
993f4a2713aSLionel Sambuc
994f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
995f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 1));
996f4a2713aSLionel Sambuc
997f4a2713aSLionel Sambuc {
998f4a2713aSLionel Sambuc ParagraphComment *PC;
999f4a2713aSLionel Sambuc InlineCommandComment *ICC;
1000f4a2713aSLionel Sambuc ASSERT_TRUE(GetChildAt(FC, 0, PC));
1001f4a2713aSLionel Sambuc
1002f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 2));
1003f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 0, " "));
1004f4a2713aSLionel Sambuc ASSERT_TRUE(HasInlineCommandAt(PC, Traits, 1, ICC, "c", NoArgs()));
1005f4a2713aSLionel Sambuc }
1006f4a2713aSLionel Sambuc }
1007f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,InlineCommand2)1008f4a2713aSLionel Sambuc TEST_F(CommentParserTest, InlineCommand2) {
1009f4a2713aSLionel Sambuc const char *Source = "// \\c ";
1010f4a2713aSLionel Sambuc
1011f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
1012f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 1));
1013f4a2713aSLionel Sambuc
1014f4a2713aSLionel Sambuc {
1015f4a2713aSLionel Sambuc ParagraphComment *PC;
1016f4a2713aSLionel Sambuc InlineCommandComment *ICC;
1017f4a2713aSLionel Sambuc ASSERT_TRUE(GetChildAt(FC, 0, PC));
1018f4a2713aSLionel Sambuc
1019f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 3));
1020f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 0, " "));
1021f4a2713aSLionel Sambuc ASSERT_TRUE(HasInlineCommandAt(PC, Traits, 1, ICC, "c", NoArgs()));
1022f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 2, " "));
1023f4a2713aSLionel Sambuc }
1024f4a2713aSLionel Sambuc }
1025f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,InlineCommand3)1026f4a2713aSLionel Sambuc TEST_F(CommentParserTest, InlineCommand3) {
1027f4a2713aSLionel Sambuc const char *Source = "// \\c aaa\n";
1028f4a2713aSLionel Sambuc
1029f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
1030f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 1));
1031f4a2713aSLionel Sambuc
1032f4a2713aSLionel Sambuc {
1033f4a2713aSLionel Sambuc ParagraphComment *PC;
1034f4a2713aSLionel Sambuc InlineCommandComment *ICC;
1035f4a2713aSLionel Sambuc ASSERT_TRUE(GetChildAt(FC, 0, PC));
1036f4a2713aSLionel Sambuc
1037f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 2));
1038f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 0, " "));
1039f4a2713aSLionel Sambuc ASSERT_TRUE(HasInlineCommandAt(PC, Traits, 1, ICC, "c", "aaa"));
1040f4a2713aSLionel Sambuc }
1041f4a2713aSLionel Sambuc }
1042f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,InlineCommand4)1043f4a2713aSLionel Sambuc TEST_F(CommentParserTest, InlineCommand4) {
1044f4a2713aSLionel Sambuc const char *Source = "// \\c aaa bbb";
1045f4a2713aSLionel Sambuc
1046f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
1047f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 1));
1048f4a2713aSLionel Sambuc
1049f4a2713aSLionel Sambuc {
1050f4a2713aSLionel Sambuc ParagraphComment *PC;
1051f4a2713aSLionel Sambuc InlineCommandComment *ICC;
1052f4a2713aSLionel Sambuc ASSERT_TRUE(GetChildAt(FC, 0, PC));
1053f4a2713aSLionel Sambuc
1054f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 3));
1055f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 0, " "));
1056f4a2713aSLionel Sambuc ASSERT_TRUE(HasInlineCommandAt(PC, Traits, 1, ICC, "c", "aaa"));
1057f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 2, " bbb"));
1058f4a2713aSLionel Sambuc }
1059f4a2713aSLionel Sambuc }
1060f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,InlineCommand5)1061f4a2713aSLionel Sambuc TEST_F(CommentParserTest, InlineCommand5) {
1062f4a2713aSLionel Sambuc const char *Source = "// \\unknown aaa\n";
1063f4a2713aSLionel Sambuc
1064f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
1065f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 1));
1066f4a2713aSLionel Sambuc
1067f4a2713aSLionel Sambuc {
1068f4a2713aSLionel Sambuc ParagraphComment *PC;
1069f4a2713aSLionel Sambuc InlineCommandComment *ICC;
1070f4a2713aSLionel Sambuc ASSERT_TRUE(GetChildAt(FC, 0, PC));
1071f4a2713aSLionel Sambuc
1072f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 3));
1073f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 0, " "));
1074f4a2713aSLionel Sambuc ASSERT_TRUE(HasInlineCommandAt(PC, Traits, 1, ICC, "unknown", NoArgs()));
1075f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 2, " aaa"));
1076f4a2713aSLionel Sambuc }
1077f4a2713aSLionel Sambuc }
1078f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,HTML1)1079f4a2713aSLionel Sambuc TEST_F(CommentParserTest, HTML1) {
1080f4a2713aSLionel Sambuc const char *Sources[] = {
1081f4a2713aSLionel Sambuc "// <a",
1082f4a2713aSLionel Sambuc "// <a>",
1083f4a2713aSLionel Sambuc "// <a >"
1084f4a2713aSLionel Sambuc };
1085f4a2713aSLionel Sambuc
1086f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1087f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
1088f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 1));
1089f4a2713aSLionel Sambuc
1090f4a2713aSLionel Sambuc {
1091f4a2713aSLionel Sambuc ParagraphComment *PC;
1092f4a2713aSLionel Sambuc HTMLStartTagComment *HST;
1093f4a2713aSLionel Sambuc ASSERT_TRUE(GetChildAt(FC, 0, PC));
1094f4a2713aSLionel Sambuc
1095f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 2));
1096f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 0, " "));
1097f4a2713aSLionel Sambuc ASSERT_TRUE(HasHTMLStartTagAt(PC, 1, HST, "a", NoAttrs()));
1098f4a2713aSLionel Sambuc }
1099f4a2713aSLionel Sambuc }
1100f4a2713aSLionel Sambuc }
1101f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,HTML2)1102f4a2713aSLionel Sambuc TEST_F(CommentParserTest, HTML2) {
1103f4a2713aSLionel Sambuc const char *Sources[] = {
1104f4a2713aSLionel Sambuc "// <br/>",
1105f4a2713aSLionel Sambuc "// <br />"
1106f4a2713aSLionel Sambuc };
1107f4a2713aSLionel Sambuc
1108f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1109f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
1110f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 1));
1111f4a2713aSLionel Sambuc
1112f4a2713aSLionel Sambuc {
1113f4a2713aSLionel Sambuc ParagraphComment *PC;
1114f4a2713aSLionel Sambuc HTMLStartTagComment *HST;
1115f4a2713aSLionel Sambuc ASSERT_TRUE(GetChildAt(FC, 0, PC));
1116f4a2713aSLionel Sambuc
1117f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 2));
1118f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 0, " "));
1119f4a2713aSLionel Sambuc ASSERT_TRUE(HasHTMLStartTagAt(PC, 1, HST, "br", SelfClosing()));
1120f4a2713aSLionel Sambuc }
1121f4a2713aSLionel Sambuc }
1122f4a2713aSLionel Sambuc }
1123f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,HTML3)1124f4a2713aSLionel Sambuc TEST_F(CommentParserTest, HTML3) {
1125f4a2713aSLionel Sambuc const char *Sources[] = {
1126f4a2713aSLionel Sambuc "// <a href",
1127f4a2713aSLionel Sambuc "// <a href ",
1128f4a2713aSLionel Sambuc "// <a href>",
1129f4a2713aSLionel Sambuc "// <a href >",
1130f4a2713aSLionel Sambuc };
1131f4a2713aSLionel Sambuc
1132f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1133f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
1134f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 1));
1135f4a2713aSLionel Sambuc
1136f4a2713aSLionel Sambuc {
1137f4a2713aSLionel Sambuc ParagraphComment *PC;
1138f4a2713aSLionel Sambuc HTMLStartTagComment *HST;
1139f4a2713aSLionel Sambuc ASSERT_TRUE(GetChildAt(FC, 0, PC));
1140f4a2713aSLionel Sambuc
1141f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 2));
1142f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 0, " "));
1143f4a2713aSLionel Sambuc ASSERT_TRUE(HasHTMLStartTagAt(PC, 1, HST, "a", "href", ""));
1144f4a2713aSLionel Sambuc }
1145f4a2713aSLionel Sambuc }
1146f4a2713aSLionel Sambuc }
1147f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,HTML4)1148f4a2713aSLionel Sambuc TEST_F(CommentParserTest, HTML4) {
1149f4a2713aSLionel Sambuc const char *Sources[] = {
1150f4a2713aSLionel Sambuc "// <a href=\"bbb\"",
1151f4a2713aSLionel Sambuc "// <a href=\"bbb\">",
1152f4a2713aSLionel Sambuc };
1153f4a2713aSLionel Sambuc
1154f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1155f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
1156f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 1));
1157f4a2713aSLionel Sambuc
1158f4a2713aSLionel Sambuc {
1159f4a2713aSLionel Sambuc ParagraphComment *PC;
1160f4a2713aSLionel Sambuc HTMLStartTagComment *HST;
1161f4a2713aSLionel Sambuc ASSERT_TRUE(GetChildAt(FC, 0, PC));
1162f4a2713aSLionel Sambuc
1163f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 2));
1164f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 0, " "));
1165f4a2713aSLionel Sambuc ASSERT_TRUE(HasHTMLStartTagAt(PC, 1, HST, "a", "href", "bbb"));
1166f4a2713aSLionel Sambuc }
1167f4a2713aSLionel Sambuc }
1168f4a2713aSLionel Sambuc }
1169f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,HTML5)1170f4a2713aSLionel Sambuc TEST_F(CommentParserTest, HTML5) {
1171f4a2713aSLionel Sambuc const char *Sources[] = {
1172f4a2713aSLionel Sambuc "// </a",
1173f4a2713aSLionel Sambuc "// </a>",
1174f4a2713aSLionel Sambuc "// </a >"
1175f4a2713aSLionel Sambuc };
1176f4a2713aSLionel Sambuc
1177f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1178f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
1179f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 1));
1180f4a2713aSLionel Sambuc
1181f4a2713aSLionel Sambuc {
1182f4a2713aSLionel Sambuc ParagraphComment *PC;
1183f4a2713aSLionel Sambuc HTMLEndTagComment *HET;
1184f4a2713aSLionel Sambuc ASSERT_TRUE(GetChildAt(FC, 0, PC));
1185f4a2713aSLionel Sambuc
1186f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 2));
1187f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 0, " "));
1188f4a2713aSLionel Sambuc ASSERT_TRUE(HasHTMLEndTagAt(PC, 1, HET, "a"));
1189f4a2713aSLionel Sambuc }
1190f4a2713aSLionel Sambuc }
1191f4a2713aSLionel Sambuc }
1192f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,HTML6)1193f4a2713aSLionel Sambuc TEST_F(CommentParserTest, HTML6) {
1194f4a2713aSLionel Sambuc const char *Source =
1195f4a2713aSLionel Sambuc "// <pre>\n"
1196f4a2713aSLionel Sambuc "// Aaa\n"
1197f4a2713aSLionel Sambuc "// Bbb\n"
1198f4a2713aSLionel Sambuc "// </pre>\n";
1199f4a2713aSLionel Sambuc
1200f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
1201f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 1));
1202f4a2713aSLionel Sambuc
1203f4a2713aSLionel Sambuc {
1204f4a2713aSLionel Sambuc ParagraphComment *PC;
1205f4a2713aSLionel Sambuc HTMLStartTagComment *HST;
1206f4a2713aSLionel Sambuc HTMLEndTagComment *HET;
1207f4a2713aSLionel Sambuc ASSERT_TRUE(GetChildAt(FC, 0, PC));
1208f4a2713aSLionel Sambuc
1209f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 6));
1210f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 0, " "));
1211f4a2713aSLionel Sambuc ASSERT_TRUE(HasHTMLStartTagAt(PC, 1, HST, "pre", NoAttrs()));
1212f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextWithNewlineAt(PC, 2, " Aaa"));
1213f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextWithNewlineAt(PC, 3, " Bbb"));
1214f4a2713aSLionel Sambuc ASSERT_TRUE(HasTextAt(PC, 4, " "));
1215f4a2713aSLionel Sambuc ASSERT_TRUE(HasHTMLEndTagAt(PC, 5, HET, "pre"));
1216f4a2713aSLionel Sambuc }
1217f4a2713aSLionel Sambuc }
1218f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,VerbatimBlock1)1219f4a2713aSLionel Sambuc TEST_F(CommentParserTest, VerbatimBlock1) {
1220f4a2713aSLionel Sambuc const char *Source = "// \\verbatim\\endverbatim\n";
1221f4a2713aSLionel Sambuc
1222f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
1223f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
1224f4a2713aSLionel Sambuc
1225f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
1226f4a2713aSLionel Sambuc {
1227f4a2713aSLionel Sambuc VerbatimBlockComment *VCC;
1228f4a2713aSLionel Sambuc ASSERT_TRUE(HasVerbatimBlockAt(FC, Traits, 1, VCC,
1229f4a2713aSLionel Sambuc "verbatim", "endverbatim",
1230f4a2713aSLionel Sambuc NoLines()));
1231f4a2713aSLionel Sambuc }
1232f4a2713aSLionel Sambuc }
1233f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,VerbatimBlock2)1234f4a2713aSLionel Sambuc TEST_F(CommentParserTest, VerbatimBlock2) {
1235f4a2713aSLionel Sambuc const char *Source = "// \\verbatim Aaa \\endverbatim\n";
1236f4a2713aSLionel Sambuc
1237f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
1238f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
1239f4a2713aSLionel Sambuc
1240f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
1241f4a2713aSLionel Sambuc {
1242f4a2713aSLionel Sambuc VerbatimBlockComment *VBC;
1243f4a2713aSLionel Sambuc ASSERT_TRUE(HasVerbatimBlockAt(FC, Traits, 1, VBC,
1244f4a2713aSLionel Sambuc "verbatim", "endverbatim",
1245f4a2713aSLionel Sambuc Lines(), " Aaa "));
1246f4a2713aSLionel Sambuc }
1247f4a2713aSLionel Sambuc }
1248f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,VerbatimBlock3)1249f4a2713aSLionel Sambuc TEST_F(CommentParserTest, VerbatimBlock3) {
1250f4a2713aSLionel Sambuc const char *Source = "// \\verbatim Aaa\n";
1251f4a2713aSLionel Sambuc
1252f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
1253f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
1254f4a2713aSLionel Sambuc
1255f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
1256f4a2713aSLionel Sambuc {
1257f4a2713aSLionel Sambuc VerbatimBlockComment *VBC;
1258f4a2713aSLionel Sambuc ASSERT_TRUE(HasVerbatimBlockAt(FC, Traits, 1, VBC, "verbatim", "",
1259f4a2713aSLionel Sambuc Lines(), " Aaa"));
1260f4a2713aSLionel Sambuc }
1261f4a2713aSLionel Sambuc }
1262f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,VerbatimBlock4)1263f4a2713aSLionel Sambuc TEST_F(CommentParserTest, VerbatimBlock4) {
1264f4a2713aSLionel Sambuc const char *Source =
1265f4a2713aSLionel Sambuc "//\\verbatim\n"
1266f4a2713aSLionel Sambuc "//\\endverbatim\n";
1267f4a2713aSLionel Sambuc
1268f4a2713aSLionel Sambuc FullComment *FC = parseString(Source);
1269f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 1));
1270f4a2713aSLionel Sambuc
1271f4a2713aSLionel Sambuc {
1272f4a2713aSLionel Sambuc VerbatimBlockComment *VBC;
1273f4a2713aSLionel Sambuc ASSERT_TRUE(HasVerbatimBlockAt(FC, Traits, 0, VBC,
1274f4a2713aSLionel Sambuc "verbatim", "endverbatim",
1275f4a2713aSLionel Sambuc NoLines()));
1276f4a2713aSLionel Sambuc }
1277f4a2713aSLionel Sambuc }
1278f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,VerbatimBlock5)1279f4a2713aSLionel Sambuc TEST_F(CommentParserTest, VerbatimBlock5) {
1280f4a2713aSLionel Sambuc const char *Sources[] = {
1281f4a2713aSLionel Sambuc "//\\verbatim\n"
1282f4a2713aSLionel Sambuc "// Aaa\n"
1283f4a2713aSLionel Sambuc "//\\endverbatim\n",
1284f4a2713aSLionel Sambuc
1285f4a2713aSLionel Sambuc "/*\\verbatim\n"
1286f4a2713aSLionel Sambuc " * Aaa\n"
1287f4a2713aSLionel Sambuc " *\\endverbatim*/"
1288f4a2713aSLionel Sambuc };
1289f4a2713aSLionel Sambuc
1290f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1291f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
1292f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 1));
1293f4a2713aSLionel Sambuc
1294f4a2713aSLionel Sambuc {
1295f4a2713aSLionel Sambuc VerbatimBlockComment *VBC;
1296f4a2713aSLionel Sambuc ASSERT_TRUE(HasVerbatimBlockAt(FC, Traits, 0, VBC,
1297f4a2713aSLionel Sambuc "verbatim", "endverbatim",
1298f4a2713aSLionel Sambuc Lines(), " Aaa"));
1299f4a2713aSLionel Sambuc }
1300f4a2713aSLionel Sambuc }
1301f4a2713aSLionel Sambuc }
1302f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,VerbatimBlock6)1303f4a2713aSLionel Sambuc TEST_F(CommentParserTest, VerbatimBlock6) {
1304f4a2713aSLionel Sambuc const char *Sources[] = {
1305f4a2713aSLionel Sambuc "// \\verbatim\n"
1306f4a2713aSLionel Sambuc "// Aaa\n"
1307f4a2713aSLionel Sambuc "// \\endverbatim\n",
1308f4a2713aSLionel Sambuc
1309f4a2713aSLionel Sambuc "/* \\verbatim\n"
1310f4a2713aSLionel Sambuc " * Aaa\n"
1311f4a2713aSLionel Sambuc " * \\endverbatim*/"
1312f4a2713aSLionel Sambuc };
1313f4a2713aSLionel Sambuc
1314f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1315f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
1316f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
1317f4a2713aSLionel Sambuc
1318f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
1319f4a2713aSLionel Sambuc {
1320f4a2713aSLionel Sambuc VerbatimBlockComment *VBC;
1321f4a2713aSLionel Sambuc ASSERT_TRUE(HasVerbatimBlockAt(FC, Traits, 1, VBC,
1322f4a2713aSLionel Sambuc "verbatim", "endverbatim",
1323f4a2713aSLionel Sambuc Lines(), " Aaa"));
1324f4a2713aSLionel Sambuc }
1325f4a2713aSLionel Sambuc }
1326f4a2713aSLionel Sambuc }
1327f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,VerbatimBlock7)1328f4a2713aSLionel Sambuc TEST_F(CommentParserTest, VerbatimBlock7) {
1329f4a2713aSLionel Sambuc const char *Sources[] = {
1330f4a2713aSLionel Sambuc "// \\verbatim\n"
1331f4a2713aSLionel Sambuc "// Aaa\n"
1332f4a2713aSLionel Sambuc "// Bbb\n"
1333f4a2713aSLionel Sambuc "// \\endverbatim\n",
1334f4a2713aSLionel Sambuc
1335f4a2713aSLionel Sambuc "/* \\verbatim\n"
1336f4a2713aSLionel Sambuc " * Aaa\n"
1337f4a2713aSLionel Sambuc " * Bbb\n"
1338f4a2713aSLionel Sambuc " * \\endverbatim*/"
1339f4a2713aSLionel Sambuc };
1340f4a2713aSLionel Sambuc
1341f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1342f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
1343f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
1344f4a2713aSLionel Sambuc
1345f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
1346f4a2713aSLionel Sambuc {
1347f4a2713aSLionel Sambuc VerbatimBlockComment *VBC;
1348f4a2713aSLionel Sambuc ASSERT_TRUE(HasVerbatimBlockAt(FC, Traits, 1, VBC,
1349f4a2713aSLionel Sambuc "verbatim", "endverbatim",
1350f4a2713aSLionel Sambuc Lines(), " Aaa", " Bbb"));
1351f4a2713aSLionel Sambuc }
1352f4a2713aSLionel Sambuc }
1353f4a2713aSLionel Sambuc }
1354f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,VerbatimBlock8)1355f4a2713aSLionel Sambuc TEST_F(CommentParserTest, VerbatimBlock8) {
1356f4a2713aSLionel Sambuc const char *Sources[] = {
1357f4a2713aSLionel Sambuc "// \\verbatim\n"
1358f4a2713aSLionel Sambuc "// Aaa\n"
1359f4a2713aSLionel Sambuc "//\n"
1360f4a2713aSLionel Sambuc "// Bbb\n"
1361f4a2713aSLionel Sambuc "// \\endverbatim\n",
1362f4a2713aSLionel Sambuc
1363f4a2713aSLionel Sambuc "/* \\verbatim\n"
1364f4a2713aSLionel Sambuc " * Aaa\n"
1365f4a2713aSLionel Sambuc " *\n"
1366f4a2713aSLionel Sambuc " * Bbb\n"
1367f4a2713aSLionel Sambuc " * \\endverbatim*/"
1368f4a2713aSLionel Sambuc };
1369f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1370f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
1371f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
1372f4a2713aSLionel Sambuc
1373f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
1374f4a2713aSLionel Sambuc {
1375f4a2713aSLionel Sambuc VerbatimBlockComment *VBC;
1376f4a2713aSLionel Sambuc ASSERT_TRUE(HasVerbatimBlockAt(FC, Traits, 1, VBC,
1377f4a2713aSLionel Sambuc "verbatim", "endverbatim"));
1378f4a2713aSLionel Sambuc ASSERT_EQ(3U, VBC->getNumLines());
1379f4a2713aSLionel Sambuc ASSERT_EQ(" Aaa", VBC->getText(0));
1380f4a2713aSLionel Sambuc ASSERT_EQ("", VBC->getText(1));
1381f4a2713aSLionel Sambuc ASSERT_EQ(" Bbb", VBC->getText(2));
1382f4a2713aSLionel Sambuc }
1383f4a2713aSLionel Sambuc }
1384f4a2713aSLionel Sambuc }
1385f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,VerbatimLine1)1386f4a2713aSLionel Sambuc TEST_F(CommentParserTest, VerbatimLine1) {
1387f4a2713aSLionel Sambuc const char *Sources[] = {
1388f4a2713aSLionel Sambuc "// \\fn",
1389f4a2713aSLionel Sambuc "// \\fn\n"
1390f4a2713aSLionel Sambuc };
1391f4a2713aSLionel Sambuc
1392f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1393f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
1394f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
1395f4a2713aSLionel Sambuc
1396f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
1397f4a2713aSLionel Sambuc {
1398f4a2713aSLionel Sambuc VerbatimLineComment *VLC;
1399f4a2713aSLionel Sambuc ASSERT_TRUE(HasVerbatimLineAt(FC, Traits, 1, VLC, "fn", ""));
1400f4a2713aSLionel Sambuc }
1401f4a2713aSLionel Sambuc }
1402f4a2713aSLionel Sambuc }
1403f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,VerbatimLine2)1404f4a2713aSLionel Sambuc TEST_F(CommentParserTest, VerbatimLine2) {
1405f4a2713aSLionel Sambuc const char *Sources[] = {
1406f4a2713aSLionel Sambuc "/// \\fn void *foo(const char *zzz = \"\\$\");\n//",
1407f4a2713aSLionel Sambuc "/** \\fn void *foo(const char *zzz = \"\\$\");*/"
1408f4a2713aSLionel Sambuc };
1409f4a2713aSLionel Sambuc
1410f4a2713aSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1411f4a2713aSLionel Sambuc FullComment *FC = parseString(Sources[i]);
1412f4a2713aSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
1413f4a2713aSLionel Sambuc
1414f4a2713aSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
1415f4a2713aSLionel Sambuc {
1416f4a2713aSLionel Sambuc VerbatimLineComment *VLC;
1417f4a2713aSLionel Sambuc ASSERT_TRUE(HasVerbatimLineAt(FC, Traits, 1, VLC, "fn",
1418f4a2713aSLionel Sambuc " void *foo(const char *zzz = \"\\$\");"));
1419f4a2713aSLionel Sambuc }
1420f4a2713aSLionel Sambuc }
1421f4a2713aSLionel Sambuc }
1422f4a2713aSLionel Sambuc
TEST_F(CommentParserTest,Deprecated)1423*0a6a1f1dSLionel Sambuc TEST_F(CommentParserTest, Deprecated) {
1424*0a6a1f1dSLionel Sambuc const char *Sources[] = {
1425*0a6a1f1dSLionel Sambuc "/** @deprecated*/",
1426*0a6a1f1dSLionel Sambuc "/// @deprecated\n"
1427*0a6a1f1dSLionel Sambuc };
1428*0a6a1f1dSLionel Sambuc
1429*0a6a1f1dSLionel Sambuc for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
1430*0a6a1f1dSLionel Sambuc FullComment *FC = parseString(Sources[i]);
1431*0a6a1f1dSLionel Sambuc ASSERT_TRUE(HasChildCount(FC, 2));
1432*0a6a1f1dSLionel Sambuc
1433*0a6a1f1dSLionel Sambuc ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
1434*0a6a1f1dSLionel Sambuc {
1435*0a6a1f1dSLionel Sambuc BlockCommandComment *BCC;
1436*0a6a1f1dSLionel Sambuc ParagraphComment *PC;
1437*0a6a1f1dSLionel Sambuc ASSERT_TRUE(HasBlockCommandAt(FC, Traits, 1, BCC, "deprecated", PC));
1438*0a6a1f1dSLionel Sambuc ASSERT_TRUE(HasChildCount(PC, 0));
1439*0a6a1f1dSLionel Sambuc }
1440*0a6a1f1dSLionel Sambuc }
1441*0a6a1f1dSLionel Sambuc }
1442*0a6a1f1dSLionel Sambuc
1443f4a2713aSLionel Sambuc } // unnamed namespace
1444f4a2713aSLionel Sambuc
1445f4a2713aSLionel Sambuc } // end namespace comments
1446f4a2713aSLionel Sambuc } // end namespace clang
1447f4a2713aSLionel Sambuc
1448