Files
kiln/kiln-core/src/tests/map_file/spinners.rs
T
2026-06-21 11:54:19 -05:00

59 lines
1.8 KiB
Rust

//! Spinners are scripted objects: the `spinner_cw`/`spinner_ccw` archetypes expand
//! into objects carrying the embedded `spinner.rhai` plus a `BUILTIN_spinner_<dir>`
//! 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());
}