From 2fc222c2a24108d53b5729f4c69a302276e2d48f Mon Sep 17 00:00:00 2001 From: leiserfg Date: Mon, 9 Dec 2019 22:25:01 +0100 Subject: [PATCH] Use decimal for multipleOf implementation and add respective tests --- fastjsonschema/draft04.py | 3 ++- tests/test_number.py | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/fastjsonschema/draft04.py b/fastjsonschema/draft04.py index f97a93b..f972174 100644 --- a/fastjsonschema/draft04.py +++ b/fastjsonschema/draft04.py @@ -301,7 +301,8 @@ def generate_multiple_of(self): with self.l('if isinstance({variable}, (int, float)):'): if not isinstance(self._definition['multipleOf'], (int, float)): raise JsonSchemaDefinitionException('multipleOf must be a number') - self.l('quotient = {variable} / {multipleOf}') + self.l('from decimal import Decimal') + self.l('quotient = Decimal(repr({variable})) / Decimal(repr({multipleOf}))') with self.l('if int(quotient) != quotient:'): self.exc('{name} must be multiple of {multipleOf}', rule='multipleOf') diff --git a/tests/test_number.py b/tests/test_number.py index 88bad13..dd2f6b0 100644 --- a/tests/test_number.py +++ b/tests/test_number.py @@ -111,6 +111,30 @@ def test_multiple_of(asserter, number_type, value, expected): }, value, expected) + +exc = JsonSchemaException('data must be multiple of 0.0001', value='{data}', name='data', definition='{definition}', rule='multipleOf') +@pytest.mark.parametrize('value, expected', [ + (0.00751, exc), + (0.0075, 0.0075), +]) +def test_multiple_of_float(asserter, value, expected): + asserter({ + 'type': 'number', + 'multipleOf': 0.0001, + }, value, expected) + +exc = JsonSchemaException('data must be multiple of 1.5', value='{data}', name='data', definition='{definition}', rule='multipleOf') +@pytest.mark.parametrize('value, expected', [ + (0, 0), + (4.5, 4.5), + (35, exc), +]) +def test_multiple_of_float_1_5(asserter, value, expected): + asserter({ + 'type': 'number', + 'multipleOf': 1.5, + }, value, expected) + @pytest.mark.parametrize('value', ( 1.0, 0.1,