Przeglądaj źródła

calcex.Figure: added comparison operators

Fabian Peter Hammerle 8 lat temu
rodzic
commit
c3d10eecdc
2 zmienionych plików z 49 dodań i 8 usunięć
  1. 9 0
      ioex/calcex.py
  2. 40 8
      tests/calcex/test_figure.py

+ 9 - 0
ioex/calcex.py

@@ -34,6 +34,9 @@ class Figure(object):
     """ use property() instead of decorator to enable overriding """
     unit = property(get_unit, set_unit)
 
+    def __repr__(self):
+        return '{}(value = {!r}, unit = {})'.format(type(self).__name__, self.value, self.unit)
+
     def __str__(self):
         if self.value is None and self.unit is None:
             return '?'
@@ -43,3 +46,9 @@ class Figure(object):
             return '? {}'.format(self.unit)
         else:
             return '{} {}'.format(self.value, self.unit)
+
+    def __eq__(self, other):
+        return type(self) == type(other) and vars(self) == vars(other)
+
+    def __ne__(self, other):
+        return not (self == other)

+ 40 - 8
tests/calcex/test_figure.py

@@ -4,19 +4,33 @@ import pytest
 from ioex.calcex import Figure
 
 
-@pytest.mark.parametrize(('init_kwargs', 'expected_value', 'expected_unit'), [
-    [{}, None, None],
-    [{'value': 123.4}, 123.4, None],
-    [{'unit': 'm/s²'}, None, 'm/s²'],
-    [{'value': 123.4, 'unit': 'm/s²'}, 123.4, 'm/s²'],
-    [{'value': 1234, 'unit': '米/s²'}, 1234, '米/s²'],
+@pytest.mark.parametrize(('init_params', 'init_kwargs', 'expected_value', 'expected_unit'), [
+    [[], {}, None, None],
+    [[123.4], {}, 123.4, None],
+    [[None, 'm/s²'], {}, None, 'm/s²'],
+    [[123.4, 'm/s²'], {}, 123.4, 'm/s²'],
+    [[1234, '米/s²'], {}, 1234, '米/s²'],
+    [[], {'value': 123.4}, 123.4, None],
+    [[], {'unit': 'm/s²'}, None, 'm/s²'],
+    [[], {'value': 123.4, 'unit': 'm/s²'}, 123.4, 'm/s²'],
+    [[], {'value': 1234, 'unit': '米/s²'}, 1234, '米/s²'],
+    [[1234], {'unit': '米/s²'}, 1234, '米/s²'],
 ])
-def test_init(init_kwargs, expected_value, expected_unit):
-    f = Figure(**init_kwargs)
+def test_init(init_params, init_kwargs, expected_value, expected_unit):
+    f = Figure(*init_params, **init_kwargs)
     assert expected_value == f.value
     assert expected_unit == f.unit
 
 
+@pytest.mark.parametrize(('init_params', 'init_kwargs'), [
+    [[12.34], {'value': 123.4}],
+    [[12, 'm/h'], {'unit': 'm/s²'}],
+])
+def test_init_multiple_values(init_params, init_kwargs):
+    with pytest.raises(Exception):
+        Figure(*init_params, **init_kwargs)
+
+
 @pytest.mark.parametrize(('value'), [
     1234,
     123.4,
@@ -47,6 +61,7 @@ def test_set_unit(unit):
     f.set_unit(unit)
     assert unit == f.unit
 
+
 @pytest.mark.parametrize(('figure', 'expected_string'), [
     [Figure(), '?'],
     [Figure(value=123.4), '123.4'],
@@ -56,3 +71,20 @@ def test_set_unit(unit):
 ])
 def test_str(figure, expected_string):
     assert expected_string == str(figure)
+
+@pytest.mark.parametrize(('a', 'b'), [
+    [Figure(1, 'm'), Figure(1, 'm')],
+])
+def test_eq(a, b):
+    assert a == b
+    print(a == b, a != b)
+    assert not (a != b)
+
+@pytest.mark.parametrize(('a', 'b'), [
+    [Figure(1, 'm'), Figure(2, 'g')],
+    [Figure(1, 'm'), Figure(2, 'm')],
+    [Figure(2, 'm'), Figure(2, 'g')],
+])
+def test_neq(a, b):
+    assert a != b
+    assert not (a == b)