# Testing select module
from test_support import verbose
import select
import os

# test some known error conditions
try:
    rfd, wfd, xfd = select.select(1, 2, 3)
except TypeError:
    pass
else:
    print 'expected TypeError exception not raised'

class Nope:
    pass

class Almost:
    def fileno(self):
        return 'fileno'

try:
    rfd, wfd, xfd = select.select([Nope()], [], [])
except TypeError:
    pass
else:
    print 'expected TypeError exception not raised'

try:
    rfd, wfd, xfd = select.select([Almost()], [], [])
except TypeError:
    pass
else:
    print 'expected TypeError exception not raised'


def test():
    import sys
    if sys.platform[:3] in ('win', 'mac', 'os2'):
        if verbose:
            print "Can't test select easily on", sys.platform
        return
    cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 1; done'
    p = os.popen(cmd, 'r')
    for tout in (0, 1, 2, 4, 8, 16) + (None,)*10:
        if verbose:
            print 'timeout =', tout
        rfd, wfd, xfd = select.select([p], [], [], tout)
        if (rfd, wfd, xfd) == ([], [], []):
            continue
        if (rfd, wfd, xfd) == ([p], [], []):
            line = p.readline()
            if verbose:
                print `line`
            if not line:
                if verbose:
                    print 'EOF'
                break
            continue
        print 'Unexpected return values from select():', rfd, wfd, xfd
    p.close()

test()
