From 0ccfbdaa7dadacd8da1ea9d794100357d547a47a Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Wed, 20 Apr 2022 20:32:48 +0200
Subject: [PATCH] Improve set_parser_virtual_breakpoints() tests

---
 gdb-port/tests/unit/breakpoint-manager.py | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/gdb-port/tests/unit/breakpoint-manager.py b/gdb-port/tests/unit/breakpoint-manager.py
index 2bce7c2..e5ff950 100644
--- a/gdb-port/tests/unit/breakpoint-manager.py
+++ b/gdb-port/tests/unit/breakpoint-manager.py
@@ -86,16 +86,31 @@ class BreakpointManagerSettingBreakpoints(unittest.TestCase):
 
 	def test_set_parser_virtual_breakpoints(self):
 		self.bpm.set_parser_virtual_breakpoints()
+		method_names = [ a for a in dir(self.bpm) if a.startswith("parse_")]
 		virt_bps = [ self.bpm.__getattribute__(a) for a in dir(self.bpm) if a.startswith("parse_")]
-		for bp in virt_bps:
-			self.assertTrue(self.pvbp_mock_object.call_count == len(virt_bps))
+		self.assertTrue(self.pvbp_mock_object.call_count == len(virt_bps))
+		#print(self.pvbp_mock_object.mock_calls)
+		for i in range(0, len(method_names)):
+			with self.subTest(i=i):
+				self.pvbp_mock_object.assert_any_call(method_names[i])
 
 	def test_del_parser_virtual_breakpoints(self):
 		self.bpm.set_parser_virtual_breakpoints()
 		virt_bps = [ self.bpm.__getattribute__(a) for a in dir(self.bpm) if a.startswith("parse_")]
 		self.bpm.del_parser_virtual_breakpoints()
-		for bp in virt_bps:
-			self.assertTrue(bp.delete.called)
+		#TODO: in tests, all self.parse_* attributes refer to the same mock object
+		# so we can't just do virt_bps[i].delete.assert_called_once(), because it
+		# will have been called len(virt_bps) times.
+		# it would be desirable to have separate mock object instances,
+		# or for mock_object to know which attribute it has
+		# been called through, to allow checking individual self.parse_*
+		# breakpoints for deletion
+		self.assertTrue(len(virt_bps) > 0)
+		self.assertTrue(virt_bps[0].mock_calls == [unittest.mock.call.delete()] * len(virt_bps))
+		#self.assertTrue(virt_bps[0].delete.call_count == len(virt_bps))
+		#for i in range(0, len(virt_bps)):
+		#	with self.subTest(i=i):
+		#		virt_bps[i].delete.assert_called_once()
 
 	# TODO
 	#def tearDown(self):
-- 
GitLab