Skip to content

Commit 79f7055

Browse files
committed
Add more tests.
1 parent c28e7c4 commit 79f7055

File tree

1 file changed

+49
-13
lines changed

1 file changed

+49
-13
lines changed

Lib/test/test_ctypes/test_win32_com_foreign_func.py

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

226262
if __name__ == '__main__':

0 commit comments

Comments
 (0)