summaryrefslogtreecommitdiff
path: root/2018-tower-defence/tests/live_comparison.rs
diff options
context:
space:
mode:
Diffstat (limited to '2018-tower-defence/tests/live_comparison.rs')
-rw-r--r--2018-tower-defence/tests/live_comparison.rs68
1 files changed, 68 insertions, 0 deletions
diff --git a/2018-tower-defence/tests/live_comparison.rs b/2018-tower-defence/tests/live_comparison.rs
new file mode 100644
index 0000000..c85e3fe
--- /dev/null
+++ b/2018-tower-defence/tests/live_comparison.rs
@@ -0,0 +1,68 @@
+extern crate zombot;
+
+use zombot::input::json;
+use zombot::engine::command::{Command, BuildingType};
+use zombot::engine::geometry::Point;
+
+use std::fs::File;
+use std::io::prelude::*;
+use std::path::Path;
+
+#[test]
+fn it_successfully_simulates_replay() {
+ test_from_replay(&Path::new("tests/v300_normal_towers"));
+}
+
+#[test]
+fn it_successfully_simulates_replay_with_iron_curtain() {
+ test_from_replay(&Path::new("tests/v300_iron_curtain"));
+}
+
+#[test]
+fn it_successfully_simulates_replay_with_iron_curtain_with_teslas() {
+ test_from_replay(&Path::new("tests/v300_iron_curtain_with_teslas"));
+}
+
+
+fn test_from_replay(replay_folder: &Path) {
+ let length = replay_folder.read_dir().unwrap().count()-1;
+
+ let mut state = json::read_bitwise_state_from_file(&format!("{}/Round 000/state.json", replay_folder.display())).unwrap();
+
+ for i in 0..length {
+ let player = read_player_command(&format!("{}/Round {:03}/PlayerCommand.txt", replay_folder.display(), i));
+ let opponent = read_opponent_command(&format!("{}/Round {:03}/OpponentCommand.txt", replay_folder.display(), i));
+ let mut expected_state = json::read_bitwise_state_from_file(&format!("{}/Round {:03}/state.json", replay_folder.display(), i+1)).unwrap();
+
+ state.simulate(player, opponent);
+ state.sort();
+ expected_state.sort();
+
+ println!("State {}: {:?}", i+1, state);
+ assert_eq!(state, expected_state, "\nFailed on state {}\n", i+1);
+ }
+}
+
+fn read_player_command(filename: &str) -> Command {
+ let mut file = File::open(filename).unwrap();
+ let mut content = String::new();
+ file.read_to_string(&mut content).unwrap();
+ if content.trim() == "No Command" {
+ Command::Nothing
+ }
+ else {
+ let mut components = content.split(',');
+ let point = Point::new(components.next().unwrap().trim().parse().unwrap(),
+ components.next().unwrap().trim().parse().unwrap());
+ let action_type = components.next().unwrap().trim().parse().unwrap();
+ if action_type == 5 {
+ Command::IronCurtain
+ } else {
+ Command::Build(point, BuildingType::from_u8(action_type).unwrap())
+ }
+ }
+}
+
+fn read_opponent_command(filename: &str) -> Command {
+ read_player_command(filename)
+}