use {TryWrite};
use mio::*;
use mio::deprecated::{EventLoop, Handler};
use mio::tcp::{TcpListener, TcpStream};

const LISTEN: Token = Token(0);
const CLIENT: Token = Token(1);
const SERVER: Token = Token(2);

struct MyHandler {
    listener: TcpListener,
    connected: TcpStream,
    accepted: Option<TcpStream>,
}

impl Handler for MyHandler {
    type Timeout = ();
    type Message = ();

    fn ready(&mut self,
             event_loop: &mut EventLoop<MyHandler>,
             token: Token,
             _: Ready) {
        match token {
            LISTEN => {
                let sock = self.listener.accept().unwrap().0;
                event_loop.register(&sock,
                                    SERVER,
                                    Ready::writable(),
                                    PollOpt::edge()).unwrap();
                self.accepted = Some(sock);
            }
            SERVER => {
                self.accepted.as_ref().unwrap().peer_addr().unwrap();
                self.accepted.as_ref().unwrap().local_addr().unwrap();
                self.accepted.as_mut().unwrap().try_write(&[1, 2, 3]).unwrap();
                self.accepted = None;
            }
            CLIENT => {
                self.connected.peer_addr().unwrap();
                self.connected.local_addr().unwrap();
                event_loop.shutdown();
            }
            _ => panic!("unexpected token"),
        }
    }
}

#[test]
fn local_addr_ready() {
    let addr = "127.0.0.1:0".parse().unwrap();
    let server = TcpListener::bind(&addr).unwrap();
    let addr = server.local_addr().unwrap();

    let mut event_loop = EventLoop::new().unwrap();
    event_loop.register(&server, LISTEN, Ready::readable(),
                        PollOpt::edge()).unwrap();

    let sock = TcpStream::connect(&addr).unwrap();
    event_loop.register(&sock, CLIENT, Ready::readable(),
                        PollOpt::edge()).unwrap();

    event_loop.run(&mut MyHandler {
        listener: server,
        connected: sock,
        accepted: None,
    }).unwrap();
}
