Test RBHEX.
authorBen Pfaff <blp@cs.stanford.edu>
Tue, 25 Mar 2025 23:07:47 +0000 (16:07 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Tue, 25 Mar 2025 23:07:47 +0000 (16:07 -0700)
rust/pspp/src/format/display.rs
rust/pspp/src/format/testdata/rbhex.txt [new file with mode: 0644]
rust/pspp/src/format/testdata/split-binhex-out.expected.py

index 647e258daf57acb256136eaa0b338f6991aaf576..9ad7376b7d2cb67c5f395a8afcb06f6ad7f8dddf 100644 (file)
@@ -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<f64>) -> SmallVec<[u8; 16]> {
+    fn rb(&self, number: Option<f64>, 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 (file)
index 0000000..b620af7
--- /dev/null
@@ -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"
index e57accaf0bd0aa31a74e3c4db312b5c71753c95f..9be5d0557f08b3a2c6125dc24ea68dd6e9f0a947 100644 (file)
@@ -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