From 121e57b3d22ab3425076324ff2057d32b395fe55 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 25 Mar 2025 16:07:47 -0700 Subject: [PATCH] Test RBHEX. --- rust/pspp/src/format/display.rs | 20 ++- rust/pspp/src/format/testdata/rbhex.txt | 136 ++++++++++++++++++ .../testdata/split-binhex-out.expected.py | 3 +- 3 files changed, 154 insertions(+), 5 deletions(-) create mode 100644 rust/pspp/src/format/testdata/rbhex.txt diff --git a/rust/pspp/src/format/display.rs b/rust/pspp/src/format/display.rs index 647e258daf..9ad7376b7d 100644 --- a/rust/pspp/src/format/display.rs +++ b/rust/pspp/src/format/display.rs @@ -408,7 +408,8 @@ impl<'a, 'b> DisplayValue<'a, 'b> { } fn rbhex(&self, f: &mut Formatter<'_>, number: f64) -> FmtResult { - output_hex(f, &number.to_ne_bytes()) + let rb = self.rb(Some(number), self.format.w() / 2); + output_hex(f, &rb) } fn date(&self, f: &mut Formatter<'_>, number: f64) -> FmtResult { @@ -569,7 +570,7 @@ impl<'a, 'b> DisplayValue<'a, 'b> { Type::PK => Some(self.pk(number)), Type::IB => Some(self.ib(number)), Type::PIB => Some(self.pib(number)), - Type::RB => Some(self.rb(number)), + Type::RB => Some(self.rb(number, self.format.w())), _ => None, } } @@ -657,12 +658,12 @@ impl<'a, 'b> DisplayValue<'a, 'b> { .to_smallvec(integer, self.format.w()) } - fn rb(&self, number: Option) -> SmallVec<[u8; 16]> { + fn rb(&self, number: Option, w: usize) -> SmallVec<[u8; 16]> { let number = number.unwrap_or(-f64::MAX); let bytes: [u8; 8] = self.endian.output_float_format.to_bytes(number); let mut vec = SmallVec::new(); vec.extend_from_slice(&bytes); - vec.resize(self.format.w(), 0); + vec.resize(w, 0); vec } } @@ -1075,6 +1076,11 @@ mod test { .with_cc(CC::C, "((,[,],))".parse().unwrap()) .with_cc(CC::D, ",XXX,,-".parse().unwrap()) .with_cc(CC::E, ",,YYY,-".parse().unwrap()); + let endian = EndianSettings { + output_integer_format: Endian::Big, + output_float_format: Endian::Big, + ..EndianSettings::default() + }; let mut value = Some(0.0); let mut value_name = String::new(); for (line_number, line) in input.lines().map(|r| r.unwrap()).enumerate() { @@ -1112,6 +1118,7 @@ mod test { let actual = Value::Number(value) .display(format, UTF_8) .with_settings(&settings) + .with_endian(endian) .to_string(); assert_eq!( expected, @@ -1195,6 +1202,11 @@ mod test { test("pibhex.txt"); } + #[test] + fn rbhex() { + test("rbhex.txt"); + } + #[test] fn leading_zeros() { struct Test { diff --git a/rust/pspp/src/format/testdata/rbhex.txt b/rust/pspp/src/format/testdata/rbhex.txt new file mode 100644 index 0000000000..b620af72c8 --- /dev/null +++ b/rust/pspp/src/format/testdata/rbhex.txt @@ -0,0 +1,136 @@ +. +RBHEX16: "FFEFFFFFFFFFFFFF" +2 +RBHEX16: "4000000000000000" +11 +RBHEX16: "4026000000000000" +123 +RBHEX16: "405EC00000000000" +1234 +RBHEX16: "4093480000000000" +913 +RBHEX16: "408C880000000000" +3.14159 +RBHEX16: "400921F9F01B866E" +777 +RBHEX16: "4088480000000000" +82 +RBHEX16: "4054800000000000" +690 +RBHEX16: "4085900000000000" +-2 +RBHEX16: "C000000000000000" +-11 +RBHEX16: "C026000000000000" +-123 +RBHEX16: "C05EC00000000000" +-1234 +RBHEX16: "C093480000000000" +-913 +RBHEX16: "C08C880000000000" +-3.14159 +RBHEX16: "C00921F9F01B866E" +-777 +RBHEX16: "C088480000000000" +-82 +RBHEX16: "C054800000000000" +-690 +RBHEX16: "C085900000000000" +-.1 +RBHEX16: "BFB999999999999A" +-.5 +RBHEX16: "BFE0000000000000" +-.9 +RBHEX16: "BFECCCCCCCCCCCCD" +9999.1 +RBHEX16: "40C3878CCCCCCCCD" +9999.5 +RBHEX16: "40C387C000000000" +9999.9 +RBHEX16: "40C387F333333333" +10000 +RBHEX16: "40C3880000000000" +18231237 +RBHEX16: "417162FC50000000" +-9999.1 +RBHEX16: "C0C3878CCCCCCCCD" +-9999.5 +RBHEX16: "C0C387C000000000" +-9999.9 +RBHEX16: "C0C387F333333333" +-10000 +RBHEX16: "C0C3880000000000" +-8231237 +RBHEX16: "C15F665140000000" +999.1 +RBHEX16: "408F38CCCCCCCCCD" +999.5 +RBHEX16: "408F3C0000000000" +999.9 +RBHEX16: "408F3F3333333333" +1000 +RBHEX16: "408F400000000000" +8231237 +RBHEX16: "415F665140000000" +-999.1 +RBHEX16: "C08F38CCCCCCCCCD" +-999.5 +RBHEX16: "C08F3C0000000000" +-999.9 +RBHEX16: "C08F3F3333333333" +-1000 +RBHEX16: "C08F400000000000" +-8231237 +RBHEX16: "C15F665140000000" +99.1 +RBHEX16: "4058C66666666666" +99.5 +RBHEX16: "4058E00000000000" +99.9 +RBHEX16: "4058F9999999999A" +100 +RBHEX16: "4059000000000000" +821237 +RBHEX16: "41290FEA00000000" +-99.1 +RBHEX16: "C058C66666666666" +-99.5 +RBHEX16: "C058E00000000000" +-99.9 +RBHEX16: "C058F9999999999A" +-100 +RBHEX16: "C059000000000000" +-831237 +RBHEX16: "C1295E0A00000000" +9.1 +RBHEX16: "4022333333333333" +9.5 +RBHEX16: "4023000000000000" +9.9 +RBHEX16: "4023CCCCCCCCCCCD" +10 +RBHEX16: "4024000000000000" +81237 +RBHEX16: "40F3D55000000000" +-9.1 +RBHEX16: "C022333333333333" +-9.5 +RBHEX16: "C023000000000000" +-9.9 +RBHEX16: "C023CCCCCCCCCCCD" +-10 +RBHEX16: "C024000000000000" +-81237 +RBHEX16: "C0F3D55000000000" +1.1 +RBHEX16: "3FF199999999999A" +-1.1 +RBHEX16: "BFF199999999999A" +1.5 +RBHEX16: "3FF8000000000000" +-1.5 +RBHEX16: "BFF8000000000000" +1.9 +RBHEX16: "3FFE666666666666" +-1.9 +RBHEX16: "BFFE666666666666" diff --git a/rust/pspp/src/format/testdata/split-binhex-out.expected.py b/rust/pspp/src/format/testdata/split-binhex-out.expected.py index e57accaf0b..9be5d0557f 100644 --- a/rust/pspp/src/format/testdata/split-binhex-out.expected.py +++ b/rust/pspp/src/format/testdata/split-binhex-out.expected.py @@ -5,7 +5,7 @@ import pathlib import struct outputs = {} -for format in ["P", "PK", "IB", "PIB", "PIBHEX", "RB"]: +for format in ["P", "PK", "IB", "PIB", "PIBHEX", "RB", "RBHEX"]: outputs[format] = open(format.lower() + '.txt', 'w') values = [ @@ -107,5 +107,6 @@ for value in values: value = -sys.float_info.max if value == '.' else float(value) outputs["RB"].write(f"RB8: \"{struct.pack('>d', value).hex()}\"\n") + outputs["RBHEX"].write(f"RBHEX16: \"{struct.pack('>d', value).hex().upper()}\"\n") ofs += 256 -- 2.30.2