use rust_stdf::{stdf_record_type::*, *};
fn cn(buf: &mut Vec<u8>, s: &str) {
buf.push(s.len() as u8);
buf.extend_from_slice(s.as_bytes());
}
fn sn(buf: &mut Vec<u8>, s: &str) {
buf.extend_from_slice(&(s.len() as u16).to_le_bytes());
buf.extend_from_slice(s.as_bytes());
}
fn bn(buf: &mut Vec<u8>, b: &[u8]) {
buf.push(b.len() as u8);
buf.extend_from_slice(b);
}
fn dn(buf: &mut Vec<u8>, bits: u16, b: &[u8]) {
buf.extend_from_slice(&bits.to_le_bytes());
buf.extend_from_slice(b);
}
macro_rules! eq {
($eager:ident, $view:ident; $($f:ident),+ $(,)?) => {
$( assert_eq!($eager.$f, $view.$f()); )+
};
}
macro_rules! eq_str {
($eager:ident, $view:ident; $($f:ident),+ $(,)?) => {
$( assert_eq!($eager.$f, $view.$f().to_owned()); )+
};
}
fn f32_opt_eq(a: Option<f32>, b: Option<f32>) -> bool {
match (a, b) {
(Some(x), Some(y)) => x.to_bits() == y.to_bits(),
(None, None) => true,
_ => false,
}
}
fn f32_vec_eq(a: &[f32], b: &[f32]) -> bool {
a.len() == b.len() && a.iter().zip(b).all(|(x, y)| x.to_bits() == y.to_bits())
}
#[test]
fn record_default_value_test() {
let empty_raw_data = [0u8; 0];
let (typ, sub) = get_typ_sub_from_code(REC_MIR).unwrap();
let rec_header = RecordHeader {
typ,
sub,
len: empty_raw_data.len() as u16,
};
let mut mir_rec = StdfRecord::new(REC_MIR);
if let StdfRecord::MIR(ref inner) = mir_rec {
assert_eq!(inner.mode_cod, ' ', "Testing default of new rec");
assert_eq!(inner.rtst_cod, ' ', "Testing default of new rec");
assert_eq!(inner.prot_cod, ' ', "Testing default of new rec");
assert_eq!(inner.burn_tim, 65535, "Testing default of new rec");
assert_eq!(inner.cmod_cod, ' ', "Testing default of new rec");
}
mir_rec.read_from_bytes(&empty_raw_data, &ByteOrder::LittleEndian);
let mir_view =
StdfRecordView::read_from_bytes(rec_header, &empty_raw_data, &ByteOrder::LittleEndian);
if let StdfRecord::MIR(ref inner) = mir_rec {
assert_eq!(inner.mode_cod, ' ', "Testing default value after reading");
assert_eq!(inner.rtst_cod, ' ', "Testing default value after reading");
assert_eq!(inner.prot_cod, ' ', "Testing default value after reading");
assert_eq!(inner.burn_tim, 65535, "Testing default value after reading");
assert_eq!(inner.cmod_cod, ' ', "Testing default value after reading");
if let StdfRecordView::MIR(v) = mir_view {
assert_eq!(
v.mode_cod(),
inner.mode_cod,
"Testing default value of MIRView and MIR"
);
assert_eq!(
v.rtst_cod(),
inner.rtst_cod,
"Testing default value of MIRView and MIR"
);
assert_eq!(
v.prot_cod(),
inner.prot_cod,
"Testing default value of MIRView and MIR"
);
assert_eq!(
v.burn_tim(),
inner.burn_tim,
"Testing default value of MIRView and MIR"
);
assert_eq!(
v.cmod_cod(),
inner.cmod_cod,
"Testing default value of MIRView and MIR"
);
}
}
let (typ, sub) = get_typ_sub_from_code(REC_MRR).unwrap();
let rec_header = RecordHeader {
typ,
sub,
len: empty_raw_data.len() as u16,
};
let mut mrr_rec = StdfRecord::new(REC_MRR);
if let StdfRecord::MRR(ref inner) = mrr_rec {
assert_eq!(inner.disp_cod, ' ', "Testing default of new rec");
}
mrr_rec.read_from_bytes(&empty_raw_data, &ByteOrder::LittleEndian);
let mrr_view =
StdfRecordView::read_from_bytes(rec_header, &empty_raw_data, &ByteOrder::LittleEndian);
if let StdfRecord::MRR(ref inner) = mrr_rec {
assert_eq!(inner.disp_cod, ' ', "Testing default value after reading");
if let StdfRecordView::MRR(v) = mrr_view {
assert_eq!(
v.disp_cod(),
inner.disp_cod,
"Testing default value of MRRView and MRR"
);
}
}
let (typ, sub) = get_typ_sub_from_code(REC_PCR).unwrap();
let rec_header = RecordHeader {
typ,
sub,
len: empty_raw_data.len() as u16,
};
let mut pcr_rec = StdfRecord::new(REC_PCR);
if let StdfRecord::PCR(ref inner) = pcr_rec {
assert_eq!(inner.rtst_cnt, 4_294_967_295, "Testing default of new rec");
assert_eq!(inner.abrt_cnt, 4_294_967_295, "Testing default of new rec");
assert_eq!(inner.good_cnt, 4_294_967_295, "Testing default of new rec");
assert_eq!(inner.func_cnt, 4_294_967_295, "Testing default of new rec");
}
pcr_rec.read_from_bytes(&empty_raw_data, &ByteOrder::LittleEndian);
let pcr_view =
StdfRecordView::read_from_bytes(rec_header, &empty_raw_data, &ByteOrder::LittleEndian);
if let StdfRecord::PCR(ref inner) = pcr_rec {
assert_eq!(
inner.rtst_cnt, 4_294_967_295,
"Testing default value after reading"
);
assert_eq!(
inner.abrt_cnt, 4_294_967_295,
"Testing default value after reading"
);
assert_eq!(
inner.good_cnt, 4_294_967_295,
"Testing default value after reading"
);
assert_eq!(
inner.func_cnt, 4_294_967_295,
"Testing default value after reading"
);
if let StdfRecordView::PCR(v) = pcr_view {
assert_eq!(
v.rtst_cnt(),
inner.rtst_cnt,
"Testing default value of PCRView and PCR"
);
assert_eq!(
v.abrt_cnt(),
inner.abrt_cnt,
"Testing default value of PCRView and PCR"
);
assert_eq!(
v.good_cnt(),
inner.good_cnt,
"Testing default value of PCRView and PCR"
);
assert_eq!(
v.func_cnt(),
inner.func_cnt,
"Testing default value of PCRView and PCR"
);
}
}
let (typ, sub) = get_typ_sub_from_code(REC_HBR).unwrap();
let rec_header = RecordHeader {
typ,
sub,
len: empty_raw_data.len() as u16,
};
let mut hbr_rec = StdfRecord::new(REC_HBR);
if let StdfRecord::HBR(ref inner) = hbr_rec {
assert_eq!(inner.hbin_pf, ' ', "Testing default of new rec");
}
hbr_rec.read_from_bytes(&empty_raw_data, &ByteOrder::LittleEndian);
let hbr_view =
StdfRecordView::read_from_bytes(rec_header, &empty_raw_data, &ByteOrder::LittleEndian);
if let StdfRecord::HBR(ref inner) = hbr_rec {
assert_eq!(inner.hbin_pf, ' ', "Testing default value after reading");
if let StdfRecordView::HBR(v) = hbr_view {
assert_eq!(
v.hbin_pf(),
inner.hbin_pf,
"Testing default value of HBRView and HBR"
);
}
}
let (typ, sub) = get_typ_sub_from_code(REC_SBR).unwrap();
let rec_header = RecordHeader {
typ,
sub,
len: empty_raw_data.len() as u16,
};
let mut sbr_rec = StdfRecord::new(REC_SBR);
if let StdfRecord::SBR(ref inner) = sbr_rec {
assert_eq!(inner.sbin_pf, ' ', "Testing default of new rec");
}
sbr_rec.read_from_bytes(&empty_raw_data, &ByteOrder::LittleEndian);
let sbr_view =
StdfRecordView::read_from_bytes(rec_header, &empty_raw_data, &ByteOrder::LittleEndian);
if let StdfRecord::SBR(ref inner) = sbr_rec {
assert_eq!(inner.sbin_pf, ' ', "Testing default value after reading");
if let StdfRecordView::SBR(v) = sbr_view {
assert_eq!(
v.sbin_pf(),
inner.sbin_pf,
"Testing default value of SBRView and SBR"
);
}
}
let (typ, sub) = get_typ_sub_from_code(REC_PMR).unwrap();
let rec_header = RecordHeader {
typ,
sub,
len: empty_raw_data.len() as u16,
};
let mut pmr_rec = StdfRecord::new(REC_PMR);
if let StdfRecord::PMR(ref inner) = pmr_rec {
assert_eq!(inner.chan_typ, 0, "Testing default of new rec");
assert_eq!(inner.head_num, 1, "Testing default of new rec");
assert_eq!(inner.site_num, 1, "Testing default of new rec");
}
pmr_rec.read_from_bytes(&empty_raw_data, &ByteOrder::LittleEndian);
let pmr_view =
StdfRecordView::read_from_bytes(rec_header, &empty_raw_data, &ByteOrder::LittleEndian);
if let StdfRecord::PMR(ref inner) = pmr_rec {
assert_eq!(inner.chan_typ, 0, "Testing default value after reading");
assert_eq!(inner.head_num, 1, "Testing default value after reading");
assert_eq!(inner.site_num, 1, "Testing default value after reading");
if let StdfRecordView::PMR(v) = pmr_view {
assert_eq!(
v.chan_typ(),
inner.chan_typ,
"Testing default value of PMRView and PMR"
);
assert_eq!(
v.head_num(),
inner.head_num,
"Testing default value of PMRView and PMR"
);
assert_eq!(
v.site_num(),
inner.site_num,
"Testing default value of PMRView and PMR"
);
}
}
let (typ, sub) = get_typ_sub_from_code(REC_CDR).unwrap();
let rec_header = RecordHeader {
typ,
sub,
len: empty_raw_data.len() as u16,
};
let mut cdr_rec = StdfRecord::new(REC_CDR);
if let StdfRecord::CDR(ref inner) = cdr_rec {
assert_eq!(inner.inv_val, 255, "Testing default of new rec");
}
cdr_rec.read_from_bytes(&empty_raw_data, &ByteOrder::LittleEndian);
let cdr_view =
StdfRecordView::read_from_bytes(rec_header, &empty_raw_data, &ByteOrder::LittleEndian);
if let StdfRecord::CDR(ref inner) = cdr_rec {
assert_eq!(inner.inv_val, 255, "Testing default value after reading");
if let StdfRecordView::CDR(v) = cdr_view {
assert_eq!(
v.inv_val(),
inner.inv_val,
"Testing default value of CDRView and CDR"
);
}
}
let (typ, sub) = get_typ_sub_from_code(REC_WIR).unwrap();
let rec_header = RecordHeader {
typ,
sub,
len: empty_raw_data.len() as u16,
};
let mut wir_rec = StdfRecord::new(REC_WIR);
if let StdfRecord::WIR(ref inner) = wir_rec {
assert_eq!(inner.site_grp, 255, "Testing default of new rec");
}
wir_rec.read_from_bytes(&empty_raw_data, &ByteOrder::LittleEndian);
let wir_view =
StdfRecordView::read_from_bytes(rec_header, &empty_raw_data, &ByteOrder::LittleEndian);
if let StdfRecord::WIR(ref inner) = wir_rec {
assert_eq!(inner.site_grp, 255, "Testing default value after reading");
if let StdfRecordView::WIR(v) = wir_view {
assert_eq!(
v.site_grp(),
inner.site_grp,
"Testing default value of WIRView and WIR"
);
}
}
let (typ, sub) = get_typ_sub_from_code(REC_WRR).unwrap();
let rec_header = RecordHeader {
typ,
sub,
len: empty_raw_data.len() as u16,
};
let mut wrr_rec = StdfRecord::new(REC_WRR);
if let StdfRecord::WRR(ref inner) = wrr_rec {
assert_eq!(inner.site_grp, 255, "Testing default of new rec");
assert_eq!(inner.rtst_cnt, 4_294_967_295, "Testing default of new rec");
assert_eq!(inner.abrt_cnt, 4_294_967_295, "Testing default of new rec");
assert_eq!(inner.good_cnt, 4_294_967_295, "Testing default of new rec");
assert_eq!(inner.func_cnt, 4_294_967_295, "Testing default of new rec");
}
wrr_rec.read_from_bytes(&empty_raw_data, &ByteOrder::LittleEndian);
let wrr_view =
StdfRecordView::read_from_bytes(rec_header, &empty_raw_data, &ByteOrder::LittleEndian);
if let StdfRecord::WRR(ref inner) = wrr_rec {
assert_eq!(inner.site_grp, 255, "Testing default value after reading");
assert_eq!(
inner.rtst_cnt, 4_294_967_295,
"Testing default value after reading"
);
assert_eq!(
inner.abrt_cnt, 4_294_967_295,
"Testing default value after reading"
);
assert_eq!(
inner.good_cnt, 4_294_967_295,
"Testing default value after reading"
);
assert_eq!(
inner.func_cnt, 4_294_967_295,
"Testing default value after reading"
);
if let StdfRecordView::WRR(v) = wrr_view {
assert_eq!(
v.site_grp(),
inner.site_grp,
"Testing default value of WRRView and WRR"
);
assert_eq!(
v.rtst_cnt(),
inner.rtst_cnt,
"Testing default value of WRRView and WRR"
);
assert_eq!(
v.abrt_cnt(),
inner.abrt_cnt,
"Testing default value of WRRView and WRR"
);
assert_eq!(
v.good_cnt(),
inner.good_cnt,
"Testing default value of WRRView and WRR"
);
assert_eq!(
v.func_cnt(),
inner.func_cnt,
"Testing default value of WRRView and WRR"
);
}
}
let (typ, sub) = get_typ_sub_from_code(REC_WCR).unwrap();
let rec_header = RecordHeader {
typ,
sub,
len: empty_raw_data.len() as u16,
};
let mut wcr_rec = StdfRecord::new(REC_WCR);
if let StdfRecord::WCR(ref inner) = wcr_rec {
assert_eq!(inner.wafr_siz, 0.0, "Testing default of new rec");
assert_eq!(inner.die_ht, 0.0, "Testing default of new rec");
assert_eq!(inner.die_wid, 0.0, "Testing default of new rec");
assert_eq!(inner.wf_units, 0, "Testing default of new rec");
assert_eq!(inner.wf_flat, ' ', "Testing default of new rec");
assert_eq!(inner.center_x, -32768, "Testing default of new rec");
assert_eq!(inner.center_y, -32768, "Testing default of new rec");
assert_eq!(inner.pos_x, ' ', "Testing default of new rec");
assert_eq!(inner.pos_y, ' ', "Testing default of new rec");
}
wcr_rec.read_from_bytes(&empty_raw_data, &ByteOrder::LittleEndian);
let wcr_view =
StdfRecordView::read_from_bytes(rec_header, &empty_raw_data, &ByteOrder::LittleEndian);
if let StdfRecord::WCR(ref inner) = wcr_rec {
assert_eq!(inner.wafr_siz, 0.0, "Testing default value after reading");
assert_eq!(inner.die_ht, 0.0, "Testing default value after reading");
assert_eq!(inner.die_wid, 0.0, "Testing default value after reading");
assert_eq!(inner.wf_units, 0, "Testing default value after reading");
assert_eq!(inner.wf_flat, ' ', "Testing default value after reading");
assert_eq!(
inner.center_x, -32768,
"Testing default value after reading"
);
assert_eq!(
inner.center_y, -32768,
"Testing default value after reading"
);
assert_eq!(inner.pos_x, ' ', "Testing default value after reading");
assert_eq!(inner.pos_y, ' ', "Testing default value after reading");
if let StdfRecordView::WCR(v) = wcr_view {
assert_eq!(
v.wafr_siz(),
inner.wafr_siz,
"Testing default value of WCRView and WCR"
);
assert_eq!(
v.die_ht(),
inner.die_ht,
"Testing default value of WCRView and WCR"
);
assert_eq!(
v.die_wid(),
inner.die_wid,
"Testing default value of WCRView and WCR"
);
assert_eq!(
v.wf_units(),
inner.wf_units,
"Testing default value of WCRView and WCR"
);
assert_eq!(
v.wf_flat(),
inner.wf_flat,
"Testing default value of WCRView and WCR"
);
assert_eq!(
v.center_x(),
inner.center_x,
"Testing default value of WCRView and WCR"
);
assert_eq!(
v.center_y(),
inner.center_y,
"Testing default value of WCRView and WCR"
);
assert_eq!(
v.pos_x(),
inner.pos_x,
"Testing default value of WCRView and WCR"
);
assert_eq!(
v.pos_y(),
inner.pos_y,
"Testing default value of WCRView and WCR"
);
}
}
let (typ, sub) = get_typ_sub_from_code(REC_PRR).unwrap();
let rec_header = RecordHeader {
typ,
sub,
len: empty_raw_data.len() as u16,
};
let mut prr_rec = StdfRecord::new(REC_PRR);
if let StdfRecord::PRR(ref inner) = prr_rec {
assert_eq!(inner.soft_bin, 65535, "Testing default of new rec");
assert_eq!(inner.x_coord, -32768, "Testing default of new rec");
assert_eq!(inner.y_coord, -32768, "Testing default of new rec");
assert_eq!(inner.test_t, 0, "Testing default of new rec");
}
prr_rec.read_from_bytes(&empty_raw_data, &ByteOrder::LittleEndian);
let prr_view =
StdfRecordView::read_from_bytes(rec_header, &empty_raw_data, &ByteOrder::LittleEndian);
if let StdfRecord::PRR(ref inner) = prr_rec {
assert_eq!(inner.soft_bin, 65535, "Testing default value after reading");
assert_eq!(inner.x_coord, -32768, "Testing default value after reading");
assert_eq!(inner.y_coord, -32768, "Testing default value after reading");
assert_eq!(inner.test_t, 0, "Testing default value after reading");
if let StdfRecordView::PRR(v) = prr_view {
assert_eq!(
v.soft_bin(),
inner.soft_bin,
"Testing default value of PRRView and PRR"
);
assert_eq!(
v.x_coord(),
inner.x_coord,
"Testing default value of PRRView and PRR"
);
assert_eq!(
v.y_coord(),
inner.y_coord,
"Testing default value of PRRView and PRR"
);
assert_eq!(
v.test_t(),
inner.test_t,
"Testing default value of PRRView and PRR"
);
}
}
let (typ, sub) = get_typ_sub_from_code(REC_TSR).unwrap();
let rec_header = RecordHeader {
typ,
sub,
len: empty_raw_data.len() as u16,
};
let mut tsr_rec = StdfRecord::new(REC_TSR);
if let StdfRecord::TSR(ref inner) = tsr_rec {
assert_eq!(inner.test_typ, ' ', "Testing default of new rec");
assert_eq!(inner.exec_cnt, 4_294_967_295, "Testing default of new rec");
assert_eq!(inner.fail_cnt, 4_294_967_295, "Testing default of new rec");
assert_eq!(inner.alrm_cnt, 4_294_967_295, "Testing default of new rec");
}
tsr_rec.read_from_bytes(&empty_raw_data, &ByteOrder::LittleEndian);
let tsr_view =
StdfRecordView::read_from_bytes(rec_header, &empty_raw_data, &ByteOrder::LittleEndian);
if let StdfRecord::TSR(ref inner) = tsr_rec {
assert_eq!(inner.test_typ, ' ', "Testing default value after reading");
assert_eq!(
inner.exec_cnt, 4_294_967_295,
"Testing default value after reading"
);
assert_eq!(
inner.fail_cnt, 4_294_967_295,
"Testing default value after reading"
);
assert_eq!(
inner.alrm_cnt, 4_294_967_295,
"Testing default value after reading"
);
if let StdfRecordView::TSR(v) = tsr_view {
assert_eq!(
v.test_typ(),
inner.test_typ,
"Testing default value of TSRView and TSR"
);
assert_eq!(
v.exec_cnt(),
inner.exec_cnt,
"Testing default value of TSRView and TSR"
);
assert_eq!(
v.fail_cnt(),
inner.fail_cnt,
"Testing default value of TSRView and TSR"
);
assert_eq!(
v.alrm_cnt(),
inner.alrm_cnt,
"Testing default value of TSRView and TSR"
);
}
}
let (typ, sub) = get_typ_sub_from_code(REC_FTR).unwrap();
let rec_header = RecordHeader {
typ,
sub,
len: empty_raw_data.len() as u16,
};
let mut ftr_rec = StdfRecord::new(REC_FTR);
if let StdfRecord::FTR(ref inner) = ftr_rec {
assert_eq!(inner.patg_num, 255, "Testing default of new rec");
}
ftr_rec.read_from_bytes(&empty_raw_data, &ByteOrder::LittleEndian);
let ftr_view =
StdfRecordView::read_from_bytes(rec_header, &empty_raw_data, &ByteOrder::LittleEndian);
if let StdfRecord::FTR(ref inner) = ftr_rec {
assert_eq!(inner.patg_num, 255, "Testing default value after reading");
if let StdfRecordView::FTR(v) = ftr_view {
assert_eq!(
v.patg_num(),
inner.patg_num,
"Testing default value of FTRView and FTR"
);
}
}
}
#[test]
fn record_view_eq_record_test() {
let order = ByteOrder::LittleEndian;
{
let raw = vec![
2, 4, ];
let mut r = FAR::new();
r.read_from_bytes(&raw, &order);
let v = FARView::new(&raw, &order);
eq!(r, v; cpu_type, stdf_ver);
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&0x12345678u32.to_le_bytes()); cn(&mut raw, "CMD"); let mut r = ATR::new();
r.read_from_bytes(&raw, &order);
let v = ATRView::new(&raw, &order);
eq!(r, v; mod_tim);
eq_str!(r, v; cmd_line);
}
{
let mut raw = Vec::new();
cn(&mut raw, "VUR1"); let mut r = VUR::new();
r.read_from_bytes(&raw, &order);
let v = VURView::new(&raw, &order);
eq_str!(r, v; upd_nam);
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&100u32.to_le_bytes()); raw.extend_from_slice(&200u32.to_le_bytes()); raw.push(3); raw.push(b'M'); raw.push(b'R'); raw.push(b'P'); raw.extend_from_slice(&60u16.to_le_bytes()); raw.push(b'C'); cn(&mut raw, "LOT1"); cn(&mut raw, "PART1"); cn(&mut raw, "NODE"); cn(&mut raw, "TSTR"); cn(&mut raw, "JOB"); cn(&mut raw, "REV"); cn(&mut raw, "SBLOT"); cn(&mut raw, "OPER"); cn(&mut raw, "EXEC"); cn(&mut raw, "VER"); cn(&mut raw, "TEST"); cn(&mut raw, "TEMP"); cn(&mut raw, "USER"); cn(&mut raw, "AUX"); cn(&mut raw, "PKG"); cn(&mut raw, "FAM"); cn(&mut raw, "DATE"); cn(&mut raw, "FAC"); cn(&mut raw, "FLOOR"); cn(&mut raw, "PROC"); cn(&mut raw, "FREQ"); cn(&mut raw, "SPEC"); cn(&mut raw, "SVER"); cn(&mut raw, "FLOW"); cn(&mut raw, "SETUP"); cn(&mut raw, "DSGN"); cn(&mut raw, "ENG"); cn(&mut raw, "ROM"); cn(&mut raw, "SERL"); cn(&mut raw, "SUPR"); let mut r = MIR::new();
r.read_from_bytes(&raw, &order);
let v = MIRView::new(&raw, &order);
eq!(r, v; setup_t, start_t, stat_num, mode_cod, rtst_cod, prot_cod, burn_tim, cmod_cod);
eq_str!(r, v;
lot_id, part_typ, node_nam, tstr_typ, job_nam, job_rev, sblot_id, oper_nam,
exec_typ, exec_ver, test_cod, tst_temp, user_txt, aux_file, pkg_typ, famly_id,
date_cod, facil_id, floor_id, proc_id, oper_frq, spec_nam, spec_ver, flow_id,
setup_id, dsgn_rev, eng_id, rom_cod, serl_num, supr_nam
);
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&999u32.to_le_bytes()); raw.push(b'D'); cn(&mut raw, "USD"); cn(&mut raw, "EXD"); let mut r = MRR::new();
r.read_from_bytes(&raw, &order);
let v = MRRView::new(&raw, &order);
eq!(r, v; finish_t, disp_cod);
eq_str!(r, v; usr_desc, exc_desc);
}
{
let mut raw = Vec::new();
raw.push(1); raw.push(2); raw.extend_from_slice(&5u32.to_le_bytes()); raw.extend_from_slice(&1u32.to_le_bytes()); raw.extend_from_slice(&2u32.to_le_bytes()); raw.extend_from_slice(&3u32.to_le_bytes()); raw.extend_from_slice(&4u32.to_le_bytes()); let mut r = PCR::new();
r.read_from_bytes(&raw, &order);
let v = PCRView::new(&raw, &order);
eq!(r, v; head_num, site_num, part_cnt, rtst_cnt, abrt_cnt, good_cnt, func_cnt);
}
{
let mut raw = Vec::new();
raw.push(1); raw.push(2); raw.extend_from_slice(&3u16.to_le_bytes()); raw.extend_from_slice(&4u32.to_le_bytes()); raw.push(b'P'); cn(&mut raw, "HBIN"); let mut r = HBR::new();
r.read_from_bytes(&raw, &order);
let v = HBRView::new(&raw, &order);
eq!(r, v; head_num, site_num, hbin_num, hbin_cnt, hbin_pf);
eq_str!(r, v; hbin_nam);
}
{
let mut raw = Vec::new();
raw.push(1); raw.push(2); raw.extend_from_slice(&3u16.to_le_bytes()); raw.extend_from_slice(&4u32.to_le_bytes()); raw.push(b'F'); cn(&mut raw, "SBIN"); let mut r = SBR::new();
r.read_from_bytes(&raw, &order);
let v = SBRView::new(&raw, &order);
eq!(r, v; head_num, site_num, sbin_num, sbin_cnt, sbin_pf);
eq_str!(r, v; sbin_nam);
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&1u16.to_le_bytes()); raw.extend_from_slice(&2u16.to_le_bytes()); cn(&mut raw, "CHN"); cn(&mut raw, "PHY"); cn(&mut raw, "LOG"); raw.push(3); raw.push(4); let mut r = PMR::new();
r.read_from_bytes(&raw, &order);
let v = PMRView::new(&raw, &order);
eq!(r, v; pmr_indx, chan_typ, head_num, site_num);
eq_str!(r, v; chan_nam, phy_nam, log_nam);
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&7u16.to_le_bytes()); cn(&mut raw, "GRP"); raw.extend_from_slice(&2u16.to_le_bytes()); raw.extend_from_slice(&10u16.to_le_bytes()); raw.extend_from_slice(&20u16.to_le_bytes()); let mut r = PGR::new();
r.read_from_bytes(&raw, &order);
let v = PGRView::new(&raw, &order);
eq!(r, v; grp_indx, indx_cnt, pmr_indx);
eq_str!(r, v; grp_nam);
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&2u16.to_le_bytes()); raw.extend_from_slice(&1u16.to_le_bytes()); raw.extend_from_slice(&2u16.to_le_bytes()); raw.extend_from_slice(&3u16.to_le_bytes()); raw.extend_from_slice(&4u16.to_le_bytes()); raw.push(5); raw.push(6); cn(&mut raw, "P1"); cn(&mut raw, "P2"); cn(&mut raw, "R1"); cn(&mut raw, "R2"); cn(&mut raw, "C1"); cn(&mut raw, "C2"); cn(&mut raw, "D1"); cn(&mut raw, "D2"); let mut r = PLR::new();
r.read_from_bytes(&raw, &order);
let v = PLRView::new(&raw, &order);
eq!(r, v; grp_cnt, grp_indx, grp_mode, grp_radx);
eq_str!(r, v; pgm_char, rtn_char, pgm_chal, rtn_chal);
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&2u16.to_le_bytes()); raw.extend_from_slice(&5u16.to_le_bytes()); raw.extend_from_slice(&6u16.to_le_bytes()); let mut r = RDR::new();
r.read_from_bytes(&raw, &order);
let v = RDRView::new(&raw, &order);
eq!(r, v; num_bins, rtst_bin);
}
{
let mut raw = vec![
1, 2, 2, 3, 4, ];
cn(&mut raw, "HANDT"); cn(&mut raw, "HANDID"); cn(&mut raw, "CARDT"); cn(&mut raw, "CARDID"); cn(&mut raw, "LOADT"); cn(&mut raw, "LOADID"); cn(&mut raw, "DIBT"); cn(&mut raw, "DIBID"); cn(&mut raw, "CABLT"); cn(&mut raw, "CABLID"); cn(&mut raw, "CONTT"); cn(&mut raw, "CONTID"); cn(&mut raw, "LASRT"); cn(&mut raw, "LASRID"); cn(&mut raw, "EXTRT"); cn(&mut raw, "EXTRID"); let mut r = SDR::new();
r.read_from_bytes(&raw, &order);
let v = SDRView::new(&raw, &order);
eq!(r, v; head_num, site_grp, site_cnt, site_num);
eq_str!(r, v;
hand_typ, hand_id, card_typ, card_id, load_typ, load_id, dib_typ, dib_id,
cabl_typ, cabl_id, cont_typ, cont_id, lasr_typ, lasr_id, extr_typ, extr_id
);
}
{
let mut raw = Vec::new();
raw.push(0); raw.extend_from_slice(&1u16.to_le_bytes()); cn(&mut raw, "PSR"); raw.push(0); raw.extend_from_slice(&10u16.to_le_bytes()); raw.extend_from_slice(&2u16.to_le_bytes()); raw.extend_from_slice(&100u64.to_le_bytes()); raw.extend_from_slice(&200u64.to_le_bytes()); raw.extend_from_slice(&300u64.to_le_bytes()); raw.extend_from_slice(&400u64.to_le_bytes()); cn(&mut raw, "PF1"); cn(&mut raw, "PF2"); cn(&mut raw, "PL1"); cn(&mut raw, "PL2"); cn(&mut raw, "FU1"); cn(&mut raw, "FU2"); cn(&mut raw, "AD1"); cn(&mut raw, "AD2"); cn(&mut raw, "SR1"); cn(&mut raw, "SR2"); let mut r = PSR::new();
r.read_from_bytes(&raw, &order);
let v = PSRView::new(&raw, &order);
eq!(r, v; cont_flg, psr_indx, opt_flg, totp_cnt, locp_cnt, pat_bgn, pat_end);
eq_str!(r, v; pat_file, pat_lbl, file_uid, atpg_dsc, src_id);
eq_str!(r, v; psr_nam);
}
{
let mut raw = Vec::new();
raw.push(0); raw.extend_from_slice(&8u16.to_le_bytes()); raw.extend_from_slice(&2u16.to_le_bytes()); raw.extend_from_slice(&1u16.to_le_bytes()); raw.extend_from_slice(&2u16.to_le_bytes()); cn(&mut raw, "AN1"); cn(&mut raw, "AN2"); let mut r = NMR::new();
r.read_from_bytes(&raw, &order);
let v = NMRView::new(&raw, &order);
eq!(r, v; cont_flg, totm_cnt, locm_cnt, pmr_indx);
eq_str!(r, v; atpg_nam);
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&3u16.to_le_bytes()); raw.extend_from_slice(&0xFFFFFFFFu32.to_le_bytes()); sn(&mut raw, "CELL1"); let mut r = CNR::new();
r.read_from_bytes(&raw, &order);
let v = CNRView::new(&raw, &order);
eq!(r, v; chn_num, bit_pos);
eq_str!(r, v; cell_nam);
}
{
let mut raw = Vec::new();
cn(&mut raw, "SSR"); raw.extend_from_slice(&2u16.to_le_bytes()); raw.extend_from_slice(&1u16.to_le_bytes()); raw.extend_from_slice(&2u16.to_le_bytes()); let mut r = SSR::new();
r.read_from_bytes(&raw, &order);
let v = SSRView::new(&raw, &order);
eq!(r, v; chn_cnt, chn_list);
eq_str!(r, v; ssr_nam);
}
{
let mut raw = Vec::new();
raw.push(0); raw.extend_from_slice(&1u16.to_le_bytes()); cn(&mut raw, "CHN"); raw.extend_from_slice(&100u32.to_le_bytes()); raw.extend_from_slice(&2u16.to_le_bytes()); raw.extend_from_slice(&3u16.to_le_bytes()); raw.push(1); raw.extend_from_slice(&4u16.to_le_bytes()); raw.push(1); raw.extend_from_slice(&5u16.to_le_bytes()); raw.push(0); raw.extend_from_slice(&2u16.to_le_bytes()); sn(&mut raw, "CELL_A"); sn(&mut raw, "CELL_B"); let mut r = CDR::new();
r.read_from_bytes(&raw, &order);
let v = CDRView::new(&raw, &order);
eq!(r, v; cont_flg, cdr_indx, chn_len, sin_pin, sout_pin, mstr_cnt, m_clks, slav_cnt, s_clks, inv_val, lst_cnt);
eq_str!(r, v; cell_lst);
eq_str!(r, v; chn_nam);
}
{
let mut raw = Vec::new();
raw.push(1); raw.push(2); raw.extend_from_slice(&1000u32.to_le_bytes()); cn(&mut raw, "WAFER"); let mut r = WIR::new();
r.read_from_bytes(&raw, &order);
let v = WIRView::new(&raw, &order);
eq!(r, v; head_num, site_grp, start_t);
eq_str!(r, v; wafer_id);
}
{
let mut raw = Vec::new();
raw.push(1); raw.push(2); raw.extend_from_slice(&2000u32.to_le_bytes()); raw.extend_from_slice(&5u32.to_le_bytes()); raw.extend_from_slice(&1u32.to_le_bytes()); raw.extend_from_slice(&2u32.to_le_bytes()); raw.extend_from_slice(&3u32.to_le_bytes()); raw.extend_from_slice(&4u32.to_le_bytes()); cn(&mut raw, "W1"); cn(&mut raw, "F1"); cn(&mut raw, "FR1"); cn(&mut raw, "M1"); cn(&mut raw, "UD"); cn(&mut raw, "ED"); let mut r = WRR::new();
r.read_from_bytes(&raw, &order);
let v = WRRView::new(&raw, &order);
eq!(r, v; head_num, site_grp, finish_t, part_cnt, rtst_cnt, abrt_cnt, good_cnt, func_cnt);
eq_str!(r, v; wafer_id, fabwf_id, frame_id, mask_id, usr_desc, exc_desc);
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&300.0f32.to_le_bytes()); raw.extend_from_slice(&10.0f32.to_le_bytes()); raw.extend_from_slice(&20.0f32.to_le_bytes()); raw.push(1); raw.push(b'F'); raw.extend_from_slice(&(-5i16).to_le_bytes()); raw.extend_from_slice(&(7i16).to_le_bytes()); raw.push(b'X'); raw.push(b'Y'); let mut r = WCR::new();
r.read_from_bytes(&raw, &order);
let v = WCRView::new(&raw, &order);
eq!(r, v; wafr_siz, die_ht, die_wid, wf_units, wf_flat, center_x, center_y, pos_x, pos_y);
}
{
let raw = vec![
1, 2, ];
let mut r = PIR::new();
r.read_from_bytes(&raw, &order);
let v = PIRView::new(&raw, &order);
eq!(r, v; head_num, site_num);
}
{
let mut raw = Vec::new();
raw.push(1); raw.push(2); raw.push(0); raw.extend_from_slice(&5u16.to_le_bytes()); raw.extend_from_slice(&6u16.to_le_bytes()); raw.extend_from_slice(&7u16.to_le_bytes()); raw.extend_from_slice(&(-3i16).to_le_bytes()); raw.extend_from_slice(&(4i16).to_le_bytes()); raw.extend_from_slice(&1000u32.to_le_bytes()); cn(&mut raw, "PID"); cn(&mut raw, "PTXT"); bn(&mut raw, &[1, 2, 3]); let mut r = PRR::new();
r.read_from_bytes(&raw, &order);
let v = PRRView::new(&raw, &order);
eq!(r, v; head_num, site_num, part_flg, num_test, hard_bin, soft_bin, x_coord, y_coord, test_t);
eq_str!(r, v; part_id, part_txt);
assert_eq!(r.part_fix, v.part_fix().to_owned());
}
{
let mut raw = Vec::new();
raw.push(1); raw.push(2); raw.push(b'P'); raw.extend_from_slice(&100u32.to_le_bytes()); raw.extend_from_slice(&10u32.to_le_bytes()); raw.extend_from_slice(&3u32.to_le_bytes()); raw.extend_from_slice(&0u32.to_le_bytes()); cn(&mut raw, "VDD"); cn(&mut raw, "SEQ"); cn(&mut raw, "L1"); raw.push(0); raw.extend_from_slice(&1.5f32.to_le_bytes()); raw.extend_from_slice(&(-2.0f32).to_le_bytes()); raw.extend_from_slice(&5.0f32.to_le_bytes()); raw.extend_from_slice(&12.0f32.to_le_bytes()); raw.extend_from_slice(&30.0f32.to_le_bytes()); let mut r = TSR::new();
r.read_from_bytes(&raw, &order);
let v = TSRView::new(&raw, &order);
eq!(r, v; head_num, site_num, test_typ, test_num, exec_cnt, fail_cnt, alrm_cnt, opt_flag, test_tim, test_min, test_max, tst_sums, tst_sqrs);
eq_str!(r, v; test_nam, seq_name, test_lbl);
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&9u32.to_le_bytes()); raw.push(1); raw.push(2); raw.push(0); raw.push(0); raw.extend_from_slice(&1.5f32.to_le_bytes()); cn(&mut raw, "TEST"); cn(&mut raw, "ALM"); raw.push(1); raw.push((-2i8) as u8); raw.push((-3i8) as u8); raw.push((-4i8) as u8); raw.extend_from_slice(&(-1.0f32).to_le_bytes()); raw.extend_from_slice(&10.0f32.to_le_bytes()); cn(&mut raw, "V"); cn(&mut raw, "%f"); cn(&mut raw, "%g"); cn(&mut raw, "%h"); raw.extend_from_slice(&(-5.0f32).to_le_bytes()); raw.extend_from_slice(&50.0f32.to_le_bytes()); let mut r = PTR::new();
r.read_from_bytes(&raw, &order);
let v = PTRView::new(&raw, &order);
eq!(r, v; test_num, head_num, site_num, test_flg, parm_flg, result);
eq_str!(r, v; test_txt, alarm_id);
assert_eq!(r.opt_flag, v.opt_flag());
assert_eq!(r.res_scal, v.res_scal());
assert_eq!(r.llm_scal, v.llm_scal());
assert_eq!(r.hlm_scal, v.hlm_scal());
assert!(f32_opt_eq(r.lo_limit, v.lo_limit()));
assert!(f32_opt_eq(r.hi_limit, v.hi_limit()));
assert_eq!(r.units, v.units().map(|c| c.to_owned()));
assert_eq!(r.c_resfmt, v.c_resfmt().map(|c| c.to_owned()));
assert_eq!(r.c_llmfmt, v.c_llmfmt().map(|c| c.to_owned()));
assert_eq!(r.c_hlmfmt, v.c_hlmfmt().map(|c| c.to_owned()));
assert!(f32_opt_eq(r.lo_spec, v.lo_spec()));
assert!(f32_opt_eq(r.hi_spec, v.hi_spec()));
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&42u32.to_le_bytes()); raw.push(1); raw.push(2); raw.push(0); raw.push(0); raw.extend_from_slice(&2u16.to_le_bytes()); raw.extend_from_slice(&2u16.to_le_bytes()); raw.push(0x21); raw.extend_from_slice(&1.0f32.to_le_bytes()); raw.extend_from_slice(&2.0f32.to_le_bytes()); cn(&mut raw, "T1"); cn(&mut raw, "A1"); raw.push(1); raw.push((-1i8) as u8); raw.push((-2i8) as u8); raw.push((-3i8) as u8); raw.extend_from_slice(&0.0f32.to_le_bytes()); raw.extend_from_slice(&10.0f32.to_le_bytes()); raw.extend_from_slice(&1.0f32.to_le_bytes()); raw.extend_from_slice(&2.0f32.to_le_bytes()); raw.extend_from_slice(&1u16.to_le_bytes()); raw.extend_from_slice(&2u16.to_le_bytes()); cn(&mut raw, "V"); cn(&mut raw, "U"); cn(&mut raw, "%f"); cn(&mut raw, "%g"); cn(&mut raw, "%h"); raw.extend_from_slice(&0.0f32.to_le_bytes()); raw.extend_from_slice(&100.0f32.to_le_bytes()); let mut r = MPR::new();
r.read_from_bytes(&raw, &order);
let v = MPRView::new(&raw, &order);
eq!(r, v; test_num, head_num, site_num, test_flg, parm_flg, rtn_icnt, rslt_cnt, rtn_stat);
assert!(f32_vec_eq(&r.rtn_rslt, &v.rtn_rslt()));
eq_str!(r, v; test_txt, alarm_id);
assert_eq!(r.opt_flag, v.opt_flag());
assert_eq!(r.res_scal, v.res_scal());
assert_eq!(r.llm_scal, v.llm_scal());
assert_eq!(r.hlm_scal, v.hlm_scal());
assert!(f32_opt_eq(r.lo_limit, v.lo_limit()));
assert!(f32_opt_eq(r.hi_limit, v.hi_limit()));
assert!(f32_opt_eq(r.start_in, v.start_in()));
assert!(f32_opt_eq(r.incr_in, v.incr_in()));
assert_eq!(r.rtn_indx, v.rtn_indx());
assert_eq!(r.units, v.units().map(|c| c.to_owned()));
assert_eq!(r.units_in, v.units_in().map(|c| c.to_owned()));
assert_eq!(r.c_resfmt, v.c_resfmt().map(|c| c.to_owned()));
assert_eq!(r.c_llmfmt, v.c_llmfmt().map(|c| c.to_owned()));
assert_eq!(r.c_hlmfmt, v.c_hlmfmt().map(|c| c.to_owned()));
assert!(f32_opt_eq(r.lo_spec, v.lo_spec()));
assert!(f32_opt_eq(r.hi_spec, v.hi_spec()));
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&1u32.to_le_bytes()); raw.push(1); raw.push(2); raw.push(0); raw.push(0); raw.extend_from_slice(&10u32.to_le_bytes()); raw.extend_from_slice(&20u32.to_le_bytes()); raw.extend_from_slice(&30u32.to_le_bytes()); raw.extend_from_slice(&40u32.to_le_bytes()); raw.extend_from_slice(&(-50i32).to_le_bytes()); raw.extend_from_slice(&(60i32).to_le_bytes()); raw.extend_from_slice(&(-70i16).to_le_bytes()); raw.extend_from_slice(&2u16.to_le_bytes()); raw.extend_from_slice(&2u16.to_le_bytes()); raw.extend_from_slice(&1u16.to_le_bytes()); raw.extend_from_slice(&2u16.to_le_bytes()); raw.push(0x21); raw.extend_from_slice(&3u16.to_le_bytes()); raw.extend_from_slice(&4u16.to_le_bytes()); raw.push(0x43); dn(&mut raw, 8, &[0b10101010]); cn(&mut raw, "VN"); cn(&mut raw, "TS"); cn(&mut raw, "OP"); cn(&mut raw, "TT"); cn(&mut raw, "AL"); cn(&mut raw, "PT"); cn(&mut raw, "RT"); raw.push(255); dn(&mut raw, 8, &[0b01010101]); let mut r = FTR::new();
r.read_from_bytes(&raw, &order);
let v = FTRView::new(&raw, &order);
eq!(r, v; test_num, head_num, site_num, test_flg, opt_flag, cycl_cnt, rel_vadr, rept_cnt, num_fail, xfail_ad, yfail_ad, vect_off, rtn_icnt, pgm_icnt, rtn_indx, rtn_stat, pgm_indx, pgm_stat, patg_num);
assert_eq!(r.fail_pin, v.fail_pin().to_owned());
eq_str!(r, v; vect_nam, time_set, op_code, test_txt, alarm_id, prog_txt, rslt_txt);
assert_eq!(r.spin_map, v.spin_map().to_owned());
}
{
let mut raw = Vec::new();
raw.push(0); raw.extend_from_slice(&1u32.to_le_bytes()); raw.push(1); raw.push(2); raw.extend_from_slice(&3u16.to_le_bytes()); raw.push(0); cn(&mut raw, "LOG"); cn(&mut raw, "TXT"); cn(&mut raw, "ALM"); cn(&mut raw, "PRG"); cn(&mut raw, "RSL"); raw.push(1); raw.push(0); dn(&mut raw, 8, &[0xFF]); dn(&mut raw, 8, &[0x0F]); raw.extend_from_slice(&1000u64.to_le_bytes()); raw.extend_from_slice(&10u32.to_le_bytes()); raw.extend_from_slice(&20u32.to_le_bytes()); raw.extend_from_slice(&2000u64.to_le_bytes()); raw.extend_from_slice(&30u32.to_le_bytes()); raw.extend_from_slice(&1u16.to_le_bytes()); raw.extend_from_slice(&1u16.to_le_bytes()); raw.push(2); raw.push(1); raw.push(4); raw.push(4); raw.push(2); raw.push(1); raw.push(2); raw.push(4); raw.push(2); raw.extend_from_slice(&5u16.to_le_bytes()); raw.extend_from_slice(&6u16.to_le_bytes()); raw.extend_from_slice(&7u32.to_le_bytes()); cn(&mut raw, "COND"); raw.extend_from_slice(&1u16.to_le_bytes()); raw.extend_from_slice(&8u16.to_le_bytes()); raw.extend_from_slice(&1u16.to_le_bytes()); raw.push(9); raw.extend_from_slice(&1u16.to_le_bytes()); raw.extend_from_slice(&10u32.to_le_bytes()); raw.extend_from_slice(&1u16.to_le_bytes()); raw.push(11); raw.extend_from_slice(&1u16.to_le_bytes()); raw.push(12); raw.extend_from_slice(&1u16.to_le_bytes()); raw.push(13); raw.extend_from_slice(&1u16.to_le_bytes()); raw.extend_from_slice(&14u32.to_le_bytes()); raw.extend_from_slice(&1u16.to_le_bytes()); raw.extend_from_slice(&15u16.to_le_bytes()); raw.extend_from_slice(&1u16.to_le_bytes()); raw.push(16); raw.extend_from_slice(&1u16.to_le_bytes()); raw.extend_from_slice(&17u16.to_le_bytes()); raw.extend_from_slice(&1u16.to_le_bytes()); raw.extend_from_slice(&18u32.to_le_bytes()); raw.extend_from_slice(&1u16.to_le_bytes()); raw.extend_from_slice(b"TX"); let mut r = STR::new();
r.read_from_bytes(&raw, &order);
let v = STRView::new(&raw, &order);
eq!(r, v;
cont_flg, test_num, head_num, site_num, psr_ref, test_flg, z_val, fmu_flg,
cyc_cnt_t, totf_cnt, totl_cnt, cyc_base, bit_base, cond_cnt, lim_cnt, cyc_size,
pmr_size, chn_size, pat_size, bit_size, u1_size, u2_size, u3_size, utx_size, cap_bgn,
lim_indx, lim_spec, cyc_cnt, cyc_ofst, pmr_cnt, pmr_indx, chn_cnt, chn_num,
exp_cnt, exp_data, cap_cnt, cap_data, new_cnt, new_data, pat_cnt, pat_num, bpos_cnt,
bit_pos, usr1_cnt, usr1, usr2_cnt, usr2, usr3_cnt, usr3, txt_cnt
);
eq_str!(r, v; log_typ, test_txt, alarm_id, prog_txt, rslt_txt, cond_lst, user_txt);
assert_eq!(r.mask_map, v.mask_map().to_owned());
assert_eq!(r.fal_map, v.fal_map().to_owned());
}
{
let mut raw = Vec::new();
cn(&mut raw, "BPS1"); let mut r = BPS::new();
r.read_from_bytes(&raw, &order);
let v = BPSView::new(&raw, &order);
eq_str!(r, v; seq_name);
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&3u16.to_le_bytes()); raw.push(1); raw.push(5);
raw.push(2); raw.extend_from_slice(&0x1234u16.to_le_bytes());
raw.push(10); cn(&mut raw, "X");
let mut r = GDR::new();
r.read_from_bytes(&raw, &order);
let v = GDRView::new(&raw, &order);
eq!(r, v; fld_cnt, gen_data);
}
{
let mut raw = Vec::new();
cn(&mut raw, "DTR1"); let mut r = DTR::new();
r.read_from_bytes(&raw, &order);
let v = DTRView::new(&raw, &order);
eq_str!(r, v; text_dat);
}
}
#[test]
fn record_optional_field_truncation_test() {
let order = ByteOrder::LittleEndian;
{
let mut raw = Vec::new();
raw.extend_from_slice(&1u32.to_le_bytes()); raw.push(1); raw.push(2); raw.push(0); raw.push(0); raw.extend_from_slice(&1.5f32.to_le_bytes()); cn(&mut raw, "TEST"); cn(&mut raw, "ALM");
let mut r = PTR::new();
r.read_from_bytes(&raw, &order);
let v = PTRView::new(&raw, &order);
assert_eq!(r.opt_flag, None);
assert_eq!(r.opt_flag, v.opt_flag());
assert_eq!(r.res_scal, v.res_scal());
assert_eq!(r.llm_scal, v.llm_scal());
assert_eq!(r.hlm_scal, v.hlm_scal());
assert!(f32_opt_eq(r.lo_limit, v.lo_limit()));
assert!(f32_opt_eq(r.hi_limit, v.hi_limit()));
assert_eq!(r.units, v.units().map(|c| c.to_owned()));
assert_eq!(r.c_resfmt, v.c_resfmt().map(|c| c.to_owned()));
assert_eq!(r.c_llmfmt, v.c_llmfmt().map(|c| c.to_owned()));
assert_eq!(r.c_hlmfmt, v.c_hlmfmt().map(|c| c.to_owned()));
assert!(f32_opt_eq(r.lo_spec, v.lo_spec()));
assert!(f32_opt_eq(r.hi_spec, v.hi_spec()));
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&42u32.to_le_bytes()); raw.push(1); raw.push(2); raw.push(0); raw.push(0); raw.extend_from_slice(&0u16.to_le_bytes()); raw.extend_from_slice(&0u16.to_le_bytes()); cn(&mut raw, "T1"); cn(&mut raw, "A1");
let mut r = MPR::new();
r.read_from_bytes(&raw, &order);
let v = MPRView::new(&raw, &order);
assert_eq!(r.opt_flag, None);
assert_eq!(r.opt_flag, v.opt_flag());
assert_eq!(r.res_scal, v.res_scal());
assert_eq!(r.llm_scal, v.llm_scal());
assert_eq!(r.hlm_scal, v.hlm_scal());
assert!(f32_opt_eq(r.lo_limit, v.lo_limit()));
assert!(f32_opt_eq(r.hi_limit, v.hi_limit()));
assert!(f32_opt_eq(r.start_in, v.start_in()));
assert!(f32_opt_eq(r.incr_in, v.incr_in()));
assert_eq!(r.rtn_indx, v.rtn_indx());
assert_eq!(r.units, v.units().map(|c| c.to_owned()));
assert_eq!(r.units_in, v.units_in().map(|c| c.to_owned()));
assert_eq!(r.c_resfmt, v.c_resfmt().map(|c| c.to_owned()));
assert_eq!(r.c_llmfmt, v.c_llmfmt().map(|c| c.to_owned()));
assert_eq!(r.c_hlmfmt, v.c_hlmfmt().map(|c| c.to_owned()));
assert!(f32_opt_eq(r.lo_spec, v.lo_spec()));
assert!(f32_opt_eq(r.hi_spec, v.hi_spec()));
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&1u32.to_le_bytes()); raw.push(1); raw.push(2); raw.push(0); raw.push(0); raw.extend_from_slice(&1.5f32.to_le_bytes()); cn(&mut raw, "TEST"); cn(&mut raw, "ALM"); raw.push(1); raw.push(2); raw.push(3); raw.push(4); let lo_limit_bytes = (-1.0f32).to_le_bytes();
raw.extend_from_slice(&lo_limit_bytes[..2]);
let mut r = PTR::new();
r.read_from_bytes(&raw, &order);
let v = PTRView::new(&raw, &order);
assert_eq!(r.lo_limit, None);
assert!(f32_opt_eq(r.lo_limit, v.lo_limit()));
assert!(f32_opt_eq(r.hi_limit, v.hi_limit()));
}
{
let mut raw = Vec::new();
raw.extend_from_slice(&42u32.to_le_bytes()); raw.push(1); raw.push(2); raw.push(0); raw.push(0); raw.extend_from_slice(&2u16.to_le_bytes()); raw.extend_from_slice(&2u16.to_le_bytes()); raw.push(0x21); raw.extend_from_slice(&1.0f32.to_le_bytes()); raw.extend_from_slice(&2.0f32.to_le_bytes()); cn(&mut raw, "T1"); cn(&mut raw, "A1"); raw.push(1); raw.push(2); raw.push(3); raw.push(4); raw.extend_from_slice(&0.0f32.to_le_bytes()); raw.extend_from_slice(&10.0f32.to_le_bytes()); raw.extend_from_slice(&1.0f32.to_le_bytes()); raw.extend_from_slice(&2.0f32.to_le_bytes()); raw.extend_from_slice(&1u16.to_le_bytes());
let mut r = MPR::new();
r.read_from_bytes(&raw, &order);
let v = MPRView::new(&raw, &order);
assert_eq!(r.rtn_indx, None);
assert_eq!(r.rtn_indx, v.rtn_indx());
assert!(f32_opt_eq(r.lo_limit, v.lo_limit()));
assert!(f32_opt_eq(r.hi_limit, v.hi_limit()));
}
}
#[test]
fn record_cn_ref_str_test() {
use std::borrow::Cow;
let order = ByteOrder::LittleEndian;
let mut raw = Vec::new();
raw.push(1); raw.push(2); raw.push(b'P'); raw.extend_from_slice(&100u32.to_le_bytes()); raw.extend_from_slice(&10u32.to_le_bytes()); raw.extend_from_slice(&3u32.to_le_bytes()); raw.extend_from_slice(&0u32.to_le_bytes()); raw.extend_from_slice(&[2, b'A', b'B']); raw.extend_from_slice(&[2, 0xC3, 0xA9]); raw.extend_from_slice(&[2, 0xB0, b'C']); raw.push(0); raw.extend_from_slice(&1.5f32.to_le_bytes()); raw.extend_from_slice(&(-2.0f32).to_le_bytes()); raw.extend_from_slice(&5.0f32.to_le_bytes()); raw.extend_from_slice(&12.0f32.to_le_bytes()); raw.extend_from_slice(&30.0f32.to_le_bytes());
let view = TSRView::new(&raw, &order);
let name = view.test_nam().as_str();
assert!(matches!(&name, Cow::Borrowed(_)));
assert_eq!(name, "AB");
assert_eq!(name.into_owned(), view.test_nam().to_owned());
let seq = view.seq_name().as_str();
assert!(matches!(&seq, Cow::Borrowed(_)));
assert_eq!(seq, "é");
assert_eq!(seq.into_owned(), view.seq_name().to_owned());
let lbl = view.test_lbl().as_str();
assert!(matches!(&lbl, Cow::Owned(_)));
assert_eq!(lbl, "\u{00B0}C");
assert_eq!(lbl.into_owned(), view.test_lbl().to_owned());
}
#[test]
fn record_kx_cn_ref_test() {
use std::borrow::Cow;
let order = ByteOrder::LittleEndian;
let mut raw = Vec::new();
raw.extend_from_slice(&3u16.to_le_bytes()); raw.extend_from_slice(&1u16.to_le_bytes()); raw.extend_from_slice(&2u16.to_le_bytes()); raw.extend_from_slice(&3u16.to_le_bytes()); raw.extend_from_slice(&4u16.to_le_bytes()); raw.extend_from_slice(&5u16.to_le_bytes()); raw.extend_from_slice(&6u16.to_le_bytes()); raw.push(7); raw.push(8); raw.push(9); cn(&mut raw, "AB"); cn(&mut raw, "é"); raw.push(2); raw.push(0xB0);
raw.push(b'C');
cn(&mut raw, "X"); cn(&mut raw, "Y");
cn(&mut raw, "Z");
cn(&mut raw, "A"); cn(&mut raw, "B");
cn(&mut raw, "C");
cn(&mut raw, "D"); cn(&mut raw, "E");
cn(&mut raw, "F");
let mut r = PLR::new();
r.read_from_bytes(&raw, &order);
let v = PLRView::new(&raw, &order);
let kx = v.pgm_char();
assert_eq!(kx.len(), 3);
let s0 = kx.get_str(0).unwrap();
assert!(matches!(&s0, Cow::Borrowed(_)));
assert_eq!(s0, "AB");
let s1 = kx.get_str(1).unwrap();
assert!(matches!(&s1, Cow::Borrowed(_)));
assert_eq!(s1, "é");
let s2 = kx.get_str(2).unwrap();
assert!(matches!(&s2, Cow::Owned(_)));
assert_eq!(s2, "\u{00B0}C");
assert_eq!(kx.get_bytes(2), Some(&[0xB0, b'C'][..]));
assert_eq!(kx.get_str(3), None);
assert_eq!(kx.get_bytes(3), None);
assert_eq!(kx.as_vec().len(), 3);
assert_eq!(kx.to_owned(), r.pgm_char);
let mut seen = Vec::new();
for s in &kx {
seen.push(s);
}
assert_eq!(seen, kx.as_vec());
}
#[test]
fn record_kx_sn_ref_test() {
use std::borrow::Cow;
let order = ByteOrder::LittleEndian;
let mut raw = Vec::new();
raw.push(0); raw.extend_from_slice(&1u16.to_le_bytes()); cn(&mut raw, "CHN"); raw.extend_from_slice(&100u32.to_le_bytes()); raw.extend_from_slice(&2u16.to_le_bytes()); raw.extend_from_slice(&3u16.to_le_bytes()); raw.push(0); raw.push(0); raw.push(0); raw.extend_from_slice(&3u16.to_le_bytes()); sn(&mut raw, "AB"); sn(&mut raw, "é"); raw.extend_from_slice(&2u16.to_le_bytes()); raw.push(0xB0);
raw.push(b'C');
let mut r = CDR::new();
r.read_from_bytes(&raw, &order);
let v = CDRView::new(&raw, &order);
let kx = v.cell_lst();
assert_eq!(kx.len(), 3);
assert!(matches!(&kx.get_str(0).unwrap(), Cow::Borrowed(_)));
assert_eq!(kx.get_str(0).unwrap(), "AB");
assert!(matches!(&kx.get_str(1).unwrap(), Cow::Borrowed(_)));
assert_eq!(kx.get_str(1).unwrap(), "é");
assert!(matches!(&kx.get_str(2).unwrap(), Cow::Owned(_)));
assert_eq!(kx.get_str(2).unwrap(), "\u{00B0}C");
assert_eq!(kx.get_bytes(2), Some(&[0xB0, b'C'][..]));
assert_eq!(kx.to_owned(), r.cell_lst);
let mut seen = Vec::new();
for s in &kx {
seen.push(s);
}
assert_eq!(seen, kx.as_vec());
}
#[test]
fn record_kx_cf_ref_test() {
use std::borrow::Cow;
let order = ByteOrder::LittleEndian;
let mut raw = Vec::new();
raw.push(0); raw.extend_from_slice(&0u32.to_le_bytes()); raw.push(1); raw.push(2); raw.extend_from_slice(&0u16.to_le_bytes()); raw.push(0); cn(&mut raw, ""); cn(&mut raw, ""); cn(&mut raw, ""); cn(&mut raw, ""); cn(&mut raw, ""); raw.push(0); raw.push(0); dn(&mut raw, 0, &[]); dn(&mut raw, 0, &[]); raw.extend_from_slice(&0u64.to_le_bytes()); raw.extend_from_slice(&0u32.to_le_bytes()); raw.extend_from_slice(&0u32.to_le_bytes()); raw.extend_from_slice(&0u64.to_le_bytes()); raw.extend_from_slice(&0u32.to_le_bytes()); raw.extend_from_slice(&0u16.to_le_bytes()); raw.extend_from_slice(&0u16.to_le_bytes()); raw.push(1); raw.push(1); raw.push(1); raw.push(1); raw.push(1); raw.push(1); raw.push(1); raw.push(1); raw.push(3); raw.extend_from_slice(&0u16.to_le_bytes()); raw.extend_from_slice(&0u16.to_le_bytes()); raw.extend_from_slice(&0u16.to_le_bytes()); raw.extend_from_slice(&0u16.to_le_bytes()); raw.extend_from_slice(&0u16.to_le_bytes()); raw.extend_from_slice(&0u16.to_le_bytes()); raw.extend_from_slice(&0u16.to_le_bytes()); raw.extend_from_slice(&0u16.to_le_bytes()); raw.extend_from_slice(&0u16.to_le_bytes()); raw.extend_from_slice(&0u16.to_le_bytes()); raw.extend_from_slice(&0u16.to_le_bytes()); raw.extend_from_slice(&0u16.to_le_bytes()); raw.extend_from_slice(&3u16.to_le_bytes()); raw.extend_from_slice(b"AB "); raw.extend_from_slice(&[0xC3, 0xA9, b'X']); raw.extend_from_slice(&[0xB0, b'C', b' ']);
let mut r = STR::new();
r.read_from_bytes(&raw, &order);
let v = STRView::new(&raw, &order);
let kx = v.user_txt();
assert_eq!(kx.len(), 3);
assert!(matches!(&kx.get_str(0).unwrap(), Cow::Borrowed(_)));
assert_eq!(kx.get_str(0).unwrap(), "AB ");
assert!(matches!(&kx.get_str(1).unwrap(), Cow::Borrowed(_)));
assert_eq!(kx.get_str(1).unwrap(), "éX");
assert!(matches!(&kx.get_str(2).unwrap(), Cow::Owned(_)));
assert_eq!(kx.get_str(2).unwrap(), "\u{00B0}C ");
assert_eq!(kx.get_bytes(2), Some(&[0xB0, b'C', b' '][..]));
assert_eq!(kx.to_owned(), r.user_txt);
let mut seen = Vec::new();
for s in &kx {
seen.push(s);
}
assert_eq!(seen, kx.as_vec());
}