diff -r bb24c3414b0d -r 81e0ed105f5d gameServer2/src/protocol/test.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/protocol/test.rs Thu Jun 21 17:23:10 2018 -0400 @@ -0,0 +1,134 @@ +use proptest::{ + test_runner::{TestRunner, Reason}, + arbitrary::{any, any_with, Arbitrary, StrategyFor}, + strategy::{Strategy, BoxedStrategy, Just, Filter, ValueTree}, + string::RegexGeneratorValueTree +}; + +use super::messages::{ + HWProtocolMessage, HWProtocolMessage::* +}; + +// Due to inability to define From between Options +trait Into2: Sized { fn into2(self) -> T; } +impl Into2 for T { fn into2(self) -> T { self } } +impl Into2 for Ascii { fn into2(self) -> String { self.0 } } +impl Into2> for Option{ + fn into2(self) -> Option { self.map(|x| {x.0}) } +} + +macro_rules! proto_msg_case { + ($val: ident()) => + (Just($val)); + ($val: ident($arg: ty)) => + (any::<$arg>().prop_map(|v| {$val(v.into2())})); + ($val: ident($arg1: ty, $arg2: ty)) => + (any::<($arg1, $arg2)>().prop_map(|v| {$val(v.0.into2(), v.1.into2())})); + ($val: ident($arg1: ty, $arg2: ty, $arg3: ty)) => + (any::<($arg1, $arg2, $arg3)>().prop_map(|v| {$val(v.0.into2(), v.1.into2(), v.2.into2())})); +} + +macro_rules! proto_msg_match { + ($var: expr, def = $default: ident, $($num: expr => $constr: ident $res: tt),*) => ( + match $var { + $($num => (proto_msg_case!($constr $res)).boxed()),*, + _ => Just($default).boxed() + } + ) +} + +#[derive(Debug)] +struct Ascii(String); + +struct AsciiValueTree(RegexGeneratorValueTree); + +impl ValueTree for AsciiValueTree { + type Value = Ascii; + + fn current(&self) -> Self::Value { Ascii(self.0.current()) } + fn simplify(&mut self) -> bool { self.0.simplify() } + fn complicate(&mut self) -> bool { self.0.complicate() } +} + +impl Arbitrary for Ascii { + type Parameters = ::Parameters; + + fn arbitrary_with(args: Self::Parameters) -> Self::Strategy { + any_with::(args) + .prop_filter("not ascii", |s| { + s.len() > 0 && s.is_ascii() && + s.find(|c| { + ['\0', '\n', '\x20'].contains(&c) + }).is_none()}) + .prop_map(Ascii) + .boxed() + } + + type Strategy = BoxedStrategy; + type ValueTree = Box>; +} + +pub fn gen_proto_msg() -> BoxedStrategy where { + let res = (0..58).no_shrink().prop_flat_map(|i| { + proto_msg_match!(i, def = Malformed, + 0 => Ping(), + 1 => Pong(), + 2 => Quit(Option), + //3 => Cmd + 4 => Global(Ascii), + 5 => Watch(Ascii), + 6 => ToggleServerRegisteredOnly(), + 7 => SuperPower(), + 8 => Info(Ascii), + 9 => Nick(Ascii), + 10 => Proto(u32), + 11 => Password(Ascii, Ascii), + 12 => Checker(u32, Ascii, Ascii), + 13 => List(), + 14 => Chat(Ascii), + 15 => CreateRoom(Ascii, Option), + 16 => JoinRoom(Ascii, Option), + 17 => Follow(Ascii), + //18 => Rnd(Vec), + 19 => Kick(Ascii), + 20 => Ban(Ascii, Ascii, u32), + 21 => BanIP(Ascii, Ascii, u32), + 22 => BanNick(Ascii, Ascii, u32), + 23 => BanList(), + 24 => Unban(Ascii), + //25 => SetServerVar(ServerVar), + 26 => GetServerVar(), + 27 => RestartServer(), + 28 => Stats(), + 29 => Part(Option), + //30 => Cfg(GameCfg), + //31 => AddTeam(TeamInfo), + 32 => RemoveTeam(Ascii), + //33 => SetHedgehogsNumber(String, u8), + //34 => SetTeamColor(String, u8), + 35 => ToggleReady(), + 36 => StartGame(), + 37 => EngineMessage(Ascii), + 38 => RoundFinished(), + 39 => ToggleRestrictJoin(), + 40 => ToggleRestrictTeams(), + 41 => ToggleRegisteredOnly(), + 42 => RoomName(Ascii), + 43 => Delegate(Ascii), + 44 => TeamChat(Ascii), + 45 => MaxTeams(u8), + 46 => Fix(), + 47 => Unfix(), + 48 => Greeting(Ascii), + //49 => CallVote(Option<(String, Option)>), + 50 => Vote(String), + 51 => ForceVote(Ascii), + //52 => Save(String, String), + 53 => Delete(Ascii), + 54 => SaveRoom(Ascii), + 55 => LoadRoom(Ascii), + 56 => Malformed(), + 57 => Empty() + )}); + res.boxed() +} \ No newline at end of file