use marble_machinations::marble_engine::{grid::Grid, Machine};

fn no_input_test(steps: usize, output: &[u8], grid: &str) {
	let mut engine = Machine::new_empty();
	engine.set_grid(Grid::from_ascii(grid));
	for _ in 0..(steps - 1) {
		engine.step();
	}
	assert_ne!(engine.output(), output, "output arrived early");
	engine.step();
	assert_eq!(engine.output(), output, "expected output");
}

#[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_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",
	);
}