@@ -188,11 +188,6 @@ class CopyComPointerTests(unittest.TestCase):
188188 def setUp (self ):
189189 ole32 .CoInitializeEx (None , COINIT_APARTMENTTHREADED )
190190
191- def tearDown (self ):
192- ole32 .CoUninitialize ()
193- gc .collect ()
194-
195- def test_copy_com_pointer (self ):
196191 class IUnknown (c_void_p ):
197192 QueryInterface = proto_query_interface (None , IID_IUnknown )
198193 AddRef = proto_add_ref ()
@@ -201,26 +196,67 @@ class IUnknown(c_void_p):
201196 class IPersist (IUnknown ):
202197 GetClassID = proto_get_class_id (((OUT , "pClassID" ),), IID_IPersist )
203198
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 )
206213
214+ self .assertIsNone (src .value )
207215 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+
208242 with self .assertRaises (ValueError ):
209243 dst .GetClassID () # NULL COM pointer access
210244
245+ def test_src_is_nonnull (self ):
246+ src = create_shelllink_persist (self .IPersist )
247+ dst = self .IPersist ()
248+
211249 hr = CopyComPointer (src , byref (dst ))
212250
213251 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 ())
215255
216256 clsid = dst .GetClassID ()
217257 self .assertEqual (TRUE , is_equal_guid (CLSID_ShellLink , clsid ))
218258
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 ())
224260
225261
226262if __name__ == '__main__' :
0 commit comments