#[cfg(test)]
mod fixtures {
#![allow(clippy::disallowed_methods)]
#[cfg(not(feature = "std"))]
use alloc::vec::Vec;
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
struct FixtureTerm(usize);
const NIL: FixtureTerm = FixtureTerm(0);
#[derive(Default)]
struct FixtureHeap {
cells: usize,
}
impl FixtureHeap {
fn alloc_cons(&mut self, head: FixtureTerm, tail: FixtureTerm) -> FixtureTerm {
self.cells += 1;
FixtureTerm(head.0 ^ tail.0 ^ self.cells)
}
fn alloc_tuple(&mut self, parts: &[FixtureTerm]) -> FixtureTerm {
self.cells += parts.len();
FixtureTerm(parts.iter().fold(self.cells, |acc, p| acc ^ p.0))
}
fn alloc_list(&mut self, items: &[FixtureTerm]) -> FixtureTerm {
self.cells += items.len();
FixtureTerm(items.iter().fold(self.cells, |acc, p| acc ^ p.0))
}
fn cells(&self) -> usize {
self.cells
}
}
fn s3a_collect_carrier(heap: &mut FixtureHeap, src: &[FixtureTerm]) -> FixtureTerm {
let s3a_mapped: Vec<_> = src.iter().map(|s| heap.alloc_cons(*s, NIL)).collect();
heap.alloc_list(&s3a_mapped)
}
fn s3b_match_expression_carrier(heap: &mut FixtureHeap, arms: usize) -> FixtureTerm {
let held = FixtureTerm(7);
let s3b_chosen = match arms {
0 => held,
_ => heap.alloc_cons(held, NIL),
};
heap.alloc_tuple(&[s3b_chosen, held])
}
fn s3c_literal_carrier(heap: &mut FixtureHeap, head: FixtureTerm) -> FixtureTerm {
let s3c_pair = [heap.alloc_cons(head, NIL), head];
heap.alloc_tuple(&s3c_pair)
}
fn s3d_reassignment_carrier(heap: &mut FixtureHeap, items: &[FixtureTerm]) -> FixtureTerm {
let mut s3d_acc = NIL;
for item in items {
s3d_acc = heap.alloc_cons(*item, s3d_acc);
}
s3d_acc
}
fn s3e_vec_of_tuples_carrier(heap: &mut FixtureHeap, items: &[FixtureTerm]) -> FixtureTerm {
let mut s3e_pairs: Vec<(FixtureTerm, FixtureTerm)> = Vec::with_capacity(items.len());
for item in items {
s3e_pairs.push((heap.alloc_cons(*item, NIL), *item));
}
let flat: Vec<FixtureTerm> = s3e_pairs.iter().map(|p| p.0).collect();
heap.alloc_list(&flat)
}
#[test]
fn every_shape_class_fixture_is_live() {
let mut heap = FixtureHeap::default();
let seed = [FixtureTerm(1), FixtureTerm(2), FixtureTerm(3)];
let a = s3a_collect_carrier(&mut heap, &seed);
let b = s3b_match_expression_carrier(&mut heap, 1);
let c = s3c_literal_carrier(&mut heap, seed[0]);
let d = s3d_reassignment_carrier(&mut heap, &seed);
let e = s3e_vec_of_tuples_carrier(&mut heap, &seed);
assert_eq!(heap.cells(), 21, "fixture allocation count changed");
assert_eq!(
[a.0, b.0, c.0, d.0, e.0],
[6, 14, 6, 12, 6],
"a fixture's shape changed"
);
}
}