From f90adb4efb9074f64cbd146e43ad30be5347124c Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Thu, 19 Jun 2025 13:44:32 -0700 Subject: [PATCH] another test --- rust/pspp/src/sys/raw.rs | 20 +++++++++++++------ rust/pspp/src/sys/test.rs | 5 +++++ ...sponse_sets_missing_space_after_c.expected | 20 +++++++++++++++++++ ...e_response_sets_missing_space_after_c.sack | 14 +++++++++++++ 4 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 rust/pspp/src/sys/testdata/multiple_response_sets_missing_space_after_c.expected create mode 100644 rust/pspp/src/sys/testdata/multiple_response_sets_missing_space_after_c.sack diff --git a/rust/pspp/src/sys/raw.rs b/rust/pspp/src/sys/raw.rs index 2d10d651ae..de528388b6 100644 --- a/rust/pspp/src/sys/raw.rs +++ b/rust/pspp/src/sys/raw.rs @@ -223,8 +223,8 @@ pub enum Warning { #[error("Invalid multiple response type")] InvalidMultipleResponseType, - #[error("Syntax error in multiple response record")] - MultipleResponseSyntaxError, + #[error("Syntax error in multiple response record ({0})")] + MultipleResponseSyntaxError(&'static str), #[error("Syntax error parsing counted string (missing trailing space)")] CountedStringMissingSpace, @@ -2217,13 +2217,15 @@ where impl MultipleResponseSet { fn parse(input: &[u8]) -> Result<(Self, &[u8]), Warning> { let Some(equals) = input.iter().position(|&b| b == b'=') else { - return Err(Warning::MultipleResponseSyntaxError); + return Err(Warning::MultipleResponseSyntaxError("missing `=`")); }; let (name, input) = input.split_at(equals); let input = input.strip_prefix(b"=").unwrap(); let (mr_type, input) = MultipleResponseType::parse(input)?; let Some(input) = input.strip_prefix(b" ") else { - return Err(Warning::MultipleResponseSyntaxError); + return Err(Warning::MultipleResponseSyntaxError( + "missing space after multiple response type", + )); }; let (label, mut input) = parse_counted_string(input)?; let mut vars = Vec::new(); @@ -2231,7 +2233,9 @@ impl MultipleResponseSet { match input.split_first() { Some((b' ', rest)) => { let Some(length) = rest.iter().position(|b| b" \n".contains(b)) else { - return Err(Warning::MultipleResponseSyntaxError); + return Err(Warning::MultipleResponseSyntaxError( + "missing variable name delimiter", + )); }; let (var, rest) = rest.split_at(length); if !var.is_empty() { @@ -2239,7 +2243,11 @@ impl MultipleResponseSet { } input = rest; } - _ => return Err(Warning::MultipleResponseSyntaxError), + _ => { + return Err(Warning::MultipleResponseSyntaxError( + "missing space preceding variable name", + )) + } } } while input.first() == Some(&b'\n') { diff --git a/rust/pspp/src/sys/test.rs b/rust/pspp/src/sys/test.rs index 93ed921471..b449d05999 100644 --- a/rust/pspp/src/sys/test.rs +++ b/rust/pspp/src/sys/test.rs @@ -237,6 +237,11 @@ fn multiple_response_sets_bad_name() { test_sysfile("multiple_response_sets_bad_name"); } +#[test] +fn multiple_response_sets_missing_space_after_c() { + test_sysfile("multiple_response_sets_missing_space_after_c"); +} + /// Duplicate variable name handling negative test. /// /// SPSS-generated system file can contain duplicate variable names (see bug diff --git a/rust/pspp/src/sys/testdata/multiple_response_sets_missing_space_after_c.expected b/rust/pspp/src/sys/testdata/multiple_response_sets_missing_space_after_c.expected new file mode 100644 index 0000000000..4fcc82f57f --- /dev/null +++ b/rust/pspp/src/sys/testdata/multiple_response_sets_missing_space_after_c.expected @@ -0,0 +1,20 @@ +Syntax error in multiple response record (missing space after multiple response type) + +╭──────────────────────┬────────────────────────╮ +│ Created │ 01-JAN-2011 20:53:52│ +├──────────────────────┼────────────────────────┤ +│Writer Product │PSPP synthetic test file│ +├──────────────────────┼────────────────────────┤ +│ Compression │SAV │ +│ Number of Cases│Unknown │ +╰──────────────────────┴────────────────────────╯ + +╭─────────┬─╮ +│Variables│1│ +╰─────────┴─╯ + +╭────┬────────┬─────┬─────────────────┬─────┬─────┬─────────┬────────────┬────────────┬──────────────╮ +│ │Position│Label│Measurement Level│ Role│Width│Alignment│Print Format│Write Format│Missing Values│ +├────┼────────┼─────┼─────────────────┼─────┼─────┼─────────┼────────────┼────────────┼──────────────┤ +│num1│ 1│ │ │Input│ 8│Right │F8.0 │F8.0 │ │ +╰────┴────────┴─────┴─────────────────┴─────┴─────┴─────────┴────────────┴────────────┴──────────────╯ diff --git a/rust/pspp/src/sys/testdata/multiple_response_sets_missing_space_after_c.sack b/rust/pspp/src/sys/testdata/multiple_response_sets_missing_space_after_c.sack new file mode 100644 index 0000000000..cfe74200a1 --- /dev/null +++ b/rust/pspp/src/sys/testdata/multiple_response_sets_missing_space_after_c.sack @@ -0,0 +1,14 @@ +# File header. +"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file"; +2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3; + +# Numeric variable, no label or missing values. +2; 0; 0; 0; 0x050800 *2; s8 "NUM1"; + +# Multiple response sets. +7; 7; 1; COUNT("$a=Cx"); + +# Character encoding record. +7; 20; 1; 12; "windows-1252"; + +999; 0; -- 2.30.2