import sys
import doctest
import unittest


doctests = """

Test simple loop with conditional

    >>> sum(i*i for i in range(100) if i&1 == 1)
    166650

Test simple nesting

    >>> list((i,j) for i in range(3) for j in range(4) )
    [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3)]

Test nesting with the inner expression dependent on the outer

    >>> list((i,j) for i in range(4) for j in range(i) )
    [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)]

Test the idiom for temporary variable assignment in comprehensions.

    >>> list((j*j for i in range(4) for j in [i+1]))
    [1, 4, 9, 16]
    >>> list((j*k for i in range(4) for j in [i+1] for k in [j+1]))
    [2, 6, 12, 20]
    >>> list((j*k for i in range(4) for j, k in [(i+1, i+2)]))
    [2, 6, 12, 20]

Not assignment

    >>> list((i*i for i in [*range(4)]))
    [0, 1, 4, 9]
    >>> list((i*i for i in (*range(4),)))
    [0, 1, 4, 9]

Make sure the induction variable is not exposed

    >>> i = 20
    >>> sum(i*i for i in range(100))
    328350
    >>> i
    20

Test first class

    >>> g = (i*i for i in range(4))
    >>> type(g)
