def test_cache_3 (self) :
     cache = Cache()
     self.assertEqual(cache.check(401,501), (500,142))
 def test_cache_1 (self) :
     cache = Cache()
     self.assertEqual(cache.check(1,100), (100,119))
 def test_cache_2 (self) :
     cache = Cache()
     self.assertEqual(cache.check(301,400), (400,144))
 def test_cache_4 (self) :
     c = Cache(10)
     c.write(1, 100)
     self.assertEqual(c.read(1), 100)
 def test_cache_5 (self) :
     c = Cache(10)
     self.assertEqual(c.read(3), 0)
 def test_cache_3 (self) :
     c = Cache(0)
     self.assertEqual(c.size(), 0)
 def test_cache_2 (self) :
     c = Cache(10)
     c.write(2, 10)
     self.assertEqual(c.read(2), 10)
 def test_cache_1 (self) :
     c = Cache(10)
     self.assertEqual(10, c.size())
 def setUp(self):
     self.cache = Cache(range(1, 1001))
class TestCollatz (unittest.TestCase) :

    def setUp(self):
        self.cache = Cache(range(1, 1001))
    
    # ----
    # read
    # ----

    def test_read_1(self) :
        r = StringIO.StringIO("1 10\n")
        a = [0, 0]
        b = collatz_read(r, a)
        self.assert_(b    == True)
        self.assert_(a[0] ==  1)
        self.assert_(a[1] == 10)

    def test_read_2(self) :
        r = StringIO.StringIO("998789 323232\n")
        a = [0, 0]
        b = collatz_read(r, a)
        self.assert_(b    == True)
        self.assert_(a[0] == 998789)
        self.assert_(a[1] == 323232)

    def test_read_3(self) :
        r = StringIO.StringIO("555 777\n")
        a = [0, 0]
        b = collatz_read(r, a)
        self.assert_(b    == True)
        self.assert_(a[0] == 555)
        self.assert_(a[1] == 777)

    # ----------
    # findRanges
    # ----------

    def test_findRanges_1(self):
        a = [[1, 10], [100, 200], [201, 210], [1000, 900]]
        b = findRanges(a)
        for i in range(len(a)):
            for j in range(a[i][0], a[i][1] + 1):
                if j not in b:
                    self.assert_(False)
        self.assert_(True)

    def test_findRanges_2(self):
        a = [[1, 10], [20, 30], [3, 6], [22, 23], [100, 200], [110, 190], [120, 180], [130, 170]]
        b = findRanges(a)
        for i in range(len(a)):
            for j in range(a[i][0], a[i][1] + 1):
                if j not in b:
                    self.assert_(False)
        self.assert_(True)

    def test_findRanges_3(self):
        a = [[1, 10], [10, 20], [20, 30], [40, 50], [47, 55], [53, 60]]
        b = findRanges(a)
        for i in range(len(a)):
            for j in range(a[i][0], a[i][1] + 1):
                if j not in b:
                    self.assert_(False)
        self.assert_(True)

    # ----
    # eval
    # ----

    def test_eval_1 (self) :
        c = Cache(range(1, 11))
        v = collatz_eval(1, 10, c)
        self.assert_(v == 20)

    def test_eval_2 (self) :
        c = Cache(range(100, 201))
        v = collatz_eval(100, 200, c)
        self.assert_(v == 125)
        
    def test_eval_3 (self) :
        c = Cache(range(900, 1001))
        v = collatz_eval(900, 1000, c)
        self.assert_(v == 174)

    # -----------------
    # Cache object init
    # -----------------

    def test_cache_1(self):
        a = range(1, 5)
        cache1 = Cache(a)
        correct = True
        b = [1, 2, 8, 3]
        self.assert_(b == cache1.cache[1:5])

    def test_cache_2(self):
        a  = range(10, 101) + range(100, 111) + range(200, 251)
        c = Cache(a)
        e = self.collatzCalc(10, 100)
        f = self.collatzCalc(100, 110)
        g = self.collatzCalc(200, 250)
        self.assert_((e == c.cache[10:101] and f == c.cache[100:111]) and g == c.cache[200:251])

    def test_cache_3(self):
        a  = range(22, 57) + range(50, 88) + range(80, 99)
        c = Cache(a)
        e = self.collatzCalc(22, 56)
        f = self.collatzCalc(50, 87)
        g = self.collatzCalc(80, 98)
        self.assert_((e == c.cache[22:57] and f == c.cache[50:88]) and g == c.cache[80:99])

    def collatzCalc(self, i, j):
        a = [0] * (j - i + 1)
        t = 0
        for n in range(i, j + 1):
            cycles = 1
            while n != 1:
                if n % 2 == 1:
                    n = ((3 * n) + 1) / 2
                    cycles += 2
                else:
                    n /= 2
                    cycles += 1
            a[t] = cycles
            t += 1
        return a

    # -----
    # check
    # -----

    def test_check_1(self):
        self.assert_(self.cache.check(1, 10) == 20)

    def test_check_2(self):
        self.assert_(self.cache.check(100, 200) == 125)

    def test_check_3(self):
        self.assert_(self.cache.check(900, 1000) == 174)

    # -----
    # print
    # -----

    def test_print_1(self) :
        w = StringIO.StringIO()
        collatz_print(w, 1, 10, 20)
        self.assert_(w.getvalue() == "1 10 20\n")

    def test_print_2(self) :
        w = StringIO.StringIO()
        collatz_print(w, 56, 999, 23)
        self.assert_(w.getvalue() == "56 999 23\n")

    def test_print_3(self) :
        w = StringIO.StringIO()
        collatz_print(w, 123, 123, 123)
        self.assert_(w.getvalue() == "123 123 123\n")

    # -----
    # solve
    # -----

    def test_solve_1(self) :
        r = StringIO.StringIO("1 10\n100 200\n201 210\n900 1000\n")
        w = StringIO.StringIO()
        collatz_solve(r, w)
        self.assert_(w.getvalue() == "1 10 20\n100 200 125\n201 210 89\n900 1000 174\n")

    def test_solve_2(self) :
        r = StringIO.StringIO("223184 224124\n818105 818641\n327424 327885\n476207 475839\n")
        w = StringIO.StringIO()
        collatz_solve(r, w)
        self.assert_(w.getvalue() == "223184 224124 324\n818105 818641 344\n327424 327885 322\n476207 475839 307\n")

    def test_solve_3(self) :
        r = StringIO.StringIO("236515 236974\n883898 883984\n930396 931031\n647086 647708\n")
        w = StringIO.StringIO()
        collatz_solve(r, w)
        self.assert_(w.getvalue() == "236515 236974 306\n883898 883984 370\n930396 931031 370\n647086 647708 310\n")