@@ -188,11 +188,6 @@ class CopyComPointerTests(unittest.TestCase):
188
188
def setUp (self ):
189
189
ole32 .CoInitializeEx (None , COINIT_APARTMENTTHREADED )
190
190
191
- def tearDown (self ):
192
- ole32 .CoUninitialize ()
193
- gc .collect ()
194
-
195
- def test_copy_com_pointer (self ):
196
191
class IUnknown (c_void_p ):
197
192
QueryInterface = proto_query_interface (None , IID_IUnknown )
198
193
AddRef = proto_add_ref ()
@@ -201,26 +196,67 @@ class IUnknown(c_void_p):
201
196
class IPersist (IUnknown ):
202
197
GetClassID = proto_get_class_id (((OUT , "pClassID" ),), IID_IPersist )
203
198
204
- src = create_shelllink_persist (IPersist )
205
- dst = IPersist ()
199
+ self .IUnknown = IUnknown
200
+ self .IPersist = IPersist
201
+
202
+ def tearDown (self ):
203
+ ole32 .CoUninitialize ()
204
+ gc .collect ()
205
+
206
+ def test_both_are_null (self ):
207
+ src = self .IPersist ()
208
+ dst = self .IPersist ()
209
+
210
+ hr = CopyComPointer (src , byref (dst ))
211
+
212
+ self .assertEqual (S_OK , hr )
206
213
214
+ self .assertIsNone (src .value )
207
215
self .assertIsNone (dst .value )
216
+
217
+ def test_both_are_nonnull (self ):
218
+ src = create_shelllink_persist (self .IPersist )
219
+ dst = create_shelllink_persist (self .IPersist )
220
+
221
+ self .assertNotEqual (src .value , dst .value )
222
+ hr = CopyComPointer (src , byref (dst ))
223
+ self .assertEqual (S_OK , hr )
224
+ self .assertEqual (src .value , dst .value )
225
+
226
+ self .assertEqual (1 , src .Release ())
227
+
228
+ clsid = dst .GetClassID ()
229
+ self .assertEqual (TRUE , is_equal_guid (CLSID_ShellLink , clsid ))
230
+
231
+ self .assertEqual (0 , dst .Release ())
232
+
233
+ def test_dest_is_nonnull (self ):
234
+ src = self .IPersist ()
235
+ dst = create_shelllink_persist (self .IPersist )
236
+
237
+ hr = CopyComPointer (src , byref (dst ))
238
+
239
+ self .assertEqual (S_OK , hr )
240
+ self .assertIsNone (dst .value )
241
+
208
242
with self .assertRaises (ValueError ):
209
243
dst .GetClassID () # NULL COM pointer access
210
244
245
+ def test_src_is_nonnull (self ):
246
+ src = create_shelllink_persist (self .IPersist )
247
+ dst = self .IPersist ()
248
+
211
249
hr = CopyComPointer (src , byref (dst ))
212
250
213
251
self .assertEqual (S_OK , hr )
214
- self .assertEqual (dst .value , src .value )
252
+ self .assertEqual (src .value , dst .value )
253
+
254
+ self .assertEqual (1 , src .Release ())
215
255
216
256
clsid = dst .GetClassID ()
217
257
self .assertEqual (TRUE , is_equal_guid (CLSID_ShellLink , clsid ))
218
258
219
- # The refcount of a COM pointer created by `CoCreateInstance` is 1.
220
- # `CopyComPointer` calls `AddRef` internally (thus, +1 to the refcount).
221
- # Here, the refcount is decremented from 2 to 1.
222
- self .assertEqual (1 , dst .Release ())
223
- self .assertEqual (0 , src .Release ())
259
+ self .assertEqual (0 , dst .Release ())
224
260
225
261
226
262
if __name__ == '__main__' :
0 commit comments