use printobserver_types::contract::declared;
use printobserver_types::{WireField, wire_fields};
type StatedField = (&'static str, &'static str, bool);
type StatedType = (&'static str, &'static [StatedField]);
const DECLARED_FIELDS: &[StatedType] = &[
("EventId", &[]),
("EventKind", &[]),
(
"EventBody",
&[("kind", "EventKind", true), ("payload", "any", true)],
),
(
"EventRecord",
&[
("id", "EventId", true),
("image", "ImageRef", false),
("kind", "EventKind", true),
("payload", "any", true),
("print_id", "PrintId", false),
("raw", "RawBytes", false),
("received_at", "Timestamp", true),
("source", "EventSource", true),
],
),
("EventSource", &[]),
("FileName", &[]),
("ImageId", &[]),
(
"ImageRef",
&[("id", "ImageId", true), ("sha256", "string", true)],
),
("PrintId", &[]),
("PrinterState", &[("unknown", "string", true)]),
("Range", &[("max", "number", true), ("min", "number", true)]),
("RawBytes", &[]),
(
"Reported",
&[("out_of_range", "boolean", true), ("value", "number", true)],
),
("Timestamp", &[]),
];
#[test]
fn every_declared_type_carries_exactly_the_stated_fields() {
for entry in declared() {
let expected = DECLARED_FIELDS
.iter()
.find(|(name, _)| *name == entry.name)
.unwrap_or_else(|| panic!("{} is declared but the contract table omits it", entry.name))
.1;
let expected: Vec<WireField> = expected
.iter()
.map(|(name, descriptor, required)| WireField {
name: (*name).to_owned(),
descriptor: (*descriptor).to_owned(),
required: *required,
})
.collect();
assert_eq!(
wire_fields(&entry.schema()),
expected,
"{} does not carry the stated fields",
entry.name
);
}
}
#[test]
fn the_contract_table_names_no_type_this_crate_does_not_declare() {
let declared: Vec<&str> = declared().into_iter().map(|entry| entry.name).collect();
for (name, _) in DECLARED_FIELDS {
assert!(
declared.contains(name),
"the table names {name}, which this crate does not declare"
);
}
assert_eq!(DECLARED_FIELDS.len(), declared.len());
}
#[test]
fn each_declared_name_is_the_name_its_schema_carries() {
for entry in declared() {
let schema = entry.schema();
let title = schema.get("title").and_then(|value| value.as_str());
assert_eq!(
title,
Some(entry.name),
"{} generates a schema titled {title:?}",
entry.name
);
}
}