//! Spinners are scripted objects: the `spinner_cw`/`spinner_ccw` archetypes expand //! into objects carrying the embedded `spinner.rhai` plus a `BUILTIN_spinner_` //! tag, and collapse back to the keyword on save (just like pushers). use super::{layer, load_board, map}; use crate::map_file::MapFile; #[test] fn spinner_loads_as_a_tagged_scripted_solid_object() { let board = load_board(&map( 3, 1, &[layer( "S @", &[("S", "kind = \"spinner_cw\""), ("@", "kind = \"player\"")], )], )); let (_, obj) = board .objects .iter() .find(|(_, o)| o.tags.contains("BUILTIN_spinner_cw")) .expect("spinner object"); assert_eq!((obj.x, obj.y), (0, 0)); assert!( obj.builtin_script.is_some(), "carries the embedded spinner script" ); assert!(obj.script_name.is_none()); assert!(!board.is_passable(0, 0), "spinner is solid"); } #[test] fn spinner_round_trips_to_its_keyword() { let board = load_board(&map( 3, 1, &[layer( "S @", &[("S", "kind = \"spinner_ccw\""), ("@", "kind = \"player\"")], )], )); // Save collapses the expanded object back into the `spinner_ccw` keyword. let toml_out = toml::to_string_pretty(&MapFile::from(&board)).unwrap(); assert!( toml_out.contains("spinner_ccw"), "spinner should save as its archetype keyword, got:\n{toml_out}" ); // Reload: it is a working spinner object again, still counter-clockwise. let board2 = load_board(&toml_out); let (_, obj) = board2 .objects .iter() .find(|(_, o)| o.tags.contains("BUILTIN_spinner_ccw")) .expect("spinner object after round-trip"); assert_eq!((obj.x, obj.y), (0, 0)); assert!(obj.builtin_script.is_some()); }