use vize_l0::id::NodeId;
use vize_l0::{Span, String};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ProvenanceRecord {
pub rule: String,
pub node: Option<NodeId>,
pub before: String,
pub after: String,
pub span: Span,
}
const _: () = {
const fn assert_owned<T: 'static>() {}
assert_owned::<ProvenanceRecord>();
};
#[cfg(target_pointer_width = "64")]
const _: () = assert!(core::mem::size_of::<ProvenanceRecord>() == 88);
#[cfg(test)]
mod tests {
use super::ProvenanceRecord;
use vize_l0::id::NodeId;
use vize_l0::{Span, String};
#[test]
fn a_producing_decision_links_its_op() {
let record = ProvenanceRecord {
rule: String::from("lower.for"),
node: NodeId::from_index(3),
before: String::from("item of items"),
after: String::from("ui.for source=js value=js"),
span: Span::new(12, 25),
};
assert_eq!(record.node, NodeId::from_index(3));
assert_eq!(record.before.as_str(), "item of items");
assert!(!record.after.is_empty());
}
#[test]
fn a_failed_decision_is_still_a_record() {
let record = ProvenanceRecord {
rule: String::from("defer.v-bind"),
node: None,
before: String::from(":id=\"x\""),
after: String::default(),
span: Span::new(5, 12),
};
assert_eq!(record.node, None);
assert!(record.after.is_empty());
assert_eq!(record.rule.as_str(), "defer.v-bind");
}
}