import nilmdb
from nilmdb.printf import *

import nose
from nose.tools import *
from nose.tools import assert_raises
import threading
import time

from test_helpers import *

import nilmdb.iteratorizer

def func_with_callback(a, b, callback):
    callback(a)
    callback(b)
    callback(a+b)

class TestIteratorizer(object):
    def test(self):

        # First try it with a normal callback
        self.result = ""
        def cb(x):
            self.result += str(x)
        func_with_callback(1, 2, cb)
        eq_(self.result, "123")

        # Now make it an iterator
        it = nilmdb.iteratorizer.Iteratorizer(lambda x:
                                              func_with_callback(1, 2, x))
        result = ""
        for i in it:
            result += str(i)
        eq_(result, "123")

        # Make sure things work when an exception occurs
        it = nilmdb.iteratorizer.Iteratorizer(lambda x:
                                              func_with_callback(1, "a", x))
        result = ""
        with assert_raises(TypeError) as e:
            for i in it:
                result += str(i)
        eq_(result, "1a")

        # Now try to trigger the case where we stop iterating
        # mid-generator, and expect the iteratorizer to clean up after
        # itself.  This doesn't have a particular result in the test,
        # but gains coverage.
        def foo():
            it = nilmdb.iteratorizer.Iteratorizer(lambda x:
                                                  func_with_callback(1, 2, x))
            it.next()
        foo()
