extern crate uci; use uci::Engine; use uci::options::constants; use uci::options::{ EngineOption, EngineOptionType, EngineOptionDataType, EngineOptionData }; use std::str; #[test] fn instantiate_new_engine() { let input = b"UNUSED"; let mut output = Vec::new(); let e = Engine::new("test_name", "test", &input[..], &mut output, vec!()); assert_eq!(e.name, "test_name"); assert_eq!(e.author, "test"); } #[test] fn send_identification_data() { let input = b"UNUSED"; let mut output = Vec::new(); // We need to scope this so that the mutable borrow ends and we can test it safely { let mut e = Engine::new("test_name", "test", &input[..], &mut output, vec!()); e.identify(); } assert_eq!(str::from_utf8(&output).unwrap_or("Unwrapping output failed in send_identification_data"), "id name test_name\nid author test\n"); } #[test] fn send_readyok() { let input = b"UNUSED"; let mut output = Vec::new(); { let mut e = Engine::new("test_name", "test", &input[..], &mut output, vec!()); e.ready(); } assert_eq!(str::from_utf8(&output).unwrap_or("Unwrapping output failed in send_readyok"), "readyok\n"); } #[test] fn engine_option_equality() { let name = constants::HASH; let option_type = EngineOptionType::Spin; let option_data1 = [(EngineOptionDataType::DefaultVal, EngineOptionData::Int(1)), (EngineOptionDataType::Min, EngineOptionData::Int(1)), (EngineOptionDataType::Max, EngineOptionData::Int(128)) ].iter().cloned().collect(); let option_data2 = [(EngineOptionDataType::DefaultVal, EngineOptionData::Int(1)), (EngineOptionDataType::Min, EngineOptionData::Int(1)), (EngineOptionDataType::Max, EngineOptionData::Int(128)) ].iter().cloned().collect(); let o1 = EngineOption { name: name, option_type: option_type, option_data: option_data1, }; let o2 = EngineOption { name: name, option_type: option_type, option_data: option_data2, }; assert_eq!(o1, o2); } #[test] fn engine_option_string() { let name = constants::HASH; let option_type = EngineOptionType::Spin; let option_data = [(EngineOptionDataType::DefaultVal, EngineOptionData::Int(1)), (EngineOptionDataType::Min, EngineOptionData::Int(1)), (EngineOptionDataType::Max, EngineOptionData::Int(128)) ].iter().cloned().collect(); let o = EngineOption { name, option_type, option_data, }; let expected = "option name Hash type spin default 1 min 1 max 128\n"; assert_eq!(o.to_string(), expected); } #[test] fn send_available_engine_options() { let input = b"UNUSED"; let mut output = Vec::new(); let o1 = EngineOption { name: constants::HASH, option_type: EngineOptionType::Spin, option_data: [(EngineOptionDataType::DefaultVal, EngineOptionData::Int(1)), (EngineOptionDataType::Min, EngineOptionData::Int(1)), (EngineOptionDataType::Max, EngineOptionData::Int(128)) ].iter().cloned().collect(), }; let o2 = EngineOption { name: constants::NALIMOVPATH, option_type: EngineOptionType::TypeString, option_data: [(EngineOptionDataType::DefaultVal, EngineOptionData::Text(String::from(r"c:\"))), ].iter().cloned().collect(), }; let o3 = EngineOption { name: "Clear Hash", option_type: EngineOptionType::Button, option_data: [].iter().cloned().collect(), }; { let mut e = Engine::new("test_name", "test", &input[..], &mut output, vec!(o1, o2, o3)); e.send_available_options(); } assert_eq!(str::from_utf8(&output).unwrap_or("Unwrapping output failed in send_identification_data"), "option name Hash type spin default 1 min 1 max 128\n\ option name NalimovPath type string default c:\\n\ option name Clear Hash type button\n\ uciok\n"); }