Use error's description for snapshot assertions + sort reported expected tokens
Turns out the snapshot test would randomly fail because the expected tokens are a HashSet, which is unordered by construction. So, using the auto-derived `Debug` instance to compare it with snapshot would only succeed if the tokens happened to be in the same order in the HashSet, which only happens by accident. Signed-off-by: KtorZ <matthias.benkort@gmail.com>
This commit is contained in:
		
							parent
							
								
									eadbc60a72
								
							
						
					
					
						commit
						862fc490c1
					
				|  | @ -3,6 +3,7 @@ use crate::{ | ||||||
|     parser::token::Token, |     parser::token::Token, | ||||||
| }; | }; | ||||||
| use indoc::formatdoc; | use indoc::formatdoc; | ||||||
|  | use itertools::Itertools; | ||||||
| use miette::Diagnostic; | use miette::Diagnostic; | ||||||
| use owo_colors::{OwoColorize, Stream::Stdout}; | use owo_colors::{OwoColorize, Stream::Stdout}; | ||||||
| use std::collections::HashSet; | use std::collections::HashSet; | ||||||
|  | @ -18,6 +19,7 @@ use std::collections::HashSet; | ||||||
|                     "I am looking for one of the following patterns:\n{}", |                     "I am looking for one of the following patterns:\n{}", | ||||||
|                     expected |                     expected | ||||||
|                         .iter() |                         .iter() | ||||||
|  |                         .sorted() | ||||||
|                         .map(|x| format!( |                         .map(|x| format!( | ||||||
|                             "→ {}", |                             "→ {}", | ||||||
|                             x.to_aiken() |                             x.to_aiken() | ||||||
|  | @ -320,7 +322,7 @@ fn fmt_unknown_curve(curve: &String, point: &Option<String>) -> String { | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone, PartialEq, Eq, Hash, Diagnostic, thiserror::Error)] | #[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Diagnostic, thiserror::Error)] | ||||||
| pub enum Pattern { | pub enum Pattern { | ||||||
|     #[error("I found an unexpected char '{0:?}'.")] |     #[error("I found an unexpected char '{0:?}'.")] | ||||||
|     #[diagnostic(help("Try removing it!"))] |     #[diagnostic(help("Try removing it!"))] | ||||||
|  |  | ||||||
|  | @ -2,14 +2,4 @@ | ||||||
| source: crates/aiken-lang/src/parser/expr/assignment.rs | source: crates/aiken-lang/src/parser/expr/assignment.rs | ||||||
| description: "Invalid code (parse error):\n\nlet a =\n// foo\nlet b = 42\n" | description: "Invalid code (parse error):\n\nlet a =\n// foo\nlet b = 42\n" | ||||||
| --- | --- | ||||||
| [ | I spotted an unfinished assignment. | ||||||
|     ParseError { |  | ||||||
|         kind: UnfinishedAssignmentRightHandSide, |  | ||||||
|         span: 0..25, |  | ||||||
|         while_parsing: None, |  | ||||||
|         expected: {}, |  | ||||||
|         label: Some( |  | ||||||
|             "invalid assignment right-hand side", |  | ||||||
|         ), |  | ||||||
|     }, |  | ||||||
| ] |  | ||||||
|  |  | ||||||
|  | @ -2,71 +2,4 @@ | ||||||
| source: crates/aiken-lang/src/parser/expr/fail_todo_trace.rs | source: crates/aiken-lang/src/parser/expr/fail_todo_trace.rs | ||||||
| description: "Invalid code (parse error):\n\nlet debug = fn() {\n  trace \"foo\":\n}\n" | description: "Invalid code (parse error):\n\nlet debug = fn() {\n  trace \"foo\":\n}\n" | ||||||
| --- | --- | ||||||
| [ | I found an unexpected token '}'. | ||||||
|     ParseError { |  | ||||||
|         kind: Unexpected( |  | ||||||
|             Token( |  | ||||||
|                 RightBrace, |  | ||||||
|             ), |  | ||||||
|         ), |  | ||||||
|         span: 34..35, |  | ||||||
|         while_parsing: None, |  | ||||||
|         expected: { |  | ||||||
|             Token( |  | ||||||
|                 If, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 Expect, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 Minus, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 When, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 And, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 Or, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 LeftParen, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 Todo, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 LeftSquare, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 NewLineMinus, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 Bang, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 Fail, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 NewLineLeftParen, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 LeftBrace, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 Trace, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 Let, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 Hash, |  | ||||||
|             ), |  | ||||||
|             Token( |  | ||||||
|                 Fn, |  | ||||||
|             ), |  | ||||||
|         }, |  | ||||||
|         label: None, |  | ||||||
|     }, |  | ||||||
| ] |  | ||||||
|  |  | ||||||
|  | @ -2,14 +2,4 @@ | ||||||
| source: crates/aiken-lang/src/parser/expr/when/mod.rs | source: crates/aiken-lang/src/parser/expr/when/mod.rs | ||||||
| description: "Invalid code (parse error):\n\nwhen a is {\n  2 if x > 1 -> 3\n  _ -> 1\n}\n" | description: "Invalid code (parse error):\n\nwhen a is {\n  2 if x > 1 -> 3\n  _ -> 1\n}\n" | ||||||
| --- | --- | ||||||
| [ | I found a now-deprecated clause guard in a when/is expression. | ||||||
|     ParseError { |  | ||||||
|         kind: DeprecatedWhenClause, |  | ||||||
|         span: 14..29, |  | ||||||
|         while_parsing: None, |  | ||||||
|         expected: {}, |  | ||||||
|         label: Some( |  | ||||||
|             "deprecated", |  | ||||||
|         ), |  | ||||||
|     }, |  | ||||||
| ] |  | ||||||
|  |  | ||||||
|  | @ -2,14 +2,4 @@ | ||||||
| source: crates/aiken-lang/src/parser/pattern/bytearray.rs | source: crates/aiken-lang/src/parser/pattern/bytearray.rs | ||||||
| description: "Invalid code (parse error):\n\nwhen foo is {\n    #<Bls12_381, G1>\"950dfd33da2682260c76038dfb8bad6e84ae9d599a3c151815945ac1e6ef6b1027cd917f3907479d20d636ce437a41f5\" -> False\n    _ -> True\n}\n" | description: "Invalid code (parse error):\n\nwhen foo is {\n    #<Bls12_381, G1>\"950dfd33da2682260c76038dfb8bad6e84ae9d599a3c151815945ac1e6ef6b1027cd917f3907479d20d636ce437a41f5\" -> False\n    _ -> True\n}\n" | ||||||
| --- | --- | ||||||
| [ | I choked on a curve point in a bytearray pattern. | ||||||
|     ParseError { |  | ||||||
|         kind: PatternMatchOnCurvePoint, |  | ||||||
|         span: 18..132, |  | ||||||
|         while_parsing: None, |  | ||||||
|         expected: {}, |  | ||||||
|         label: Some( |  | ||||||
|             "cannot pattern-match on curve point", |  | ||||||
|         ), |  | ||||||
|     }, |  | ||||||
| ] |  | ||||||
|  |  | ||||||
|  | @ -2,14 +2,4 @@ | ||||||
| source: crates/aiken-lang/src/parser/pattern/bytearray.rs | source: crates/aiken-lang/src/parser/pattern/bytearray.rs | ||||||
| description: "Invalid code (parse error):\n\nwhen foo is {\n    #<Bls12_381, G2>\"b0629fa1158c2d23a10413fe91d381a84d25e31d041cd0377d25828498fd02011b35893938ced97535395e4815201e67108bcd4665e0db25d602d76fa791fab706c54abf5e1a9e44b4ac1e6badf3d2ac0328f5e30be341677c8bac5dda7682f1\" -> False\n    _ -> True\n}\n" | description: "Invalid code (parse error):\n\nwhen foo is {\n    #<Bls12_381, G2>\"b0629fa1158c2d23a10413fe91d381a84d25e31d041cd0377d25828498fd02011b35893938ced97535395e4815201e67108bcd4665e0db25d602d76fa791fab706c54abf5e1a9e44b4ac1e6badf3d2ac0328f5e30be341677c8bac5dda7682f1\" -> False\n    _ -> True\n}\n" | ||||||
| --- | --- | ||||||
| [ | I choked on a curve point in a bytearray pattern. | ||||||
|     ParseError { |  | ||||||
|         kind: PatternMatchOnCurvePoint, |  | ||||||
|         span: 18..228, |  | ||||||
|         while_parsing: None, |  | ||||||
|         expected: {}, |  | ||||||
|         label: Some( |  | ||||||
|             "cannot pattern-match on curve point", |  | ||||||
|         ), |  | ||||||
|     }, |  | ||||||
| ] |  | ||||||
|  |  | ||||||
|  | @ -2,14 +2,4 @@ | ||||||
| source: crates/aiken-lang/src/parser/pattern/string.rs | source: crates/aiken-lang/src/parser/pattern/string.rs | ||||||
| description: "Invalid code (parse error):\n\nwhen foo is {\n  @\"foo\" -> True\n}\n" | description: "Invalid code (parse error):\n\nwhen foo is {\n  @\"foo\" -> True\n}\n" | ||||||
| --- | --- | ||||||
| [ | I refuse to cooperate and match a utf-8 string. | ||||||
|     ParseError { |  | ||||||
|         kind: PatternMatchOnString, |  | ||||||
|         span: 16..22, |  | ||||||
|         while_parsing: None, |  | ||||||
|         expected: {}, |  | ||||||
|         label: Some( |  | ||||||
|             "cannot pattern-match on string", |  | ||||||
|         ), |  | ||||||
|     }, |  | ||||||
| ] |  | ||||||
|  |  | ||||||
|  | @ -1,12 +1,14 @@ | ||||||
| use std::fmt; | use std::fmt; | ||||||
| 
 | 
 | ||||||
| #[derive(Clone, Debug, PartialEq, Hash, Eq, Copy, serde::Serialize, serde::Deserialize)] | #[derive(
 | ||||||
|  |     Clone, Debug, PartialEq, PartialOrd, Ord, Hash, Eq, Copy, serde::Serialize, serde::Deserialize, | ||||||
|  | )] | ||||||
| pub enum Base { | pub enum Base { | ||||||
|     Decimal { numeric_underscore: bool }, |     Decimal { numeric_underscore: bool }, | ||||||
|     Hexadecimal, |     Hexadecimal, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Clone, Debug, PartialEq, Hash, Eq)] | #[derive(Clone, Debug, PartialEq, PartialOrd, Ord, Hash, Eq)] | ||||||
| pub enum Token { | pub enum Token { | ||||||
|     Error(char), |     Error(char), | ||||||
|     Name { name: String }, |     Name { name: String }, | ||||||
|  |  | ||||||
|  | @ -45,7 +45,7 @@ macro_rules! assert_expr { | ||||||
|                     prepend_module_to_snapshot => false, |                     prepend_module_to_snapshot => false, | ||||||
|                     omit_expression => true |                     omit_expression => true | ||||||
|                 }, { |                 }, { | ||||||
|                     insta::assert_debug_snapshot!(err); |                     insta::assert_snapshot!(err.into_iter().map(|e| e.to_string()).collect::<Vec<_>>().join("\n")); | ||||||
|                 }) |                 }) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 KtorZ
						KtorZ