def test_quantity_deserialization(): s = json.dumps(datatypes.Quantity(3.5, 'meters'), cls=datatypes.JSONEncoder) quantity = json.loads(s, object_hook=datatypes.JSONEncoder.object_hook) assert quantity.units == 'meters' assert quantity.magnitude == 3.5 assert quantity.pint_units == datatypes.ureg.Unit('meter')
def test_quantity_deserialization_unitless(): # when using None as unit, it's a dimensionless quantity s = json.dumps(datatypes.Quantity(3.5, None), cls=datatypes.JSONEncoder) quantity = json.loads(s, object_hook=datatypes.JSONEncoder.object_hook) assert quantity.units == None assert quantity.magnitude == 3.5 assert quantity.pint_units == datatypes.ureg.Unit('1')
def test_quantity_deserialization_base_units(): # when using None as unit, it's a dimensionless quantity s = json.dumps(datatypes.Quantity(3500, 'kilometers', True), cls=datatypes.JSONEncoder) quantity = json.loads(s, object_hook=datatypes.JSONEncoder.object_hook) assert quantity.units == 'kilometers' assert quantity.magnitude == 3.5 assert quantity.magnitude_in_base_units == 3500 assert quantity.pint_units == datatypes.ureg.Unit('kilometers')
def test_quantity_serialization_string(): # The magnitude may be passed as anything that can be converted to a float s = json.dumps(datatypes.Quantity("3.5", None), cls=datatypes.JSONEncoder) assert json.loads(s) == { '_type': 'quantity', 'units': None, 'magnitude_in_base_units': 3.5, 'dimensionality': 'dimensionless' }
def test_quantity_serialization_unitless(): # when using None as unit, it's a dimensionless quantity s = json.dumps(datatypes.Quantity(3.5, None), cls=datatypes.JSONEncoder) assert json.loads(s) == { '_type': 'quantity', 'units': None, 'magnitude_in_base_units': 3.5, 'dimensionality': 'dimensionless' }
def test_quantity_valid_data_dimensionless(): schema = { 'type': 'object', 'properties': { 'test': datatypes.Quantity.JSON_SCHEMA } } data = {'test': datatypes.Quantity(1, None)} raw_data = json.loads(json.dumps(data, cls=datatypes.JSONEncoder)) jsonschema.validate(raw_data, schema)
def test_quantity_serialization_units(): # units passed as strings are kept as is, even though they might not be in the canonical form s = json.dumps(datatypes.Quantity(3.5, 'meters'), cls=datatypes.JSONEncoder) assert json.loads(s) == { '_type': 'quantity', 'units': 'meters', 'magnitude_in_base_units': 3.5, 'dimensionality': '[length]' }
def test_quantity_serialization_units_pint(): # any unit recognized by pint can be used s = json.dumps(datatypes.Quantity(3.5, datatypes.ureg.Unit("kilometers")), cls=datatypes.JSONEncoder) assert json.loads(s) == { '_type': 'quantity', 'units': 'kilometer', 'magnitude_in_base_units': 3500, 'dimensionality': '[length]' }
def test_quantity_less_than_equals(objects): object1 = objects.create_object(action_id=0, data={'q': datatypes.Quantity(1, 'meter')}, schema={}, user_id=0) objects.create_object(action_id=0, data={'q': datatypes.Quantity(1, 'kilometer')}, schema={}, user_id=0) assert [object1] == objects.get_current_objects(lambda data: where_filters.quantity_less_than_equals(data['q'], datatypes.Quantity(1, 'meter')))
def test_quantity_equals_epsilon(objects): object1 = objects.create_object(action_id=0, data={'q': datatypes.Quantity(10, 'mg')}, schema={}, user_id=0) objects.create_object(action_id=0, data={'q': datatypes.Quantity(9.99, 'mg')}, schema={}, user_id=0) assert [object1] == objects.get_current_objects(lambda data: where_filters.quantity_equals(data['q'], datatypes.Quantity(0.00001, 'kg')))
def test_quantity_between_excluding(objects): object1 = objects.create_object(action_id=0, data={'q': datatypes.Quantity(1, 'meter')}, schema={}, user_id=0) objects.create_object(action_id=0, data={'q': datatypes.Quantity(1, 'centimeter')}, schema={}, user_id=0) assert [] == objects.get_current_objects(lambda data: where_filters.quantity_between(data['q'], datatypes.Quantity(10, 'centimeters'), datatypes.Quantity(1, 'meter'), including=False)) assert [object1] == objects.get_current_objects(lambda data: where_filters.quantity_between(data['q'], datatypes.Quantity(10, 'centimeters'), datatypes.Quantity(1.1, 'meter'), including=False))
def test_strict_serialization_filter_types(): datatypes.JSONEncoder.STRICT = True # objects of serializable types will be ignored json.dumps({'length': datatypes.Quantity(10, 'meter')}, cls=datatypes.JSONEncoder) datatypes.JSONEncoder.STRICT = False
def test_quantity_invalid_value(): with pytest.raises(ValueError): datatypes.Quantity(1, 'invalid')
def test_quantity_equals(): assert datatypes.Quantity(1, None) == datatypes.Quantity(1, None) assert datatypes.Quantity(1, None) != datatypes.Quantity(2, None) assert datatypes.Quantity(1, 'meter') == datatypes.Quantity( 0.001, 'kilometers') assert datatypes.Quantity(1, 'meter') != datatypes.Quantity(1, 'second')
def test_quantity_serialization_string_invalid(): with pytest.raises(ValueError): json.dumps(datatypes.Quantity("3.5m", None), cls=datatypes.JSONEncoder)