def test_with_abstract_handler():
    reactor = IOEventReactor()
    handler = AbstractIOEventHandler()

    assert not reactor.running
    assert handler.event_count == 0
    assert handler.last_event_time == 0

    @raises(NotImplementedError)
    def test_abstract_meth(meth, *args, **kws):
        meth(*args, **kws)

    for i, event in enumerate((POLLIN, POLLPRI,
                               POLLOUT,
                               POLLHUP, POLLNVAL, POLLERR,
                               (POLLHUP | POLLNVAL),
                               )):
        args = dict(reactor=None, fd=1, eventmask=event, timestamp=1)
        test_abstract_meth(handler, **args) # __call__ alias
        test_abstract_meth(handler.handle_event, **args)
        assert handler.event_count == (i+1)*2
        assert handler.last_event_time

    test_abstract_meth(handler._handle_read_event, 0)
    test_abstract_meth(handler._handle_write_event, 0)
    test_abstract_meth(handler._close_descriptor, 0)

    for fd in xrange(1, 10):
        handler._register_fd_with_reactor(fd=fd, reactor=reactor)
        assert reactor.get_handler(fd) == handler
        reactor.unregister(fd) # this is raising and handling
                               # exceptions internally, as the reactor
                               # hasn't been started
        try:
            reactor.get_handler(fd)
        except KeyError:
            pass

    for fd in xrange(1, 10):
        handler._register_fd_with_reactor(fd=fd, reactor=reactor)
    reactor._cull_any_bad_descriptors()