rust/hedgewars-engine-messages/src/parser.rs
changeset 15284 ae8e14d14596
parent 15264 7515ae6010bb
child 15809 c3971b38bbfa
equal deleted inserted replaced
15282:478d5372eb4a 15284:ae8e14d14596
     1 use nom::{Err::Error, *};
     1 use crate::messages::{
     2 use std::str;
       
     3 
       
     4 use super::messages::{
       
     5     ConfigEngineMessage::*, EngineMessage::*, KeystrokeAction::*, SyncedEngineMessage::*,
     2     ConfigEngineMessage::*, EngineMessage::*, KeystrokeAction::*, SyncedEngineMessage::*,
     6     UnorderedEngineMessage::*, *,
     3     UnorderedEngineMessage::*, *,
     7 };
     4 };
       
     5 use nom::{Err::Error, *};
       
     6 use std::str;
     8 
     7 
     9 macro_rules! eof_slice (
     8 macro_rules! eof_slice (
    10   ($i:expr,) => (
     9   ($i:expr,) => (
    11     {
    10     {
    12       if ($i).input_len() == 0 {
    11       if ($i).input_len() == 0 {
   127     match parse_result {
   126     match parse_result {
   128         Ok((tail, msg)) => {
   127         Ok((tail, msg)) => {
   129             let consumed = buf.len() - tail.len();
   128             let consumed = buf.len() - tail.len();
   130 
   129 
   131             Some((consumed, msg))
   130             Some((consumed, msg))
   132         },
   131         }
   133         Err(Err::Incomplete(_)) => None,
   132         Err(Err::Incomplete(_)) => None,
   134         Err(Err::Error(_)) | Err(Err::Failure(_)) => unreachable!(),
   133         Err(Err::Error(_)) | Err(Err::Failure(_)) => unreachable!(),
   135     }
   134     }
   136 }
   135 }
   137 
   136 
   138 #[test]
   137 #[cfg(test)]
   139 fn parse_length() {
   138 mod tests {
   140     assert_eq!(length_specifier(b"\x01"), Ok((&b""[..], 1)));
   139     use crate::messages::UnsyncedEngineMessage::*;
   141     assert_eq!(length_specifier(b"\x00"), Ok((&b""[..], 0)));
   140     use crate::parser::*;
   142     assert_eq!(length_specifier(b"\x3f"), Ok((&b""[..], 63)));
   141 
   143     assert_eq!(length_specifier(b"\x40\x00"), Ok((&b""[..], 64)));
   142     #[test]
   144     assert_eq!(
   143     fn parse_length() {
   145         length_specifier(b"\xff\xff"),
   144         assert_eq!(length_specifier(b"\x01"), Ok((&b""[..], 1)));
   146         Ok((&b""[..], EngineMessage::MAX_LEN))
   145         assert_eq!(length_specifier(b"\x00"), Ok((&b""[..], 0)));
   147     );
   146         assert_eq!(length_specifier(b"\x3f"), Ok((&b""[..], 63)));
       
   147         assert_eq!(length_specifier(b"\x40\x00"), Ok((&b""[..], 64)));
       
   148         assert_eq!(
       
   149             length_specifier(b"\xff\xff"),
       
   150             Ok((&b""[..], EngineMessage::MAX_LEN))
       
   151         );
       
   152     }
       
   153 
       
   154     #[test]
       
   155     fn parse_synced_messages() {
       
   156         assert_eq!(
       
   157             message(b"\x03L\x01\x02"),
       
   158             Ok((&b""[..], Synced(Left(Press), 258)))
       
   159         );
       
   160 
       
   161         assert_eq!(message(b"\x01#"), Ok((&b""[..], Synced(TimeWrap, 65535))));
       
   162 
       
   163         assert_eq!(
       
   164             message(&vec![9, b'p', 255, 133, 151, 1, 0, 2, 0, 0]),
       
   165             Ok((&b""[..], Synced(Put(-31337, 65538), 0)))
       
   166         );
       
   167     }
       
   168 
       
   169     #[test]
       
   170     fn parse_unsynced_messages() {
       
   171         assert_eq!(
       
   172             message(b"\x06shello"),
       
   173             Ok((&b""[..], Unsynced(ChatMessage(String::from("hello")))))
       
   174         );
       
   175     }
       
   176 
       
   177     #[test]
       
   178     fn parse_incorrect_messages() {
       
   179         assert_eq!(message(b"\x00"), Ok((&b""[..], Empty)));
       
   180         assert_eq!(message(b"\x01\x00"), Ok((&b""[..], Unknown)));
       
   181 
       
   182         // garbage after correct message
       
   183         assert_eq!(message(b"\x04La\x01\x02"), Ok((&b""[..], Unknown)));
       
   184     }
       
   185 
       
   186     #[test]
       
   187     fn parse_config_messages() {
       
   188         assert_eq!(message(b"\x01C"), Ok((&b""[..], Config(ConfigRequest))));
       
   189     }
       
   190 
       
   191     #[test]
       
   192     fn parse_test_general() {
       
   193         assert_eq!(string_tail(b"abc"), Ok((&b""[..], String::from("abc"))));
       
   194 
       
   195         assert_eq!(extract_message(b"\x02#"), None);
       
   196         assert_eq!(
       
   197             extract_message(b"\x01#"),
       
   198             Some((2, Synced(TimeWrap, 65535)))
       
   199         );
       
   200     }
   148 }
   201 }
   149 
       
   150 #[test]
       
   151 fn parse_synced_messages() {
       
   152     assert_eq!(
       
   153         message(b"\x03L\x01\x02"),
       
   154         Ok((&b""[..], Synced(Left(Press), 258)))
       
   155     );
       
   156 
       
   157     assert_eq!(message(b"\x01#"), Ok((&b""[..], Synced(TimeWrap, 65535))));
       
   158 
       
   159     assert_eq!(message(&vec![9, b'p', 255, 133, 151, 1, 0, 2, 0, 0]), Ok((&b""[..], Synced(Put(-31337, 65538), 0))));
       
   160 }
       
   161 
       
   162 #[test]
       
   163 fn parse_unsynced_messages() {
       
   164     assert_eq!(
       
   165         message(b"\x06shello"),
       
   166         Ok((&b""[..], Unordered(ChatMessage(String::from("hello")))))
       
   167     );
       
   168 }
       
   169 
       
   170 #[test]
       
   171 fn parse_incorrect_messages() {
       
   172     assert_eq!(message(b"\x00"), Ok((&b""[..], Empty)));
       
   173     assert_eq!(message(b"\x01\x00"), Ok((&b""[..], Unknown)));
       
   174 
       
   175     // garbage after correct message
       
   176     assert_eq!(message(b"\x04La\x01\x02"), Ok((&b""[..], Unknown)));
       
   177 }
       
   178 
       
   179 #[test]
       
   180 fn parse_config_messages() {
       
   181     assert_eq!(message(b"\x01C"), Ok((&b""[..], Config(ConfigRequest))));
       
   182 }
       
   183 
       
   184 #[test]
       
   185 fn parse_test_general() {
       
   186     assert_eq!(string_tail(b"abc"), Ok((&b""[..], String::from("abc"))));
       
   187 
       
   188     assert_eq!(extract_message(b"\x02#"), None);
       
   189     assert_eq!(extract_message(b"\x01#"), Some((2, Synced(TimeWrap, 65535))));
       
   190 }