# HG changeset patch # User alfadur # Date 1559601128 -10800 # Node ID 6a1ba3540fa028ab25fc068b7f7ccce82c4c692c # Parent 1e45db229f9fe272fb85b3a824d8e29adf0427ce fix callvote parsing diff -r 1e45db229f9f -r 6a1ba3540fa0 rust/hedgewars-server/src/protocol/messages.rs --- a/rust/hedgewars-server/src/protocol/messages.rs Mon Jun 03 23:50:26 2019 +0300 +++ b/rust/hedgewars-server/src/protocol/messages.rs Tue Jun 04 01:32:08 2019 +0300 @@ -173,17 +173,32 @@ impl ServerVar { pub fn to_protocol(&self) -> Vec { + use ServerVar::*; match self { - ServerVar::MOTDNew(s) => vec!["MOTD_NEW".to_string(), s.clone()], - ServerVar::MOTDOld(s) => vec!["MOTD_OLD".to_string(), s.clone()], - ServerVar::LatestProto(n) => vec!["LATEST_PROTO".to_string(), n.to_string()], + MOTDNew(s) => vec!["MOTD_NEW".to_string(), s.clone()], + MOTDOld(s) => vec!["MOTD_OLD".to_string(), s.clone()], + LatestProto(n) => vec!["LATEST_PROTO".to_string(), n.to_string()], + } + } +} + +impl VoteType { + pub fn to_protocol(&self) -> Vec { + use VoteType::*; + match self { + Kick(nick) => vec!["KICK".to_string(), nick.clone()], + Map(None) => vec!["MAP".to_string()], + Map(Some(name)) => vec!["MAP".to_string(), name.clone()], + Pause => vec!["PAUSE".to_string()], + NewSeed => vec!["NEWSEED".to_string()], + HedgehogsPerTeam(count) => vec!["HEDGEHOGS".to_string(), count.to_string()], } } } impl GameCfg { pub fn to_protocol(&self) -> (String, Vec) { - use crate::core::types::GameCfg::*; + use GameCfg::*; match self { FeatureSize(s) => ("FEATURE_SIZE".to_string(), vec![s.to_string()]), MapType(t) => ("MAP".to_string(), vec![t.to_string()]), @@ -325,7 +340,6 @@ StartGame => msg!["START_GAME"], EngineMessage(msg) => msg!["EM", msg], RoundFinished => msg!["ROUNDFINISHED"], - ReplayStart => msg!["REPLAY_START"], ToggleRestrictJoin => msg!["TOGGLE_RESTRICT_JOINS"], ToggleRestrictTeams => msg!["TOGGLE_RESTRICT_TEAMS"], ToggleRegisteredOnly => msg!["TOGGLE_REGISTERED_ONLY"], @@ -337,7 +351,10 @@ Unfix => msg!["CMD", "UNFIX"], Greeting(None) => msg!["CMD", "GREETING"], Greeting(Some(msg)) => msg!["CMD", format!("GREETING {}", msg)], - //CallVote(Option<(String, Option)>) =>, ?? + CallVote(None) => msg!["CMD", "CALLVOTE"], + CallVote(Some(vote)) => { + msg!["CMD", format!("CALLVOTE {}", &vote.to_protocol().join(" "))] + } Vote(msg) => msg!["CMD", format!("VOTE {}", if *msg { "YES" } else { "NO" })], ForceVote(msg) => msg!["CMD", format!("FORCE {}", if *msg { "YES" } else { "NO" })], Save(name, location) => msg!["CMD", format!("SAVE {} {}", name, location)], @@ -400,6 +417,7 @@ Notice(msg) => msg!["NOTICE", msg], Warning(msg) => msg!["WARNING", msg], Error(msg) => msg!["ERROR", msg], + ReplayStart => msg!["REPLAY_START"], LegacyReady(is_ready, nicks) => { construct_message(&[if *is_ready { "READY" } else { "NOT_READY" }], &nicks) diff -r 1e45db229f9f -r 6a1ba3540fa0 rust/hedgewars-server/src/protocol/parser.rs --- a/rust/hedgewars-server/src/protocol/parser.rs Mon Jun 03 23:50:26 2019 +0300 +++ b/rust/hedgewars-server/src/protocol/parser.rs Tue Jun 04 01:32:08 2019 +0300 @@ -277,7 +277,7 @@ |i| cmdc_single_arg(i, "FORCE", yes_no_line, ForceVote), |i| cmdc_single_arg(i, "INFO", a_line, Info), |i| cmdc_single_arg(i, "MAXTEAMS", u8_line, MaxTeams), - |i| cmdc_single_arg(i, "CALLVOTE", |i| opt!(i, voting), CallVote), + |i| cmdc_single_arg(i, "CALLVOTE", voting, |v| CallVote(Some(v))), ))(input) } @@ -287,6 +287,7 @@ alt(( cmd_no_arg_message, cmd_single_arg_message, + |i| tag_no_case("CALLVOTE")(i).map(|(i, _)| (i, CallVote(None))), |i| { precededc(i, hw_tag_no_case("GREETING"), opt_space_arg) .map(|(i, s)| (i, Greeting(s))) @@ -560,15 +561,12 @@ ) } -fn extract_messages(input: &[u8]) -> HwResult> { - many0(message)(input) -} - #[cfg(test)] mod test { - use super::{extract_messages, message}; - use crate::protocol::parser::HwProtocolError; - use crate::protocol::{messages::HwProtocolMessage::*, test::gen_proto_msg}; + use super::message; + use crate::protocol::{ + messages::HwProtocolMessage::*, parser::HwProtocolError, test::gen_proto_msg, + }; use proptest::{proptest, proptest_helper}; #[cfg(test)] @@ -619,14 +617,5 @@ message(b"QUIT\n1\n2\n\n"), Err(nom::Err::Error(HwProtocolError::new())) ); - - assert_eq!( - extract_messages(b"\n\n\n\nPING\n\n"), - Ok((&b""[..], vec![Ping])) - ); - assert_eq!( - extract_messages(b"\n\n\nPING\n\n"), - Ok((&b""[..], vec![Ping])) - ); } } diff -r 1e45db229f9f -r 6a1ba3540fa0 rust/hedgewars-server/src/protocol/test.rs --- a/rust/hedgewars-server/src/protocol/test.rs Mon Jun 03 23:50:26 2019 +0300 +++ b/rust/hedgewars-server/src/protocol/test.rs Tue Jun 04 01:32:08 2019 +0300 @@ -4,7 +4,7 @@ test_runner::{Reason, TestRunner}, }; -use crate::core::types::{GameCfg, HedgehogInfo, ServerVar, ServerVar::*, TeamInfo}; +use crate::core::types::{GameCfg, HedgehogInfo, ServerVar, ServerVar::*, TeamInfo, VoteType}; use super::messages::{HwProtocolMessage, HwProtocolMessage::*}; @@ -166,6 +166,28 @@ type Strategy = BoxedStrategy; } +impl Arbitrary for VoteType { + type Parameters = (); + + fn arbitrary_with(args: Self::Parameters) -> Self::Strategy { + use VoteType::*; + (0..=4) + .no_shrink() + .prop_flat_map(|i| { + proto_msg_match!(i, def = VoteType::Pause, + 0 => Kick(Ascii), + 1 => Map(Option), + 2 => Pause(), + 3 => NewSeed(), + 4 => HedgehogsPerTeam(u8) + ) + }) + .boxed() + } + + type Strategy = BoxedStrategy; +} + pub fn gen_proto_msg() -> BoxedStrategy where { let res = (0..=55).no_shrink().prop_flat_map(|i| { proto_msg_match!(i, def = Ping, @@ -217,7 +239,7 @@ 46 => Fix(), 47 => Unfix(), 48 => Greeting(Option), - //49 => CallVote(Option<(String, Option)>), + 49 => CallVote(Option), 50 => Vote(bool), 51 => ForceVote(bool), 52 => Save(Ascii, Ascii),