use super::*;
#[test]
fn every_bit_carries_its_word_and_its_wire_field() {
let table: Vec<_> = ingraph::flags::bits::<PacketFlags>()
.map(|bit| (bit.word, bit.field, bit.value))
.collect();
assert_eq!(
table
.iter()
.map(|(word, field, _)| (*word, *field))
.collect::<Vec<_>>(),
[
("KEY", "key"),
("CORRUPT", "corrupt"),
("DISCARD", "discard"),
],
);
assert_eq!(
table.iter().map(|(_, _, value)| *value).collect::<Vec<_>>(),
[PacketFlags::KEY, PacketFlags::CORRUPT, PacketFlags::DISCARD],
);
}
#[test]
fn the_field_list_names_every_declared_bit() {
use bitflags::Flags as _;
assert_eq!(
<PacketFlags as FlagsValue>::FIELDS.len(),
PacketFlags::FLAGS.len(),
"a field per bit, or the framework's zip drops the tail",
);
}
#[test]
fn the_schema_name_is_the_types_own() {
assert_eq!(<PacketFlags as FlagsValue>::GRAPHQL_NAME, "PacketFlags");
}
#[test]
fn the_cursor_round_trips_every_declared_pattern() {
for bits in 0..=0b111u8 {
let value = PacketFlags::from_bits(bits).expect("every pattern under the mask is declared");
let mut out = Vec::new();
value.write_cursor(&mut out);
assert_eq!(out, [bits], "one big-endian byte, and nothing framing it");
assert_eq!(PacketFlags::read_cursor(&out), Some(value));
}
}
#[test]
fn a_cursor_this_type_did_not_write_is_refused() {
assert_eq!(PacketFlags::read_cursor(&[]), None, "no bytes, no value");
assert_eq!(
PacketFlags::read_cursor(&[0, 1]),
None,
"two bytes are not this type's one",
);
assert_eq!(
PacketFlags::read_cursor(&[0b0_1000]),
None,
"an undeclared bit is refused rather than retained — a value the declaration cannot \
spell must not come back out of a client's string",
);
}
#[test]
fn two_values_are_one_column_value_when_their_bits_are() {
let key = PacketFlags::KEY;
let also_key = PacketFlags::from_bits_truncate(0b001);
let discard = PacketFlags::DISCARD;
assert!(key.column_eq(&also_key));
assert!(!key.column_eq(&discard));
assert!(PacketFlags::empty().column_eq(&PacketFlags::empty()));
}
#[test]
fn a_column_of_these_bits_needs_no_word_to_be_read() {
fn _infers_the_flags_reading(_: <PacketFlags as DefaultMarker>::Marker) {}
fn _infers_the_flags_filter(_: <PacketFlags as FlagsFilterMarker>::Filter) {}
fn _a_collection_infers_a_list(_: <PacketFlags as DefaultVecMarker>::Marker) {}
assert!(<PacketFlags as ColumnKind>::SEGMENTS.is_empty());
}