22
33from collections import UserList
44from test import list_tests
5+ from test import support
56import unittest
67
78
9+ class UserListSubclass (UserList ):
10+ pass
11+
12+ class UserListSubclass2 (UserList ):
13+ pass
14+
15+
816class UserListTest (list_tests .CommonTest ):
917 type2test = UserList
1018
19+ def test_data (self ):
20+ u = UserList ()
21+ self .assertEqual (u .data , [])
22+ self .assertIs (type (u .data ), list )
23+ a = [1 , 2 ]
24+ u = UserList (a )
25+ self .assertEqual (u .data , a )
26+ self .assertIsNot (u .data , a )
27+ self .assertIs (type (u .data ), list )
28+ u = UserList (u )
29+ self .assertEqual (u .data , a )
30+ self .assertIs (type (u .data ), list )
31+ u = UserList ("spam" )
32+ self .assertEqual (u .data , list ("spam" ))
33+ self .assertIs (type (u .data ), list )
34+
1135 def test_getslice (self ):
1236 super ().test_getslice ()
1337 l = [0 , 1 , 2 , 3 , 4 ]
@@ -24,34 +48,74 @@ def test_slice_type(self):
2448 self .assertIsInstance (u [:], u .__class__ )
2549 self .assertEqual (u [:],u )
2650
27- def test_add_specials (self ):
28- u = UserList ("spam" )
29- u2 = u + "eggs"
30- self .assertEqual (u2 , list ("spameggs" ))
51+ def test_mixed_add (self ):
52+ for t in UserList , list , str , tuple , iter :
53+ with self .subTest (t .__name__ ):
54+ u = UserList ("spam" ) + t ("eggs" )
55+ self .assertEqual (u , list ("spameggs" ))
56+ self .assertIs (type (u ), UserList )
57+
58+ u = t ("spam" ) + UserList ("eggs" )
59+ self .assertEqual (u , list ("spameggs" ))
60+ self .assertIs (type (u ), UserList )
61+
62+ u = UserList ("spam" ) + UserListSubclass ("eggs" )
63+ self .assertEqual (u , list ("spameggs" ))
64+ self .assertIs (type (u ), UserList )
3165
32- def test_radd_specials (self ):
33- u = UserList ("eggs" )
34- u2 = "spam" + u
66+ u = UserListSubclass ("spam" ) + UserList ("eggs" )
67+ self .assertEqual (u , list ("spameggs" ))
68+ self .assertIs (type (u ), UserListSubclass )
69+
70+ u = UserListSubclass ("spam" ) + UserListSubclass2 ("eggs" )
71+ self .assertEqual (u , list ("spameggs" ))
72+ self .assertIs (type (u ), UserListSubclass )
73+
74+ u2 = UserList ("eggs" ).__radd__ (UserList ("spam" ))
3575 self .assertEqual (u2 , list ("spameggs" ))
36- u2 = u .__radd__ (UserList ("spam" ))
76+ self .assertIs (type (u ), UserListSubclass )
77+
78+ u2 = UserListSubclass ("eggs" ).__radd__ (UserListSubclass2 ("spam" ))
3779 self .assertEqual (u2 , list ("spameggs" ))
80+ self .assertIs (type (u ), UserListSubclass )
3881
39- def test_iadd (self ):
40- super ().test_iadd ()
41- u = [0 , 1 ]
42- u += UserList ([0 , 1 ])
43- self .assertEqual (u , [0 , 1 , 0 , 1 ])
82+ def test_mixed_iadd (self ):
83+ for t in UserList , list , str , tuple , iter :
84+ with self .subTest (t .__name__ ):
85+ u = u2 = UserList ("spam" )
86+ u += t ("eggs" )
87+ self .assertEqual (u , list ("spameggs" ))
88+ self .assertIs (type (u ), UserList )
89+ self .assertIs (u , u2 )
4490
45- def test_mixedcmp (self ):
46- u = self .type2test ([0 , 1 ])
47- self .assertEqual (u , [0 , 1 ])
48- self .assertNotEqual (u , [0 ])
49- self .assertNotEqual (u , [0 , 2 ])
91+ u = t ("spam" )
92+ u += UserList ("eggs" )
93+ self .assertEqual (u , list ("spameggs" ))
94+ self .assertIs (type (u ), UserList )
5095
51- def test_mixedadd (self ):
96+ u = u2 = UserList ("spam" )
97+ u += UserListSubclass ("eggs" )
98+ self .assertEqual (u , list ("spameggs" ))
99+ self .assertIs (type (u ), UserList )
100+ self .assertIs (u , u2 )
101+
102+ u = u2 = UserListSubclass ("spam" )
103+ u += UserList ("eggs" )
104+ self .assertEqual (u , list ("spameggs" ))
105+ self .assertIs (type (u ), UserListSubclass )
106+ self .assertIs (u , u2 )
107+
108+ u = u2 = UserListSubclass ("spam" )
109+ u += UserListSubclass2 ("eggs" )
110+ self .assertEqual (u , list ("spameggs" ))
111+ self .assertIs (type (u ), UserListSubclass )
112+ self .assertIs (u , u2 )
113+
114+ def test_mixed_cmp (self ):
52115 u = self .type2test ([0 , 1 ])
53- self .assertEqual (u + [], u )
54- self .assertEqual (u + [2 ], [0 , 1 , 2 ])
116+ self ._assert_cmp (u , [0 , 1 ], 0 )
117+ self ._assert_cmp (u , [0 ], 1 )
118+ self ._assert_cmp (u , [0 , 2 ], - 1 )
55119
56120 def test_getitemoverwriteiter (self ):
57121 # Verify that __getitem__ overrides *are* recognized by __iter__
@@ -60,6 +124,43 @@ def __getitem__(self, key):
60124 return str (key ) + '!!!'
61125 self .assertEqual (next (iter (T ((1 ,2 )))), "0!!!" )
62126
127+ def test_implementation (self ):
128+ u = UserList ([1 ])
129+ with (support .swap_attr (UserList , '__len__' , None ),
130+ support .swap_attr (UserList , 'insert' , None )):
131+ u .append (2 )
132+ self .assertEqual (u , [1 , 2 ])
133+ with support .swap_attr (UserList , 'append' , None ):
134+ u .extend ([3 , 4 ])
135+ self .assertEqual (u , [1 , 2 , 3 , 4 ])
136+ with support .swap_attr (UserList , 'append' , None ):
137+ u .extend (UserList ([3 , 4 ]))
138+ self .assertEqual (u , [1 , 2 , 3 , 4 , 3 , 4 ])
139+ with support .swap_attr (UserList , '__iter__' , None ):
140+ c = u .count (3 )
141+ self .assertEqual (c , 2 )
142+ with (support .swap_attr (UserList , '__iter__' , None ),
143+ support .swap_attr (UserList , '__getitem__' , None )):
144+ i = u .index (4 )
145+ self .assertEqual (i , 3 )
146+ with (support .swap_attr (UserList , 'index' , None ),
147+ support .swap_attr (UserList , '__getitem__' , None )):
148+ u .remove (3 )
149+ self .assertEqual (u , [1 , 2 , 4 , 3 , 4 ])
150+ with (support .swap_attr (UserList , '__getitem__' , None ),
151+ support .swap_attr (UserList , '__delitem__' , None )):
152+ u .pop ()
153+ self .assertEqual (u , [1 , 2 , 4 , 3 ])
154+ with (support .swap_attr (UserList , '__len__' , None ),
155+ support .swap_attr (UserList , '__getitem__' , None ),
156+ support .swap_attr (UserList , '__setitem__' , None )):
157+ u .reverse ()
158+ self .assertEqual (u , [3 , 4 , 2 , 1 ])
159+ with (support .swap_attr (UserList , '__len__' , None ),
160+ support .swap_attr (UserList , 'pop' , None )):
161+ u .clear ()
162+ self .assertEqual (u , [])
163+
63164 def test_userlist_copy (self ):
64165 u = self .type2test ([6 , 8 , 1 , 9 , 1 ])
65166 v = u .copy ()
0 commit comments