@@ -21,19 +21,33 @@ pub enum Token<'src> {
2121 Else ,
2222
2323 // Control symbols
24+ /// `->``
2425 Arrow ,
26+ /// `:`
2527 Colon ,
28+ /// `;`
2629 Semi ,
30+ /// `,`
2731 Comma ,
32+ /// `=`
2833 Eq ,
34+ /// `=>`
2935 FatArrow ,
36+ /// `(`
3037 LParen ,
38+ /// `)`
3139 RParen ,
40+ /// `[`
3241 LBracket ,
42+ /// `]`
3343 RBracket ,
44+ /// `{`
3445 LBrace ,
46+ /// `}`
3547 RBrace ,
48+ /// `<`
3649 LAngle ,
50+ /// `>`
3751 RAngle ,
3852
3953 // Number literals
@@ -257,29 +271,86 @@ mod tests {
257271 ( tokens, errors)
258272 }
259273
274+ /// Helper function to get the variant name of a token
275+ fn variant_name ( token : & Token ) -> & ' static str {
276+ match token {
277+ Token :: Fn => "Fn" ,
278+ Token :: Let => "Let" ,
279+ Token :: Type => "Type" ,
280+ Token :: Mod => "Mod" ,
281+ Token :: Const => "Const" ,
282+ Token :: Match => "Match" ,
283+ Token :: If => "If" ,
284+ Token :: Else => "Else" ,
285+ Token :: Arrow => "Arrow" ,
286+ Token :: Colon => "Colon" ,
287+ Token :: Semi => "Semi" ,
288+ Token :: Comma => "Comma" ,
289+ Token :: Eq => "Eq" ,
290+ Token :: FatArrow => "FatArrow" ,
291+ Token :: LParen => "LParen" ,
292+ Token :: RParen => "RParen" ,
293+ Token :: LBracket => "LBracket" ,
294+ Token :: RBracket => "RBracket" ,
295+ Token :: LBrace => "LBrace" ,
296+ Token :: RBrace => "RBrace" ,
297+ Token :: LAngle => "LAngle" ,
298+ Token :: RAngle => "RAngle" ,
299+ Token :: DecLiteral ( _) => "DecLiteral" ,
300+ Token :: HexLiteral ( _) => "HexLiteral" ,
301+ Token :: BinLiteral ( _) => "BinLiteral" ,
302+ Token :: Bool ( _) => "Bool" ,
303+ Token :: Ident ( _) => "Ident" ,
304+ Token :: Jet ( _) => "Jet" ,
305+ Token :: Witness ( _) => "Witness" ,
306+ Token :: Param ( _) => "Param" ,
307+ Token :: Macro ( _) => "Macro" ,
308+ Token :: Comment => "Comment" ,
309+ Token :: BlockComment => "BlockComment" ,
310+ }
311+ }
312+
313+ /// Macro to assert that a sequence of tokens matches the expected variant types
314+ macro_rules! assert_tokens_match {
315+ ( $tokens: expr, $( $expected: ident) ,* $( , ) ?) => {
316+ {
317+ let tokens = $tokens. as_ref( ) . expect( "Expected Some tokens" ) ;
318+ let expected_variants = vec![ $( stringify!( $expected) ) ,* ] ;
319+
320+ assert_eq!(
321+ tokens. len( ) ,
322+ expected_variants. len( ) ,
323+ "Expected {} tokens, got {}.\n Tokens: {:?}" ,
324+ expected_variants. len( ) ,
325+ tokens. len( ) ,
326+ tokens
327+ ) ;
328+
329+ for ( idx, ( token, expected_variant) ) in tokens. iter( ) . zip( expected_variants. iter( ) ) . enumerate( ) {
330+ let actual_variant = variant_name( token) ;
331+ assert_eq!(
332+ actual_variant,
333+ * expected_variant,
334+ "Token at index {} does not match: expected {}, got {} (token: {:?})" ,
335+ idx,
336+ expected_variant,
337+ actual_variant,
338+ token
339+ ) ;
340+ }
341+ }
342+ } ;
343+ }
344+
260345 #[ test]
261346 fn test_if_statement ( ) {
262347 let input = "if true {0} else {1};" ;
263348 let ( tokens, errors) = lex ( input) ;
264349 assert ! ( errors. is_empty( ) , "Expected no errors, found: {:?}" , errors) ;
265350
266- assert_eq ! (
267- tokens,
268- Some ( vec![
269- Token :: If ,
270- Token :: Bool ( true , ) ,
271- Token :: LBrace ,
272- Token :: DecLiteral ( Decimal ( Arc :: new( "0" ) ) ) ,
273- Token :: RBrace ,
274- Token :: Else ,
275- Token :: LBrace ,
276- Token :: DecLiteral ( Decimal ( Arc :: new( "1" ) ) ) ,
277- Token :: RBrace ,
278- Token :: Semi ,
279- ] )
351+ assert_tokens_match ! (
352+ tokens, If , Bool , LBrace , DecLiteral , RBrace , Else , LBrace , DecLiteral , RBrace , Semi ,
280353 ) ;
281- dbg ! ( tokens) ;
282- todo ! ( "Finish" ) ;
283354 }
284355
285356 #[ test]
0 commit comments