#![allow(clippy::unwrap_used, clippy::expect_used)]
use std::process::Command;
use timeglyph::{format, PosixNs};
fn oracle_available() -> bool {
Command::new("time-decode")
.arg("--version")
.output()
.is_ok_and(|o| o.status.success())
}
fn inst_2020() -> PosixNs {
format("unix").unwrap().decode_int(1_577_836_800).unwrap()
}
fn oracle_decode(flag: &str, repr: &str) -> Option<String> {
let out = Command::new("time-decode")
.arg(flag)
.arg(repr)
.output()
.ok()?;
let text = String::from_utf8_lossy(&out.stdout);
let line = text.lines().find(|l| l.contains(": "))?;
let after = line.split_once(": ")?.1.trim();
if after.len() < 19 {
return None;
}
Some(after[..19].to_string())
}
#[test]
fn encode_exfat_committed() {
assert_eq!(
format("exfat").unwrap().encode_int(inst_2020()).unwrap(),
1_344_339_968
);
}
#[test]
fn encode_exfat_oracle() {
if !oracle_available() {
eprintln!("skipping: time-decode not on PATH");
return;
}
let v = format("exfat").unwrap().encode_int(inst_2020()).unwrap();
let repr = format!("{:08x}", v as u32);
let got = oracle_decode("--exfat", &repr).expect("exfat: no oracle output");
assert_eq!(got, "2020-01-01 00:00:00", "exfat repr {repr}");
}
#[test]
fn encode_exfat_rejects_out_of_range() {
let pre = format("unix").unwrap().decode_int(-31_536_000).unwrap();
assert!(format("exfat").unwrap().encode_int(pre).is_err());
}
#[test]
fn encode_dttm_committed() {
assert_eq!(
format("dttm").unwrap().encode_int(inst_2020()).unwrap(),
125_896_704
);
}
#[test]
fn encode_dttm_oracle() {
if !oracle_available() {
eprintln!("skipping: time-decode not on PATH");
return;
}
let v = format("dttm").unwrap().encode_int(inst_2020()).unwrap();
let repr = format!("{:08x}", v as u32);
let got = oracle_decode("--dttm", &repr).expect("dttm: no oracle output");
assert_eq!(got, "2020-01-01 00:00:00", "dttm repr {repr}");
}
#[test]
fn encode_dttm_rejects_out_of_range() {
assert!(format("dttm")
.unwrap()
.encode_int(PosixNs(i128::MAX))
.is_err());
}
#[test]
fn encode_bitdate_committed() {
assert_eq!(
format("bitdate").unwrap().encode_int(inst_2020()).unwrap(),
541_054
);
}
#[test]
fn encode_bitdate_oracle() {
if !oracle_available() {
eprintln!("skipping: time-decode not on PATH");
return;
}
let v = format("bitdate").unwrap().encode_int(inst_2020()).unwrap();
let repr = format!("{:08x}", v as u32);
let got = oracle_decode("--bitdate", &repr).expect("bitdate: no oracle output");
assert_eq!(got, "2020-01-01 00:00:00", "bitdate repr {repr}");
}
#[test]
fn encode_bitdate_rejects_out_of_range() {
assert!(format("bitdate")
.unwrap()
.encode_int(PosixNs(i128::MAX))
.is_err());
}
#[test]
fn encode_bitdec_committed() {
assert_eq!(
format("bitdec").unwrap().encode_int(inst_2020()).unwrap(),
2_118_191_104
);
}
#[test]
fn encode_bitdec_oracle() {
if !oracle_available() {
eprintln!("skipping: time-decode not on PATH");
return;
}
let v = format("bitdec").unwrap().encode_int(inst_2020()).unwrap();
let repr = v.to_string();
let got = oracle_decode("--bitdec", &repr).expect("bitdec: no oracle output");
assert_eq!(got, "2020-01-01 00:00:00", "bitdec repr {repr}");
}
#[test]
fn encode_bitdec_rejects_out_of_range() {
assert!(format("bitdec")
.unwrap()
.encode_int(PosixNs(i128::MAX))
.is_err());
}
#[test]
fn encode_bcd_committed() {
assert_eq!(
format("bcd").unwrap().encode_int(inst_2020()).unwrap(),
200_101_000_000
);
}
#[test]
fn encode_bcd_oracle() {
if !oracle_available() {
eprintln!("skipping: time-decode not on PATH");
return;
}
let v = format("bcd").unwrap().encode_int(inst_2020()).unwrap();
let repr = v.to_string();
let got = oracle_decode("--bcd", &repr).expect("bcd: no oracle output");
assert_eq!(got, "2020-01-01 00:00:00", "bcd repr {repr}");
}
#[test]
fn encode_bcd_rejects_out_of_range() {
let y2100 = format("unix").unwrap().decode_int(4_102_444_800).unwrap();
assert!(format("bcd").unwrap().encode_int(y2100).is_err());
}