Skip to content

Commit

Permalink
add test for 2 result models
Browse files Browse the repository at this point in the history
  • Loading branch information
HansBug committed Feb 28, 2021
1 parent 34d61ca commit 69ef1ac
Show file tree
Hide file tree
Showing 11 changed files with 140 additions and 9 deletions.
2 changes: 1 addition & 1 deletion pyspj/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from .model import *
from .models import *
File renamed without changes.
1 change: 1 addition & 0 deletions pyspj/model/__init__.py → pyspj/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from .base import SPJResult
from .continuity import ContinuitySPJResult
from .general import load_result
from .simple import SimpleSPJResult
8 changes: 3 additions & 5 deletions pyspj/model/base.py → pyspj/models/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@
def _check_message(message: str) -> str:
message = message.strip()
_message_lines = split_to_lines(message)
if not _message_lines:
warnings.warn('Message contains 0 line, no message will be displayed.')
elif len(_message_lines) > 1:
if len(_message_lines) > 1:
warnings.warn('Message contains {n} lines, '
'we strongly recommend you to simplify the '
'message into exactly 1 line to keep its briefness.'.format(n=repr(len(_message_lines))))
Expand Down Expand Up @@ -57,7 +55,7 @@ def __repr__(self):
return get_repr_info(
cls=self.__class__,
args=[
('correctness', lambda: repr(self.__correctness)),
('message', lambda: truncate(repr(self.__message), width=64, tail_length=16, show_length=True))
('correctness', lambda: repr(self.correctness)),
('message', lambda: truncate(repr(self.message), width=64, tail_length=16, show_length=True))
]
)
6 changes: 3 additions & 3 deletions pyspj/model/continuity.py → pyspj/models/continuity.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ def __repr__(self):
return get_repr_info(
cls=self.__class__,
args=[
('correctness', lambda: repr(self.__correctness)),
('score', lambda: '%.3f' % self.__score),
('message', lambda: truncate(repr(self.__message), width=64, tail_length=16, show_length=True)),
('correctness', lambda: repr(self.correctness)),
('score', lambda: '%.3f' % self.score),
('message', lambda: truncate(repr(self.message), width=64, tail_length=16, show_length=True)),
]
)
66 changes: 66 additions & 0 deletions pyspj/models/general.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
from typing import Tuple, Optional

from .base import SPJResult
from .continuity import ContinuitySPJResult
from .simple import SimpleSPJResult


def _load_from_values(correctness, score, message, detail) -> SPJResult:
if score is None:
return SimpleSPJResult(correctness, message, detail)
else:
return ContinuitySPJResult(correctness, score, message, detail)


def _load_result_from_dict(data: dict) -> SPJResult:
_correctness = data['correctness']
_score = data.get('score', None)
_message = data.get('message', None)
_detail = data.get('detail', None)

return _load_from_values(_correctness, _score, _message, _detail)


def _load_core_result_from_tuple(head) -> Tuple[bool, Optional[float]]:
if isinstance(head, (list, tuple)):
_correctness, _score = tuple(head)
else:
_correctness, _score = head, None

return _correctness, _score


def _load_result_from_tuple(data: tuple) -> SPJResult:
if not data:
raise ValueError(
'Tuple result should has no less than 1 object but {actual} found.'.format(actual=repr(len(data))))
elif len(data) == 1:
_core, _message, _detail = data[0], None, None
elif len(data) == 2:
(_core, _message), _detail = data, None
elif len(data) == 3:
_core, _message, _detail = data
else:
raise ValueError(
'Tuple result should has no more than 3 object but {actual} found.'.format(actual=repr(len(data))))

_correctness, _score = _load_core_result_from_tuple(_core)
return _load_from_values(_correctness, _score, _message, _detail)


def load_result(data) -> SPJResult:
"""
load result from all kinds of data
:param data: raw data
:return: spj result
"""
if isinstance(data, SimpleSPJResult):
return data
elif isinstance(data, ContinuitySPJResult):
return data
elif isinstance(data, dict):
return _load_result_from_dict(data)
elif isinstance(data, (list, tuple)):
return _load_result_from_tuple(tuple(data))
else:
return SimpleSPJResult(not not data)
File renamed without changes.
1 change: 1 addition & 0 deletions test/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
from .config import *
from .models import *
from .utils import *
2 changes: 2 additions & 0 deletions test/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from .test_continuity import TestModelsContinuity
from .test_simple import TestModelsSimple
33 changes: 33 additions & 0 deletions test/models/test_continuity.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import os

import pytest

from pyspj.models import ContinuitySPJResult


@pytest.mark.unittest
class TestModelsContinuity:
def test_simple(self):
result = ContinuitySPJResult(True, 0.5, '123', '12345')
assert result.correctness
assert result.score == 0.5
assert result.message == '123'
assert result.detail == '12345'

def test_invalid_score(self):
with pytest.raises(ValueError):
ContinuitySPJResult(True, -0.5, '123', '12345')
with pytest.raises(ValueError):
ContinuitySPJResult(True, 1.5, '123', '12345')

def test_to_json(self):
result = ContinuitySPJResult(True, 0.5, '123', '12345')
assert result.to_json() == {'correctness': True, 'detail': '12345', 'message': '123', 'score': 0.5}

def test_repr(self):
result = ContinuitySPJResult(True, 0.5, '123', '12345')
assert repr(result) == "<ContinuitySPJResult correctness: True, score: 0.500, message: '123'>"


if __name__ == "__main__":
pytest.main([os.path.abspath(__file__)])
30 changes: 30 additions & 0 deletions test/models/test_simple.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import os

import pytest

from pyspj.models.simple import SimpleSPJResult


@pytest.mark.unittest
class TestModelsSimple:
def test_simple(self):
result = SimpleSPJResult(True, '123', '12345')
assert result.correctness
assert result.message == '123'
assert result.detail == '12345'

def test_to_json(self):
result = SimpleSPJResult(True, '123', '12345')
assert result.to_json() == {'correctness': True, 'detail': '12345', 'message': '123'}

def test_repr(self):
result = SimpleSPJResult(True, '123', '12345')
assert repr(result) == "<SimpleSPJResult correctness: True, message: '123'>"

def test_message_warning_greater_than_1(self):
with pytest.warns(Warning):
SimpleSPJResult(True, '1 2 3 4 5\nskdjflsd', '12345')


if __name__ == "__main__":
pytest.main([os.path.abspath(__file__)])

0 comments on commit 69ef1ac

Please sign in to comment.