From 0330ce72a6e62c7294bc79b210b0e7628bea8989 Mon Sep 17 00:00:00 2001 From: Shubham Padkonde Date: Sun, 4 Oct 2026 11:29:55 +0530 Subject: [PATCH] Fix repeated-field multiplicity in struct equivalence --- src-python/amazon/ion/equivalence.py | 9 +++++++-- tests/test_equivalence.py | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src-python/amazon/ion/equivalence.py b/src-python/amazon/ion/equivalence.py index 01358c3ee..3772a4c3b 100644 --- a/src-python/amazon/ion/equivalence.py +++ b/src-python/amazon/ion/equivalence.py @@ -141,11 +141,16 @@ def _structs_eq(a, b, comparison_func): return False if isinstance(a, (IonPyDict, Multimap)) and isinstance(b, (IonPyDict, Multimap)): values_a = a.get_all_values(key) - values_b = b.get_all_values(key) + values_b = list(b.get_all_values(key)) if len(values_a) != len(values_b): return False for value_a in values_a: - if not any(comparison_func(value_a, value_b) for value_b in values_b): + for i, value_b in enumerate(values_b): + if comparison_func(value_a, value_b): + # Each field occurrence must match a distinct occurrence. + del values_b[i] + break + else: return False else: if not comparison_func(a[key], b[key]): diff --git a/tests/test_equivalence.py b/tests/test_equivalence.py index 6cb7001e4..cbdc52b91 100644 --- a/tests/test_equivalence.py +++ b/tests/test_equivalence.py @@ -387,3 +387,27 @@ def _generate_equiv_dicts(equivs): ) def test_equivalence(p): p.assertion() + + +@parametrize( + ([1, 1, 2], [1, 2, 2], False), + ([1, 1, 2], [2, 1, 1], True), + ([[1], [1], [2]], [[1], [2], [2]], False), + ([[1], [1], [2]], [[2], [1], [1]], True), + ([float('nan'), float('nan'), 1.0], [float('nan'), 1.0, 1.0], False), + ([float('nan'), float('nan'), 1.0], [1.0, float('nan'), float('nan')], True), + ([0.0, 0.0, -0.0], [0.0, -0.0, -0.0], False), +) +def test_duplicate_field_multiplicity(p): + values_a, values_b, expected = p + a, b = IonPyDict(), IonPyDict() + for value in values_a: + a.add_item('field', value) + for value in values_b: + b.add_item('field', value) + items_a, items_b = a.items(), b.items() + + assert ion_equals(a, b) is expected + assert ion_equals(b, a) is expected + assert a.items() == items_a + assert b.items() == items_b