rust/hedgewars-server/src/server/handlers/common.rs
changeset 14415 06672690d71b
parent 14374 e5db279308d7
child 14457 98ef2913ec73
equal deleted inserted replaced
14414:6843c4551cde 14415:06672690d71b
       
     1 use crate::{
       
     2     server::{actions::Action, core::HWServer},
       
     3     protocol::messages::{
       
     4         HWProtocolMessage::{self, Rnd}, HWServerMessage::{self, ChatMsg},
       
     5     }
       
     6 };
       
     7 use rand::{self, Rng, thread_rng};
       
     8 
       
     9 pub fn rnd_reply(options: &[String]) -> HWServerMessage {
       
    10     let mut rng = thread_rng();
       
    11     let reply = if options.is_empty() {
       
    12         (*rng.choose(&["heads", "tails"]).unwrap()).to_owned()
       
    13     } else {
       
    14         rng.choose(&options).unwrap().clone()
       
    15     };
       
    16 
       
    17     ChatMsg {
       
    18         nick: "[random]".to_owned(),
       
    19         msg: reply.clone(),
       
    20     }
       
    21 }
       
    22 
       
    23 #[cfg(test)]
       
    24 mod tests {
       
    25     use super::*;
       
    26     use crate::protocol::messages::HWServerMessage::ChatMsg;
       
    27     use crate::server::actions::{
       
    28         Action::{self, Send}, PendingMessage,
       
    29     };
       
    30 
       
    31     fn reply2string(r: HWServerMessage) -> String {
       
    32         match r {
       
    33             ChatMsg { msg: p, .. } => String::from(p),
       
    34             _ => panic!("expected a ChatMsg"),
       
    35         }
       
    36     }
       
    37 
       
    38     fn run_handle_test(opts: Vec<String>) {
       
    39         let opts2 = opts.clone();
       
    40         for opt in opts {
       
    41             while reply2string(rnd_reply(&opts2)) != opt {}
       
    42         }
       
    43     }
       
    44 
       
    45     /// This test terminates almost surely.
       
    46     #[test]
       
    47     fn test_handle_rnd_empty() {
       
    48         run_handle_test(vec![])
       
    49     }
       
    50 
       
    51     /// This test terminates almost surely.
       
    52     #[test]
       
    53     fn test_handle_rnd_nonempty() {
       
    54         run_handle_test(vec!["A".to_owned(), "B".to_owned(), "C".to_owned()])
       
    55     }
       
    56 
       
    57     /// This test terminates almost surely (strong law of large numbers)
       
    58     #[test]
       
    59     fn test_distribution() {
       
    60         let eps = 0.000001;
       
    61         let lim = 0.5;
       
    62         let opts = vec![0.to_string(), 1.to_string()];
       
    63         let mut ones = 0;
       
    64         let mut tries = 0;
       
    65 
       
    66         while tries < 1000 || ((ones as f64 / tries as f64) - lim).abs() >= eps {
       
    67             tries += 1;
       
    68             if reply2string(rnd_reply(&opts)) == 1.to_string() {
       
    69                 ones += 1;
       
    70             }
       
    71         }
       
    72     }
       
    73 }