},
sys::{
cooked::{decode, Headers},
- raw::{encoding_from_headers, Decoder, Reader, Record},
+ raw::{encoding_from_headers, Decoder, Reader},
sack::sack,
},
};
test_sysfile("no_variables");
}
+#[test]
+fn unknown_encoding() {
+ test_sysfile("unknown_encoding");
+}
+
+#[test]
+fn misplaced_type_4_record() {
+ test_sysfile("misplaced_type_4_record");
+}
+
fn test_sysfile(name: &str) {
let input_filename = Path::new(env!("CARGO_MANIFEST_DIR"))
.join("src/sys/testdata")
let cursor = Cursor::new(sysfile);
let mut warnings = Vec::new();
let reader = Reader::new(cursor, |warning| warnings.push(warning)).unwrap();
- let headers: Vec<Record> = reader.collect::<Result<Vec<_>, _>>().unwrap();
- let encoding =
- encoding_from_headers(&headers, &mut |warning| warnings.push(warning)).unwrap();
- let mut decoder = Decoder::new(encoding, |warning| warnings.push(warning));
- let mut decoded_records = Vec::new();
- for header in headers {
- decoded_records.push(header.decode(&mut decoder).unwrap());
- }
- drop(decoder);
-
- let mut errors = Vec::new();
- let headers = Headers::new(decoded_records, &mut |e| errors.push(e)).unwrap();
- let (dictionary, metadata) = decode(headers, encoding, |e| errors.push(e)).unwrap();
- let (group, data) = metadata.to_pivot_rows();
- let metadata_table = PivotTable::new([(Axis3::Y, Dimension::new(group))]).with_data(
- data.into_iter()
- .enumerate()
- .filter(|(_row, value)| !value.is_empty())
- .map(|(row, value)| ([row], value)),
- );
- let (group, data) = dictionary.to_pivot_rows();
- let dictionary_table = PivotTable::new([(Axis3::Y, Dimension::new(group))]).with_data(
- data.into_iter()
- .enumerate()
- .filter(|(_row, value)| !value.is_empty())
- .map(|(row, value)| ([row], value)),
- );
- let mut output = Vec::new();
- output.extend(
- warnings
- .into_iter()
- .map(|warning| Arc::new(Item::from(Text::new_log(warning.to_string())))),
- );
- output.extend(
- errors
- .into_iter()
- .map(|error| Arc::new(Item::from(Text::new_log(error.to_string())))),
- );
- output.push(Arc::new(metadata_table.into()));
- output.push(Arc::new(dictionary_table.into()));
- output.push(Arc::new(
- dictionary.output_variables().to_pivot_table().into(),
- ));
- if let Some(pt) = dictionary.output_value_labels().to_pivot_table() {
- output.push(Arc::new(pt.into()));
- }
- if let Some(pt) = dictionary.output_mrsets().to_pivot_table() {
- output.push(Arc::new(pt.into()));
- }
- if let Some(pt) = dictionary.output_attributes().to_pivot_table() {
- output.push(Arc::new(pt.into()));
- }
- if let Some(pt) = dictionary.output_variable_sets().to_pivot_table() {
- output.push(Arc::new(pt.into()));
- }
- let output = Item::new(Details::Group(output));
+ let output = match reader.collect() {
+ Ok(headers) => {
+ let encoding =
+ encoding_from_headers(&headers, &mut |warning| warnings.push(warning)).unwrap();
+ let mut decoder = Decoder::new(encoding, |warning| warnings.push(warning));
+ let mut decoded_records = Vec::new();
+ for header in headers {
+ decoded_records.push(header.decode(&mut decoder).unwrap());
+ }
+ drop(decoder);
+
+ let mut errors = Vec::new();
+ let headers = Headers::new(decoded_records, &mut |e| errors.push(e)).unwrap();
+ let (dictionary, metadata) = decode(headers, encoding, |e| errors.push(e)).unwrap();
+ let (group, data) = metadata.to_pivot_rows();
+ let metadata_table = PivotTable::new([(Axis3::Y, Dimension::new(group))])
+ .with_data(
+ data.into_iter()
+ .enumerate()
+ .filter(|(_row, value)| !value.is_empty())
+ .map(|(row, value)| ([row], value)),
+ );
+ let (group, data) = dictionary.to_pivot_rows();
+ let dictionary_table = PivotTable::new([(Axis3::Y, Dimension::new(group))])
+ .with_data(
+ data.into_iter()
+ .enumerate()
+ .filter(|(_row, value)| !value.is_empty())
+ .map(|(row, value)| ([row], value)),
+ );
+ let mut output = Vec::new();
+ output.extend(
+ warnings
+ .into_iter()
+ .map(|warning| Arc::new(Item::from(Text::new_log(warning.to_string())))),
+ );
+ output.extend(
+ errors
+ .into_iter()
+ .map(|error| Arc::new(Item::from(Text::new_log(error.to_string())))),
+ );
+ output.push(Arc::new(metadata_table.into()));
+ output.push(Arc::new(dictionary_table.into()));
+ output.push(Arc::new(
+ dictionary.output_variables().to_pivot_table().into(),
+ ));
+ if let Some(pt) = dictionary.output_value_labels().to_pivot_table() {
+ output.push(Arc::new(pt.into()));
+ }
+ if let Some(pt) = dictionary.output_mrsets().to_pivot_table() {
+ output.push(Arc::new(pt.into()));
+ }
+ if let Some(pt) = dictionary.output_attributes().to_pivot_table() {
+ output.push(Arc::new(pt.into()));
+ }
+ if let Some(pt) = dictionary.output_variable_sets().to_pivot_table() {
+ output.push(Arc::new(pt.into()));
+ }
+ Item::new(Details::Group(output))
+ }
+ Err(error) => Item::new(Details::Text(Box::new(Text::new_log(error.to_string())))),
+ };
assert_lines_eq(
&expected,
--- /dev/null
+This system file does not indicate its own character encoding. For best results, specify an encoding explicitly. Use SYSFILE INFO with ENCODING="DETECT" to analyze the possible encodings.
+
+Text string contains invalid bytes for UTF-8 encoding: "PSPP synthetic test file: ���� "
+
+╭──────────────────────┬────────────────────────╮
+│ Created │ 01-JAN-2011 20:53:52│
+├──────────────────────┼────────────────────────┤
+│Writer Product │PSPP synthetic test file│
+├──────────────────────┼────────────────────────┤
+│ Compression │None │
+│ Number of Cases│ 0│
+╰──────────────────────┴────────────────────────╯
+
+╭─────────┬──────────────────────────────╮
+│Label │PSPP synthetic test file: ����│
+│Variables│ 4│
+╰─────────┴──────────────────────────────╯
+
+╭─┬────────┬─────┬─────────────────┬─────┬─────┬─────────┬────────────┬────────────┬──────────────╮
+│ │Position│Label│Measurement Level│ Role│Width│Alignment│Print Format│Write Format│Missing Values│
+├─┼────────┼─────┼─────────────────┼─────┼─────┼─────────┼────────────┼────────────┼──────────────┤
+│a│ 1│ │ │Input│ 8│Right │F8.0 │F8.0 │ │
+│b│ 2│ │ │Input│ 8│Right │F8.0 │F8.0 │ │
+│c│ 3│ │ │Input│ 8│Right │F8.0 │F8.0 │ │
+│d│ 4│ │ │Input│ 8│Right │F8.0 │F8.0 │ │
+╰─┴────────┴─────┴─────────────────┴─────┴─────┴─────────┴────────────┴────────────┴──────────────╯