From 7b0a6368a8c0b506568f679057b66b8cf748e6c4 Mon Sep 17 00:00:00 2001 From: Ryan Duguid <152749594+ryanduguid@users.noreply.github.com> Date: Thu, 8 Oct 2026 05:23:07 +1100 Subject: [PATCH] Strengthen Settings equality properties --- tests/test_settings.py | 52 +++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/tests/test_settings.py b/tests/test_settings.py index 89acb90e0..4eb187fdd 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -422,8 +422,8 @@ def test_equality_reflexive(self, settings) -> None: An object compares equal to itself using the == operator and the != operator. """ - assert (settings == settings) assert settings == settings + assert (settings != settings) is False @given(settings=SettingsStrategy, o_settings=SettingsStrategy) def test_equality_multiple(self, settings, o_settings) -> None: @@ -431,12 +431,48 @@ def test_equality_multiple(self, settings, o_settings) -> None: Two objects compare themselves using the == operator and the != operator. """ - if settings == o_settings: - assert settings == o_settings - assert settings == o_settings - else: - assert settings != o_settings - assert settings != o_settings + expected = dict(settings) == dict(o_settings) + assert (settings == o_settings) == expected + assert (o_settings == settings) == expected + assert (settings != o_settings) != expected + assert (o_settings != settings) != expected + + @given(settings=SettingsStrategy, updates=SettingsStrategy) + def test_equality_tracks_unacknowledged_values(self, settings, updates) -> None: + """ + Pending changes affect equality until both objects acknowledge them. + """ + other = h2.settings.Settings(initial_values=dict(settings)) + assert settings == other + + settings.update(updates) + assert settings != other + + other.update(updates) + assert settings == other + + settings.acknowledge() + assert settings != other + + other.acknowledge() + assert settings == other + + @given(settings=SettingsStrategy, updates=SettingsStrategy) + def test_equality_compares_all_pending_values(self, settings, updates) -> None: + """ + Pending histories can differ despite equal current and final values. + """ + initial_values = dict(settings) + other = h2.settings.Settings(initial_values=initial_values) + + settings.update(updates) + settings.update(initial_values) + other.update(initial_values) + other.update(initial_values) + + expected = dict(updates) == initial_values + assert (settings == other) == expected + assert (settings != other) != expected @given(settings=SettingsStrategy) def test_another_type_equality(self, settings) -> None: @@ -445,7 +481,7 @@ def test_another_type_equality(self, settings) -> None: (which does not implement the comparison) using the == operator. """ obj = object() - assert (settings != obj) + assert (settings == obj) is False assert settings != obj @given(settings=SettingsStrategy)