@@ -91,12 +91,19 @@ class ParseHLSLRootSignatureTest : public ::testing::Test {
9191 return PP;
9292 }
9393
94- void CheckTokens (SmallVector<hlsl::RootSignatureToken> &Computed,
94+ void CheckTokens (hlsl::RootSignatureLexer &Lexer,
95+ SmallVector<hlsl::RootSignatureToken> &Computed,
9596 SmallVector<hlsl::TokenKind> &Expected) {
96- ASSERT_EQ (Computed.size (), Expected.size ());
9797 for (unsigned I = 0 , E = Expected.size (); I != E; ++I) {
98- ASSERT_EQ (Computed[I].Kind , Expected[I]);
98+ if (Expected[I] == hlsl::TokenKind::invalid ||
99+ Expected[I] == hlsl::TokenKind::end_of_stream)
100+ continue ;
101+ ASSERT_FALSE (Lexer.ConsumeToken ());
102+ hlsl::RootSignatureToken Result = Lexer.GetCurToken ();
103+ ASSERT_EQ (Result.Kind , Expected[I]);
104+ Computed.push_back (Result);
99105 }
106+ ASSERT_TRUE (Lexer.EndOfBuffer ());
100107 }
101108
102109 FileSystemOptions FileMgrOpts;
@@ -128,16 +135,14 @@ TEST_F(ParseHLSLRootSignatureTest, ValidLexNumbersTest) {
128135 hlsl::RootSignatureLexer Lexer (Source, TokLoc, *PP);
129136
130137 SmallVector<hlsl::RootSignatureToken> Tokens;
131- ASSERT_FALSE (Lexer.Lex (Tokens));
132- ASSERT_TRUE (Consumer->IsSatisfied ());
133-
134138 SmallVector<hlsl::TokenKind> Expected = {
135139 hlsl::TokenKind::int_literal,
136140 hlsl::TokenKind::int_literal,
137141 hlsl::TokenKind::int_literal,
138142 hlsl::TokenKind::int_literal,
139143 };
140- CheckTokens (Tokens, Expected);
144+ CheckTokens (Lexer, Tokens, Expected);
145+ ASSERT_TRUE (Consumer->IsSatisfied ());
141146
142147 // Sample negative int
143148 hlsl::RootSignatureToken IntToken = Tokens[0 ];
@@ -204,23 +209,77 @@ TEST_F(ParseHLSLRootSignatureTest, ValidLexAllTokensTest) {
204209
205210 hlsl::RootSignatureLexer Lexer (Source, TokLoc, *PP);
206211
207- SmallVector<hlsl::RootSignatureToken> Tokens = {
208- hlsl::RootSignatureToken (
209- SourceLocation ()) // invalid token for completeness
210- };
211- ASSERT_FALSE (Lexer.Lex (Tokens));
212- ASSERT_TRUE (Consumer->IsSatisfied ());
213-
212+ SmallVector<hlsl::RootSignatureToken> Tokens;
214213 SmallVector<hlsl::TokenKind> Expected = {
215214#define TOK (NAME ) hlsl::TokenKind::NAME,
216215#include " clang/Parse/HLSLRootSignatureTokenKinds.def"
217216 };
218217
219- CheckTokens (Tokens, Expected);
218+ CheckTokens (Lexer, Tokens, Expected);
219+ ASSERT_TRUE (Consumer->IsSatisfied ());
220+ }
221+
222+ TEST_F (ParseHLSLRootSignatureTest, ValidLexPeekTest) {
223+ // This test will check that we can lex all defined tokens as defined in
224+ // HLSLRootSignatureTokenKinds.def, plus some additional integer variations
225+ const llvm::StringLiteral Source = R"cc(
226+ )1
227+ )cc" ;
228+
229+ TrivialModuleLoader ModLoader;
230+ auto PP = CreatePP (Source, ModLoader);
231+ auto TokLoc = SourceLocation ();
232+
233+ // Test no diagnostics produced
234+ Consumer->SetNoDiag ();
235+
236+ hlsl::RootSignatureLexer Lexer (Source, TokLoc, *PP);
237+ // Test basic peek
238+ auto Res = Lexer.PeekNextToken ();
239+ ASSERT_TRUE (Res.has_value ());
240+ ASSERT_EQ (Res->Kind , hlsl::TokenKind::pu_r_paren);
241+
242+ // Ensure it doesn't peek past one element
243+ Res = Lexer.PeekNextToken ();
244+ ASSERT_TRUE (Res.has_value ());
245+ ASSERT_EQ (Res->Kind , hlsl::TokenKind::pu_r_paren);
246+
247+ ASSERT_FALSE (Lexer.ConsumeToken ());
248+
249+ // Invoke after reseting the NextToken
250+ Res = Lexer.PeekNextToken ();
251+ ASSERT_TRUE (Res.has_value ());
252+ ASSERT_EQ (Res->Kind , hlsl::TokenKind::int_literal);
253+
254+ // Ensure we can still consume the second token
255+ ASSERT_FALSE (Lexer.ConsumeToken ());
256+
257+ // Ensure no error raised when peeking past end of stream
258+ Res = Lexer.PeekNextToken ();
259+ ASSERT_TRUE (Res.has_value ());
260+ ASSERT_EQ (Res->Kind , hlsl::TokenKind::end_of_stream);
261+
262+ ASSERT_TRUE (Consumer->IsSatisfied ());
220263}
221264
222265// Invalid Lexing Tests
223266
267+ TEST_F (ParseHLSLRootSignatureTest, InvalidParseUnexpectedEOSTest) {
268+ const llvm::StringLiteral Source = R"cc( )cc" ;
269+
270+ TrivialModuleLoader ModLoader;
271+ auto PP = CreatePP (Source, ModLoader);
272+ auto TokLoc = SourceLocation ();
273+
274+ hlsl::RootSignatureLexer Lexer (Source, TokLoc, *PP);
275+
276+ // Test correct diagnostic produced
277+ Consumer->SetExpected (diag::err_hlsl_rootsig_unexpected_eos);
278+ ASSERT_TRUE (Lexer.ConsumeToken ());
279+
280+ ASSERT_TRUE (Consumer->IsSatisfied ());
281+ }
282+
224283TEST_F (ParseHLSLRootSignatureTest, InvalidLexOverflowedNumberTest) {
225284 // This test will check that the lexing fails due to an integer overflow
226285 const llvm::StringLiteral Source = R"cc(
@@ -236,8 +295,7 @@ TEST_F(ParseHLSLRootSignatureTest, InvalidLexOverflowedNumberTest) {
236295
237296 hlsl::RootSignatureLexer Lexer (Source, TokLoc, *PP);
238297
239- SmallVector<hlsl::RootSignatureToken> Tokens;
240- ASSERT_TRUE (Lexer.Lex (Tokens));
298+ ASSERT_TRUE (Lexer.ConsumeToken ());
241299 ASSERT_TRUE (Consumer->IsSatisfied ());
242300}
243301
@@ -256,8 +314,7 @@ TEST_F(ParseHLSLRootSignatureTest, InvalidLexEmptyNumberTest) {
256314
257315 hlsl::RootSignatureLexer Lexer (Source, TokLoc, *PP);
258316
259- SmallVector<hlsl::RootSignatureToken> Tokens;
260- ASSERT_TRUE (Lexer.Lex (Tokens));
317+ ASSERT_TRUE (Lexer.ConsumeToken ());
261318 ASSERT_TRUE (Consumer->IsSatisfied ());
262319}
263320
@@ -276,9 +333,8 @@ TEST_F(ParseHLSLRootSignatureTest, InvalidLexRegNumberTest) {
276333
277334 hlsl::RootSignatureLexer Lexer (Source, TokLoc, *PP);
278335
279- SmallVector<hlsl::RootSignatureToken> Tokens;
280- ASSERT_TRUE (Lexer.Lex (Tokens));
281- // FIXME(#120472): This should be TRUE once we can lex a floating
336+ ASSERT_TRUE (Lexer.ConsumeToken ());
337+ // FIXME(#126565): This should be TRUE once we can lex a float
282338 ASSERT_FALSE (Consumer->IsSatisfied ());
283339}
284340
@@ -297,8 +353,7 @@ TEST_F(ParseHLSLRootSignatureTest, InvalidLexIdentifierTest) {
297353
298354 hlsl::RootSignatureLexer Lexer (Source, TokLoc, *PP);
299355
300- SmallVector<hlsl::RootSignatureToken> Tokens;
301- ASSERT_TRUE (Lexer.Lex (Tokens));
356+ ASSERT_TRUE (Lexer.ConsumeToken ());
302357 ASSERT_TRUE (Consumer->IsSatisfied ());
303358}
304359
0 commit comments