@@ -72,34 +72,76 @@ def check(n):
7272 check (1000000 )
7373
7474 def test_iterator_pickle (self ):
75- # Userlist iterators don't support pickling yet since
76- # they are based on generators.
77- data = self .type2test ([4 , 5 , 6 , 7 ])
75+ orig = self .type2test ([4 , 5 , 6 , 7 ])
76+ data = [10 , 11 , 12 , 13 , 14 , 15 ]
7877 for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
79- it = itorg = iter (data )
80- d = pickle .dumps (it , proto )
81- it = pickle .loads (d )
82- self .assertEqual (type (itorg ), type (it ))
83- self .assertEqual (self .type2test (it ), self .type2test (data ))
84-
85- it = pickle .loads (d )
86- next (it )
87- d = pickle .dumps (it , proto )
88- self .assertEqual (self .type2test (it ), self .type2test (data )[1 :])
78+ # initial iterator
79+ itorig = iter (orig )
80+ d = pickle .dumps ((itorig , orig ), proto )
81+ it , a = pickle .loads (d )
82+ a [:] = data
83+ self .assertEqual (type (it ), type (itorig ))
84+ self .assertEqual (list (it ), data )
85+
86+ # running iterator
87+ next (itorig )
88+ d = pickle .dumps ((itorig , orig ), proto )
89+ it , a = pickle .loads (d )
90+ a [:] = data
91+ self .assertEqual (type (it ), type (itorig ))
92+ self .assertEqual (list (it ), data [1 :])
93+
94+ # empty iterator
95+ for i in range (1 , len (orig )):
96+ next (itorig )
97+ d = pickle .dumps ((itorig , orig ), proto )
98+ it , a = pickle .loads (d )
99+ a [:] = data
100+ self .assertEqual (type (it ), type (itorig ))
101+ self .assertEqual (list (it ), data [len (orig ):])
102+
103+ # exhausted iterator
104+ self .assertRaises (StopIteration , next , itorig )
105+ d = pickle .dumps ((itorig , orig ), proto )
106+ it , a = pickle .loads (d )
107+ a [:] = data
108+ self .assertEqual (list (it ), [])
89109
90110 def test_reversed_pickle (self ):
91- data = self .type2test ([4 , 5 , 6 , 7 ])
111+ orig = self .type2test ([4 , 5 , 6 , 7 ])
112+ data = [10 , 11 , 12 , 13 , 14 , 15 ]
92113 for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
93- it = itorg = reversed (data )
94- d = pickle .dumps (it , proto )
95- it = pickle .loads (d )
96- self .assertEqual (type (itorg ), type (it ))
97- self .assertEqual (self .type2test (it ), self .type2test (reversed (data )))
98-
99- it = pickle .loads (d )
100- next (it )
101- d = pickle .dumps (it , proto )
102- self .assertEqual (self .type2test (it ), self .type2test (reversed (data ))[1 :])
114+ # initial iterator
115+ itorig = reversed (orig )
116+ d = pickle .dumps ((itorig , orig ), proto )
117+ it , a = pickle .loads (d )
118+ a [:] = data
119+ self .assertEqual (type (it ), type (itorig ))
120+ self .assertEqual (list (it ), data [len (orig )- 1 ::- 1 ])
121+
122+ # running iterator
123+ next (itorig )
124+ d = pickle .dumps ((itorig , orig ), proto )
125+ it , a = pickle .loads (d )
126+ a [:] = data
127+ self .assertEqual (type (it ), type (itorig ))
128+ self .assertEqual (list (it ), data [len (orig )- 2 ::- 1 ])
129+
130+ # empty iterator
131+ for i in range (1 , len (orig )):
132+ next (itorig )
133+ d = pickle .dumps ((itorig , orig ), proto )
134+ it , a = pickle .loads (d )
135+ a [:] = data
136+ self .assertEqual (type (it ), type (itorig ))
137+ self .assertEqual (list (it ), [])
138+
139+ # exhausted iterator
140+ self .assertRaises (StopIteration , next , itorig )
141+ d = pickle .dumps ((itorig , orig ), proto )
142+ it , a = pickle .loads (d )
143+ a [:] = data
144+ self .assertEqual (list (it ), [])
103145
104146 def test_no_comdat_folding (self ):
105147 # Issue 8847: In the PGO build, the MSVC linker's COMDAT folding
0 commit comments