Add tests for coalesce_whitespace_escaped.
This commit is contained in:
		
							parent
							
								
									a6adeee40b
								
							
						
					
					
						commit
						41aa0349a0
					
				| @ -314,9 +314,10 @@ fn impl_coalesce_whitespace_escaped<'s, C: Fn(char) -> bool>( | ||||
|                     ret, | ||||
|                 }, | ||||
|                 c, | ||||
|             ) if c == escape_character => { | ||||
|                 CoalesceWhitespaceEscaped::RequiresMutationEscaping { ret } | ||||
|             } | ||||
|             ) if c == escape_character => CoalesceWhitespaceEscaped::RequiresMutationEscaping { | ||||
|                 ret, | ||||
|                 matched_escape_character: c, | ||||
|             }, | ||||
|             ( | ||||
|                 CoalesceWhitespaceEscaped::RequiresMutation { | ||||
|                     mut in_whitespace, | ||||
| @ -332,7 +333,7 @@ fn impl_coalesce_whitespace_escaped<'s, C: Fn(char) -> bool>( | ||||
|             } | ||||
|             ( | ||||
|                 CoalesceWhitespaceEscaped::RequiresMutation { | ||||
|                     in_whitespace, | ||||
|                     in_whitespace: _, | ||||
|                     mut ret, | ||||
|                 }, | ||||
|                 _, | ||||
| @ -343,9 +344,13 @@ fn impl_coalesce_whitespace_escaped<'s, C: Fn(char) -> bool>( | ||||
|                     ret, | ||||
|                 } | ||||
|             } | ||||
|             (CoalesceWhitespaceEscaped::RequiresMutationEscaping { mut ret }, c) | ||||
|                 if escapable_characters(c) => | ||||
|             { | ||||
|             ( | ||||
|                 CoalesceWhitespaceEscaped::RequiresMutationEscaping { | ||||
|                     mut ret, | ||||
|                     matched_escape_character: _, | ||||
|                 }, | ||||
|                 c, | ||||
|             ) if escapable_characters(c) => { | ||||
|                 ret.push(c); | ||||
|                 CoalesceWhitespaceEscaped::RequiresMutation { | ||||
|                     in_whitespace: false, | ||||
| @ -353,7 +358,10 @@ fn impl_coalesce_whitespace_escaped<'s, C: Fn(char) -> bool>( | ||||
|                 } | ||||
|             } | ||||
|             ( | ||||
|                 CoalesceWhitespaceEscaped::RequiresMutationEscaping { mut ret }, | ||||
|                 CoalesceWhitespaceEscaped::RequiresMutationEscaping { | ||||
|                     mut ret, | ||||
|                     matched_escape_character: _, | ||||
|                 }, | ||||
|                 ' ' | '\t' | '\r' | '\n', | ||||
|             ) => { | ||||
|                 ret.push(' '); | ||||
| @ -362,8 +370,14 @@ fn impl_coalesce_whitespace_escaped<'s, C: Fn(char) -> bool>( | ||||
|                     ret, | ||||
|                 } | ||||
|             } | ||||
|             (CoalesceWhitespaceEscaped::RequiresMutationEscaping { mut ret }, c) => { | ||||
|                 ret.push(escape_character); | ||||
|             ( | ||||
|                 CoalesceWhitespaceEscaped::RequiresMutationEscaping { | ||||
|                     mut ret, | ||||
|                     matched_escape_character, | ||||
|                 }, | ||||
|                 c, | ||||
|             ) => { | ||||
|                 ret.push(matched_escape_character); | ||||
|                 ret.push(c); | ||||
|                 // TODO
 | ||||
|                 CoalesceWhitespaceEscaped::RequiresMutation { | ||||
| @ -373,19 +387,85 @@ fn impl_coalesce_whitespace_escaped<'s, C: Fn(char) -> bool>( | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     // match state {
 | ||||
|     //     CoalesceWhitespaceEscaped::Normal => Cow::Borrowed(input),
 | ||||
|     //     CoalesceWhitespaceEscaped::RequiresMutation {
 | ||||
|     //         in_whitespace: _,
 | ||||
|     //         ret,
 | ||||
|     //     } => Cow::Owned(ret),
 | ||||
|     // }
 | ||||
|     todo!() | ||||
|     match state { | ||||
|         CoalesceWhitespaceEscaped::Normal => Cow::Borrowed(input), | ||||
|         CoalesceWhitespaceEscaped::NormalEscaping { escape_offset: _ } => Cow::Borrowed(input), | ||||
|         CoalesceWhitespaceEscaped::RequiresMutation { | ||||
|             in_whitespace: _, | ||||
|             ret, | ||||
|         } => Cow::Owned(ret), | ||||
|         CoalesceWhitespaceEscaped::RequiresMutationEscaping { | ||||
|             mut ret, | ||||
|             matched_escape_character, | ||||
|         } => { | ||||
|             ret.push(matched_escape_character); | ||||
|             Cow::Owned(ret) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| enum CoalesceWhitespaceEscaped { | ||||
|     Normal, | ||||
|     NormalEscaping { escape_offset: usize }, | ||||
|     RequiresMutation { in_whitespace: bool, ret: String }, | ||||
|     RequiresMutationEscaping { ret: String }, | ||||
|     NormalEscaping { | ||||
|         escape_offset: usize, | ||||
|     }, | ||||
|     RequiresMutation { | ||||
|         in_whitespace: bool, | ||||
|         ret: String, | ||||
|     }, | ||||
|     RequiresMutationEscaping { | ||||
|         ret: String, | ||||
|         matched_escape_character: char, | ||||
|     }, | ||||
| } | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn coalesce_whitespace_escaped_default() -> Result<(), Box<dyn std::error::Error>> { | ||||
|         let input = "foobarbaz"; | ||||
|         let output = coalesce_whitespace_escaped('&', |c| "".contains(c))(input); | ||||
|         assert_eq!(output, "foobarbaz"); | ||||
|         assert!(matches!(output, Cow::Borrowed(_))); | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     #[test] | ||||
|     fn coalesce_whitespace_escaped_whitespace_single() -> Result<(), Box<dyn std::error::Error>> { | ||||
|         let input = "foo bar baz"; | ||||
|         let output = coalesce_whitespace_escaped('&', |c| "".contains(c))(input); | ||||
|         assert_eq!(output, "foo bar baz"); | ||||
|         // TODO: Technically this should be a Borrowed but to keep the code simple for now we are treating all whitespace as causing ownership.
 | ||||
|         assert!(matches!(output, Cow::Owned(_))); | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     #[test] | ||||
|     fn coalesce_whitespace_escaped_whitespace_double() -> Result<(), Box<dyn std::error::Error>> { | ||||
|         let input = "foo  bar  baz"; | ||||
|         let output = coalesce_whitespace_escaped('&', |c| "".contains(c))(input); | ||||
|         assert_eq!(output, "foo bar baz"); | ||||
|         assert!(matches!(output, Cow::Owned(_))); | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     #[test] | ||||
|     fn coalesce_whitespace_escaped_escape_match() -> Result<(), Box<dyn std::error::Error>> { | ||||
|         let input = "foo  &bar  baz"; | ||||
|         let output = coalesce_whitespace_escaped('&', |c| "b".contains(c))(input); | ||||
|         assert_eq!(output, "foo bar baz"); | ||||
|         assert!(matches!(output, Cow::Owned(_))); | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     #[test] | ||||
|     fn coalesce_whitespace_escaped_escape_mismatch() -> Result<(), Box<dyn std::error::Error>> { | ||||
|         let input = "foo  b&ar  baz"; | ||||
|         let output = coalesce_whitespace_escaped('&', |c| "b".contains(c))(input); | ||||
|         assert_eq!(output, "foo b&ar baz"); | ||||
|         assert!(matches!(output, Cow::Owned(_))); | ||||
|         Ok(()) | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Tom Alexander
						Tom Alexander