use std::io::{Cursor, Error, ErrorKind}; use zagan_bet::protocol::{io_failure_message, LineBuffer}; #[test] fn keeps_data_after_the_first_newline() { let mut buffer = LineBuffer::new(); buffer.push(b"PONG\nGAME_RESULT session 60 10 990 OSS two\n"); assert_eq!(buffer.next_line().as_deref(), Some("PONG")); assert_eq!( buffer.next_line().as_deref(), Some("GAME_RESULT session 60 10 990 OSS two") ); assert_eq!(buffer.next_line(), None); } #[test] fn handles_crlf_and_empty_lines() { let mut buffer = LineBuffer::new(); buffer.push(b"PONG\r\n\r\n"); assert_eq!(buffer.next_line().as_deref(), Some("PONG")); assert_eq!(buffer.next_line().as_deref(), Some("")); assert_eq!(buffer.next_line(), None); } #[test] fn waits_for_a_split_line() { let mut buffer = LineBuffer::new(); buffer.push(b"PO"); assert_eq!(buffer.next_line(), None); buffer.push(b"NG\n"); assert_eq!(buffer.next_line().as_deref(), Some("PONG")); } #[test] fn reads_multiple_lines_from_a_reader() { let mut buffer = LineBuffer::new(); let mut reader = Cursor::new(b"one\ntwo\n".to_vec()); assert_eq!( buffer.read_line(&mut reader).unwrap().as_deref(), Some("one") ); assert_eq!( buffer.read_line(&mut reader).unwrap().as_deref(), Some("two") ); assert_eq!(buffer.read_line(&mut reader).unwrap(), None); } #[test] fn returns_a_partial_line_at_eof() { let mut buffer = LineBuffer::new(); let mut reader = Cursor::new(b"partial".to_vec()); assert_eq!( buffer.read_line(&mut reader).unwrap().as_deref(), Some("partial") ); assert_eq!(buffer.read_line(&mut reader).unwrap(), None); } #[test] fn timeout_errors_get_a_timeout_message() { assert_eq!( io_failure_message(&Error::from(ErrorKind::TimedOut)), "ERROR Request timed out" ); assert_eq!( io_failure_message(&Error::from(ErrorKind::WouldBlock)), "ERROR Request timed out" ); assert_eq!( io_failure_message(&Error::from(ErrorKind::UnexpectedEof)), "ERROR Connection lost" ); assert_eq!( io_failure_message(&Error::from(ErrorKind::ConnectionReset)), "ERROR Connection lost" ); }