diff --git a/fastjsonschema/draft04.py b/fastjsonschema/draft04.py index f4640c2..2e4c48b 100644 --- a/fastjsonschema/draft04.py +++ b/fastjsonschema/draft04.py @@ -418,7 +418,7 @@ def generate_unique_items(self): 'for k, v in var.items()).items()) ' 'if hasattr(var, "items") else tuple(fn(v) ' 'for v in var) ' - 'if isinstance(var, (dict, list)) else str(var) ' + 'if isinstance(var, (dict, list)) else (bool, var) ' 'if isinstance(var, bool) else var') self.create_variable_with_length() with self.l('if {variable}_len > len(set(fn({variable}_x) for {variable}_x in {variable})):'): diff --git a/tests/test_array.py b/tests/test_array.py index 2de8e6e..6b273ee 100644 --- a/tests/test_array.py +++ b/tests/test_array.py @@ -73,6 +73,25 @@ def test_unique_items(asserter, value, expected): }, value, expected) +@pytest.mark.parametrize('draft', ['04', '06', '07']) +@pytest.mark.parametrize('value', [ + [True, 'True'], + [False, 'False'], + [[True], ['True']], + [[False], ['False']], + [{'a': True}, {'a': 'True'}], + [{'a': False}, {'a': 'False'}], + [True, 1], + [False, 0], +]) +def test_unique_items_distinguishes_booleans(asserter, draft, value): + asserter({ + '$schema': 'http://json-schema.org/draft-{}/schema'.format(draft), + 'type': 'array', + 'uniqueItems': True, + }, value, value) + + def test_not_unique_items(asserter): value = [{'id': 1}, {'id': 1}] asserter({