use marble_machinations::marble_engine::{grid::Grid, Machine}; fn do_test(steps: usize, input: &[u8], output: &[u8], grid: &str) { let mut engine = Machine::new_empty(); engine.set_grid(Grid::from_ascii(grid)); engine.set_input(input.to_owned()); for _ in 0..(steps - 1) { engine.step(); } assert_ne!(engine.output(), output, "output arrived early"); engine.step(); assert_eq!(engine.output(), output, "expected output"); } fn no_input_test(steps: usize, output: &[u8], grid: &str) { do_test(steps, &[], output, grid) } #[test] fn creating_marbles_cause_indirect_claim() { no_input_test(3, &[1], " o \n|-*-|\n| 1 |\n-B B-\n I\n"); } #[test] fn bug_input_consumed_when_marble_creation_blocked() { do_test( 4, &[1, 2, 3], &[1, 1], "# +-+\nIIo| I\n *+B\nII\n++*\n# #\n", ); } #[test] fn bug_overlapping_marble_creation_blocks_tile_forever() { no_input_test( 7, &[1, 2, 3], " I \no 3 o\n2I B+*\n B |1\n |-+\n*-| I\n\nI\n", ); } #[test] fn bug_equal_comparator_order_lock() { no_input_test( 6, &[1, 2, 3, 4], "I \n I\n21\n o\nBB|*-++\n|=+ |=-\n |+ BB\n\n 34\n\n I\n I\n", ); }