Tests for recasting literals
This commit is contained in:
		@ -1342,7 +1342,14 @@ impl Literal {
 | 
			
		||||
 | 
			
		||||
    fn recast(&self) -> String {
 | 
			
		||||
        match self.value {
 | 
			
		||||
            LiteralValue::Fractional(_) | LiteralValue::IInteger(_) => self.raw.clone(),
 | 
			
		||||
            LiteralValue::Fractional(x) => {
 | 
			
		||||
                if x.fract() == 0.0 {
 | 
			
		||||
                    format!("{x:?}")
 | 
			
		||||
                } else {
 | 
			
		||||
                    self.raw.clone()
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            LiteralValue::IInteger(_) => self.raw.clone(),
 | 
			
		||||
            LiteralValue::String(ref s) => {
 | 
			
		||||
                let quote = if self.raw.trim().starts_with('"') { '"' } else { '\'' };
 | 
			
		||||
                format!("{quote}{s}{quote}")
 | 
			
		||||
@ -3276,4 +3283,40 @@ const thickness = sqrt(distance * p * FOS * 6 / (sigmaAllow * width))"#;
 | 
			
		||||
        let recasted = program.recast(&Default::default(), 0);
 | 
			
		||||
        assert_eq!(recasted.trim(), some_program_string);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn recast_literal() {
 | 
			
		||||
        use winnow::Parser;
 | 
			
		||||
        for (i, (raw, expected, reason)) in [
 | 
			
		||||
            (
 | 
			
		||||
                "5.0",
 | 
			
		||||
                "5.0",
 | 
			
		||||
                "fractional numbers should stay fractional, i.e. don't reformat this to '5'",
 | 
			
		||||
            ),
 | 
			
		||||
            (
 | 
			
		||||
                "5",
 | 
			
		||||
                "5",
 | 
			
		||||
                "integers should stay integral, i.e. don't reformat this to '5.0'",
 | 
			
		||||
            ),
 | 
			
		||||
            (
 | 
			
		||||
                "5.0000000",
 | 
			
		||||
                "5.0",
 | 
			
		||||
                "if the number is f64 but not fractional, use its canonical format",
 | 
			
		||||
            ),
 | 
			
		||||
            ("5.1", "5.1", "straightforward case works"),
 | 
			
		||||
        ]
 | 
			
		||||
        .into_iter()
 | 
			
		||||
        .enumerate()
 | 
			
		||||
        {
 | 
			
		||||
            let tokens = crate::token::lexer(raw);
 | 
			
		||||
            let literal = crate::parser::parser_impl::unsigned_number_literal
 | 
			
		||||
                .parse(&tokens)
 | 
			
		||||
                .unwrap();
 | 
			
		||||
            assert_eq!(
 | 
			
		||||
                literal.recast(),
 | 
			
		||||
                expected,
 | 
			
		||||
                "failed test {i}, which is testing that {reason}"
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
use crate::{ast::types::Program, errors::KclError, token::Token};
 | 
			
		||||
 | 
			
		||||
mod math;
 | 
			
		||||
mod parser_impl;
 | 
			
		||||
pub(crate) mod parser_impl;
 | 
			
		||||
 | 
			
		||||
pub const PIPE_SUBSTITUTION_OPERATOR: &str = "%";
 | 
			
		||||
pub const PIPE_OPERATOR: &str = "|>";
 | 
			
		||||
 | 
			
		||||
@ -233,7 +233,7 @@ pub fn string_literal(i: TokenSlice) -> PResult<Literal> {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Parse a KCL literal number, with no - sign.
 | 
			
		||||
fn unsigned_number_literal(i: TokenSlice) -> PResult<Literal> {
 | 
			
		||||
pub(crate) fn unsigned_number_literal(i: TokenSlice) -> PResult<Literal> {
 | 
			
		||||
    let (value, token) = any
 | 
			
		||||
        .try_map(|token: Token| match token.token_type {
 | 
			
		||||
            TokenType::Number => {
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user