test_iter.py

来自「mallet是自然语言处理、机器学习领域的一个开源项目。」· Python 代码 · 共 785 行 · 第 1/2 页

PY
785
字号
    # Test map()'s use of iterators.    def test_builtin_map(self):        self.assertEqual(map(None, SequenceClass(5)), range(5))        self.assertEqual(map(lambda x: x+1, SequenceClass(5)), range(1, 6))        d = {"one": 1, "two": 2, "three": 3}        self.assertEqual(map(None, d), d.keys())        self.assertEqual(map(lambda k, d=d: (k, d[k]), d), d.items())        dkeys = d.keys()        expected = [(i < len(d) and dkeys[i] or None,                     i,                     i < len(d) and dkeys[i] or None)                    for i in range(5)]        self.assertEqual(map(None, d,                                   SequenceClass(5),                                   iter(d.iterkeys())),                         expected)        f = open(TESTFN, "w")        try:            for i in range(10):                f.write("xy" * i + "\n") # line i has len 2*i+1        finally:            f.close()        f = open(TESTFN, "r")        try:            self.assertEqual(map(len, f), range(1, 21, 2))        finally:            f.close()            try:                unlink(TESTFN)            except OSError:                pass    # Test zip()'s use of iterators.    def test_builtin_zip(self):        self.assertRaises(TypeError, zip)        self.assertRaises(TypeError, zip, None)        self.assertRaises(TypeError, zip, range(10), 42)        self.assertRaises(TypeError, zip, range(10), zip)        self.assertEqual(zip(IteratingSequenceClass(3)),                         [(0,), (1,), (2,)])        self.assertEqual(zip(SequenceClass(3)),                         [(0,), (1,), (2,)])        d = {"one": 1, "two": 2, "three": 3}        self.assertEqual(d.items(), zip(d, d.itervalues()))        # Generate all ints starting at constructor arg.        class IntsFrom:            def __init__(self, start):                self.i = start            def __iter__(self):                return self            def next(self):                i = self.i                self.i = i+1                return i        f = open(TESTFN, "w")        try:            f.write("a\n" "bbb\n" "cc\n")        finally:            f.close()        f = open(TESTFN, "r")        try:            self.assertEqual(zip(IntsFrom(0), f, IntsFrom(-100)),                             [(0, "a\n", -100),                              (1, "bbb\n", -99),                              (2, "cc\n", -98)])        finally:            f.close()            try:                unlink(TESTFN)            except OSError:                pass    # Test reduces()'s use of iterators.    def test_builtin_reduce(self):        from operator import add        self.assertEqual(reduce(add, SequenceClass(5)), 10)        self.assertEqual(reduce(add, SequenceClass(5), 42), 52)        self.assertRaises(TypeError, reduce, add, SequenceClass(0))        self.assertEqual(reduce(add, SequenceClass(0), 42), 42)        self.assertEqual(reduce(add, SequenceClass(1)), 0)        self.assertEqual(reduce(add, SequenceClass(1), 42), 42)        d = {"one": 1, "two": 2, "three": 3}        self.assertEqual(reduce(add, d), "".join(d.keys()))    # This test case will be removed if we don't have Unicode    def test_unicode_join_endcase(self):        # This class inserts a Unicode object into its argument's natural        # iteration, in the 3rd position.        class OhPhooey:            def __init__(self, seq):                self.it = iter(seq)                self.i = 0            def __iter__(self):                return self            def next(self):                i = self.i                self.i = i+1                if i == 2:                    return unicode("fooled you!")                return self.it.next()        f = open(TESTFN, "w")        try:            f.write("a\n" + "b\n" + "c\n")        finally:            f.close()        f = open(TESTFN, "r")        # Nasty:  string.join(s) can't know whether unicode.join() is needed        # until it's seen all of s's elements.  But in this case, f's        # iterator cannot be restarted.  So what we're testing here is        # whether string.join() can manage to remember everything it's seen        # and pass that on to unicode.join().        try:            got = " - ".join(OhPhooey(f))            self.assertEqual(got, unicode("a\n - b\n - fooled you! - c\n"))        finally:            f.close()            try:                unlink(TESTFN)            except OSError:                pass    if not have_unicode:        def test_unicode_join_endcase(self): pass    # Test iterators with 'x in y' and 'x not in y'.    def test_in_and_not_in(self):        for sc5 in IteratingSequenceClass(5), SequenceClass(5):            for i in range(5):                self.assert_(i in sc5)            for i in "abc", -1, 5, 42.42, (3, 4), [], {1: 1}, 3-12j, sc5:                self.assert_(i not in sc5)        self.assertRaises(TypeError, lambda: 3 in 12)        self.assertRaises(TypeError, lambda: 3 not in map)        d = {"one": 1, "two": 2, "three": 3, 1j: 2j}        for k in d:            self.assert_(k in d)            self.assert_(k not in d.itervalues())        for v in d.values():            self.assert_(v in d.itervalues())            self.assert_(v not in d)        for k, v in d.iteritems():            self.assert_((k, v) in d.iteritems())            self.assert_((v, k) not in d.iteritems())        f = open(TESTFN, "w")        try:            f.write("a\n" "b\n" "c\n")        finally:            f.close()        f = open(TESTFN, "r")        try:            for chunk in "abc":                f.seek(0, 0)                self.assert_(chunk not in f)                f.seek(0, 0)                self.assert_((chunk + "\n") in f)        finally:            f.close()            try:                unlink(TESTFN)            except OSError:                pass    # Test iterators with operator.countOf (PySequence_Count).    def test_countOf(self):        from operator import countOf        self.assertEqual(countOf([1,2,2,3,2,5], 2), 3)        self.assertEqual(countOf((1,2,2,3,2,5), 2), 3)        self.assertEqual(countOf("122325", "2"), 3)        self.assertEqual(countOf("122325", "6"), 0)        self.assertRaises(TypeError, countOf, 42, 1)        self.assertRaises(TypeError, countOf, countOf, countOf)        d = {"one": 3, "two": 3, "three": 3, 1j: 2j}        for k in d:            self.assertEqual(countOf(d, k), 1)        self.assertEqual(countOf(d.itervalues(), 3), 3)        self.assertEqual(countOf(d.itervalues(), 2j), 1)        self.assertEqual(countOf(d.itervalues(), 1j), 0)        f = open(TESTFN, "w")        try:            f.write("a\n" "b\n" "c\n" "b\n")        finally:            f.close()        f = open(TESTFN, "r")        try:            for letter, count in ("a", 1), ("b", 2), ("c", 1), ("d", 0):                f.seek(0, 0)                self.assertEqual(countOf(f, letter + "\n"), count)        finally:            f.close()            try:                unlink(TESTFN)            except OSError:                pass    # Test iterators with operator.indexOf (PySequence_Index).    def test_indexOf(self):        from operator import indexOf        self.assertEqual(indexOf([1,2,2,3,2,5], 1), 0)        self.assertEqual(indexOf((1,2,2,3,2,5), 2), 1)        self.assertEqual(indexOf((1,2,2,3,2,5), 3), 3)        self.assertEqual(indexOf((1,2,2,3,2,5), 5), 5)        self.assertRaises(ValueError, indexOf, (1,2,2,3,2,5), 0)        self.assertRaises(ValueError, indexOf, (1,2,2,3,2,5), 6)        self.assertEqual(indexOf("122325", "2"), 1)        self.assertEqual(indexOf("122325", "5"), 5)        self.assertRaises(ValueError, indexOf, "122325", "6")        self.assertRaises(TypeError, indexOf, 42, 1)        self.assertRaises(TypeError, indexOf, indexOf, indexOf)        f = open(TESTFN, "w")        try:            f.write("a\n" "b\n" "c\n" "d\n" "e\n")        finally:            f.close()        f = open(TESTFN, "r")        try:            fiter = iter(f)            self.assertEqual(indexOf(fiter, "b\n"), 1)            self.assertEqual(indexOf(fiter, "d\n"), 1)            self.assertEqual(indexOf(fiter, "e\n"), 0)            self.assertRaises(ValueError, indexOf, fiter, "a\n")        finally:            f.close()            try:                unlink(TESTFN)            except OSError:                pass        iclass = IteratingSequenceClass(3)        for i in range(3):            self.assertEqual(indexOf(iclass, i), i)        self.assertRaises(ValueError, indexOf, iclass, -1)    # Test iterators with file.writelines().    def test_writelines(self):        f = file(TESTFN, "w")        try:            self.assertRaises(TypeError, f.writelines, None)            self.assertRaises(TypeError, f.writelines, 42)            f.writelines(["1\n", "2\n"])            f.writelines(("3\n", "4\n"))            f.writelines({'5\n': None})            f.writelines({})            # Try a big chunk too.            class Iterator:                def __init__(self, start, finish):                    self.start = start                    self.finish = finish                    self.i = self.start                def next(self):                    if self.i >= self.finish:                        raise StopIteration                    result = str(self.i) + '\n'                    self.i += 1                    return result                def __iter__(self):                    return self            class Whatever:                def __init__(self, start, finish):                    self.start = start                    self.finish = finish                def __iter__(self):                    return Iterator(self.start, self.finish)            f.writelines(Whatever(6, 6+2000))            f.close()            f = file(TESTFN)            expected = [str(i) + "\n" for i in range(1, 2006)]            self.assertEqual(list(f), expected)        finally:            f.close()            try:                unlink(TESTFN)            except OSError:                pass    # Test iterators on RHS of unpacking assignments.    def test_unpack_iter(self):        a, b = 1, 2        self.assertEqual((a, b), (1, 2))        a, b, c = IteratingSequenceClass(3)        self.assertEqual((a, b, c), (0, 1, 2))        try:    # too many values            a, b = IteratingSequenceClass(3)        except ValueError:            pass        else:            self.fail("should have raised ValueError")        try:    # not enough values            a, b, c = IteratingSequenceClass(2)        except ValueError:            pass        else:            self.fail("should have raised ValueError")        try:    # not iterable            a, b, c = len        except TypeError:            pass        else:            self.fail("should have raised TypeError")        a, b, c = {1: 42, 2: 42, 3: 42}.itervalues()        self.assertEqual((a, b, c), (42, 42, 42))        f = open(TESTFN, "w")        lines = ("a\n", "bb\n", "ccc\n")        try:            for line in lines:                f.write(line)        finally:            f.close()        f = open(TESTFN, "r")        try:            a, b, c = f            self.assertEqual((a, b, c), lines)        finally:            f.close()            try:                unlink(TESTFN)            except OSError:                pass        (a, b), (c,) = IteratingSequenceClass(2), {42: 24}        self.assertEqual((a, b, c), (0, 1, 42))        # Test reference count behavior        class C(object):            count = 0            def __new__(cls):                cls.count += 1                return object.__new__(cls)            def __del__(self):                cls = self.__class__                assert cls.count > 0                cls.count -= 1        #x = C()        #self.assertEqual(C.count, 1)        #del x        #self.assertEqual(C.count, 0)        #l = [C(), C(), C()]        #self.assertEqual(C.count, 3)        #try:        #    a, b = iter(l)        #except ValueError:        #    pass        #del l        #self.assertEqual(C.count, 0)def test_main():    run_unittest(TestCase)if __name__ == "__main__":    test_main()

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?