From ce1a16c6e3d3a50f11dffef57060bede68c7f2fb Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Wed, 13 Jul 2022 22:04:06 +0200
Subject: [PATCH] Fix error when calling ASTManager.set_top_node(None,None)

Add tests for .set_top_node(0, None), and .set_top_node(None, None)
---
 gdb-port/ast.py            |  2 +-
 gdb-port/tests/unit/ast.py | 20 +++++++++++++++++++-
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/gdb-port/ast.py b/gdb-port/ast.py
index cea0265..75a79ef 100644
--- a/gdb-port/ast.py
+++ b/gdb-port/ast.py
@@ -221,7 +221,7 @@ class ASTManager:
 
 	def set_top_node(self, address, parser):
 		# Address has to be an integer or gdb.Value or this will break
-		if address == 0:
+		if address is None or address == 0:
 			self.top_node = None
 		else:
 			self.top_node = HParseResult(address)
diff --git a/gdb-port/tests/unit/ast.py b/gdb-port/tests/unit/ast.py
index d67d232..bd2c0d4 100644
--- a/gdb-port/tests/unit/ast.py
+++ b/gdb-port/tests/unit/ast.py
@@ -2,6 +2,7 @@ import unittest
 import unittest.mock
 
 # Potential improvement: split testcases with different fixtures needed into their own thing (make_HParsedToken, read_member, read_AST_not_null)
+# TODO: reduce boilerplate using setUp(), tearDown() and decorators for testcases with multiple test functions
 class HParseResultTests(unittest.TestCase):
 	#def test_valid_address(self):
 	#	raise ValueError
@@ -137,10 +138,27 @@ class ASTManagerSetTopNode(unittest.TestCase):
 		ast_manager = ASTManager()
 		ast_manager.set_top_node(0xdeadbeef, p)
 
-		#self.assertEquals(ast_manager.top_node, hpr_mock_object)
+		# This assert is not too specific, but testing the calls to HParseResult() covers checking that HParseResult() is initialized with the right address
+		self.assertIsNotNone(ast_manager.top_node)
 		self.assertEqual(ast_manager.parser, p)
 		self.assertEqual(self.hpr_mock_object.mock_calls, [unittest.mock.call(0xdeadbeef)])
 
+	def test_set_top_node_none(self):
+		ast_manager = ASTManager()
+		ast_manager.set_top_node(None, None)
+
+		self.assertIsNone(ast_manager.parser)
+		self.assertIsNone(ast_manager.top_node)
+		self.assertEqual(self.hpr_mock_object.mock_calls, [])
+
+	def test_set_top_node_zero_address(self):
+		ast_manager = ASTManager()
+		ast_manager.set_top_node(0, None)
+
+		self.assertIsNone(ast_manager.parser)
+		self.assertIsNone(ast_manager.top_node)
+		self.assertEqual(self.hpr_mock_object.mock_calls, [])
+
 class ASTManagerPrintAST(unittest.TestCase):
 	def setUp(self):
 		self.hpr_patcher = unittest.mock.patch('__main__.HParseResult', autospec=True)
-- 
GitLab