diff --git a/src/ast_types.py b/src/ast_types.py index 8548f51..0b16c7f 100644 --- a/src/ast_types.py +++ b/src/ast_types.py @@ -10,6 +10,8 @@ return "Reference('%s')" % (self.value) def __eq__(self, other): + if other is None: + return False return self.value == other.value @@ -21,6 +23,8 @@ return "Bool(%s)" % (self.value) def __eq__(self, other): + if other is None: + return False return self.value == other.value @@ -32,6 +36,8 @@ return "Text('%s')" % (self.value) def __eq__(self, other): + if other is None: + return False return self.value == other.value @@ -49,6 +55,8 @@ ) def __eq__(self, other): + if other is None: + return False return ( self.subject == other.subject and self.verb == other.verb @@ -65,6 +73,8 @@ return "Set(subject %s, statement %s)" % (self.subject, self.statement) def __eq__(self, other): + if other is None: + return False return self.subject == other.subject and self.statement == other.statement @@ -82,6 +92,8 @@ ) def __eq__(self, other): + if other is None: + return False return ( self.test == other.test and self.success == other.success diff --git a/src/i18n.py b/src/i18n.py index 0de3a8f..a5243f6 100644 --- a/src/i18n.py +++ b/src/i18n.py @@ -11,4 +11,6 @@ return "Message('%s', %s)" % (self.id, self.values) # pragma: no mutate def __eq__(self, other): + if other is None: + return False return self.id == other.id and self.values == other.values diff --git a/src/oldparse.py b/src/oldparse.py index 7ae38e5..198bfd0 100644 --- a/src/oldparse.py +++ b/src/oldparse.py @@ -19,6 +19,8 @@ ) def __eq__(self, other): + if other is None: + return False return ( self.line == other.line and self.column == other.column diff --git a/src/parse.py b/src/parse.py index ef5fab7..910eabd 100644 --- a/src/parse.py +++ b/src/parse.py @@ -66,6 +66,8 @@ ) def __eq__(self, other): + if other is None: + return False return ( self.task == other.task and self.token == other.token @@ -106,6 +108,8 @@ ) def __eq__(self, other): + if other is None: + return False return ( self.error == other.error and self.token == other.token diff --git a/src/token.py b/src/token.py index ae0a348..cdf9ec9 100644 --- a/src/token.py +++ b/src/token.py @@ -15,6 +15,8 @@ ) def __eq__(self, other): + if other is None: + return False return self.value == other.value and self.location == other.location @@ -33,6 +35,8 @@ ) def __eq__(self, other): + if other is None: + return False return ( self.line == other.line and self.offset == other.offset diff --git a/tests/parse/test_error.py b/tests/parse/test_error.py index 5df69c1..67b1b5a 100644 --- a/tests/parse/test_error.py +++ b/tests/parse/test_error.py @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # Copyright 2022 Jookia -from hypothesis.strategies import composite, sampled_from, text +from hypothesis.strategies import composite, integers, sampled_from, text from src.parse import ( ParseContext, @@ -17,6 +17,16 @@ # +# Draws a strategy, with 25% of draws being None +@composite +def draw_maybe(draw, strategy): + chance = draw(integers(min_value=0, max_value=4)) + if chance == 0: + return None + else: + return draw(strategy) + + # Draws a random parse task @composite def draw_parse_task(draw): @@ -26,9 +36,10 @@ # Draws a random parse context without a parent @composite def draw_parse_context(draw): - task = draw(draw_parse_task()) - token = draw(draw_token_random()) - return ParseContext(task, token, None) + task = draw(draw_maybe(draw_parse_task())) + token = draw(draw_maybe(draw_token_random())) + context = draw(draw_maybe(draw_parse_context())) + return ParseContext(task, token, context) # Static parse context @@ -48,8 +59,8 @@ @composite def draw_parse_error_exception(draw): error = draw(draw_parse_error()) - token = draw(draw_token_random()) - expected = draw(text()) + token = draw(draw_maybe(draw_token_random())) + expected = draw(draw_maybe(text())) context = draw(draw_parse_context()) return ParseErrorException(error, token, expected, context) @@ -64,8 +75,8 @@ ParseContext, draw_parse_context(), task=draw_parse_task(), - token=draw_token_random(), - parent=text(), + token=draw_maybe(draw_token_random()), + parent=draw_maybe(text()), ) def test_parse_context_structure(): pass @@ -76,7 +87,7 @@ ParseErrorException, draw_parse_error_exception(), error=draw_token_random(), - token=draw_token_random(), + token=draw_maybe(draw_token_random()), expected=text(), context=draw_parse_context(), ) diff --git a/tests/templates.py b/tests/templates.py index 4f17c18..f836d8a 100644 --- a/tests/templates.py +++ b/tests/templates.py @@ -15,6 +15,8 @@ # Tests that a class's equality method works def do_template_test_equals(value1, value2, members): + none_value = None + assert (value1 == none_value) is False equals = True for name in members: member1 = getattr(value1, name) diff --git a/tests/test_oldparse.py b/tests/test_oldparse.py index 6f12220..f538f9f 100644 --- a/tests/test_oldparse.py +++ b/tests/test_oldparse.py @@ -62,6 +62,8 @@ ) def __eq__(self, other): + if other is None: + return False return ( # Don't check code self.value == other.value