Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions pycommons/lang/utils/stringutils.py
Original file line number Diff line number Diff line change
Expand Up @@ -328,5 +328,8 @@ def region_matches(
return False

@classmethod
def to_character(cls, c: str) -> Optional[Char]:
return CharUtils.to_character(c)
def to_character(cls, c: Optional[str]) -> Optional[Char]:
if cls.is_empty(c):
return None

return CharUtils.to_character(typing.cast(str, c)[0])
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ max-locals = 20
min-public-method = 0

[tool.pytest.ini_options]
addopts = "--cov=pycommons --cov-branch --cov-report term-missing --cov-report xml -vv --color=yes --cov-fail-under 5"
addopts = "--cov=pycommons --cov-branch --cov-report term-missing --cov-report xml -vv --color=yes --cov-fail-under 10"
python_files = "tests.py test_*.py *_tests.py *Test.py"

[build-system]
Expand Down
30 changes: 30 additions & 0 deletions tests/parametrized.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import dataclasses
import functools
from typing import Any, Optional, List


@dataclasses.dataclass
class TestData:
data: Any
expected: Any

message: Optional[str] = None

def get_message(self):
return (
f"{self.message if self.message else 'TestCase'} "
f"(data={self.data}, expected={self.expected})"
)


def cases(testcases: List[TestData]):
def decorator(f):
@functools.wraps(f)
def wrapped(self):
for case in testcases:
with self.subTest(case.get_message()):
f(self, case)

return wrapped

return decorator
21 changes: 0 additions & 21 deletions tests/pycommons/lang/charutils_tests.py

This file was deleted.

Empty file.
158 changes: 158 additions & 0 deletions tests/pycommons/lang/utils/charutils_tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
from unittest import TestCase

from pycommons.lang.utils.charutils import CharUtils
from tests.parametrized import cases, TestData


class CharUtilsTest(TestCase):
@cases(
[
TestData(data=" ", expected=True),
TestData(data="\t", expected=True),
TestData(data="\f", expected=True),
TestData(data="\u001D", expected=True),
TestData(data="a", expected=False),
TestData(data="1", expected=False),
TestData(data="*", expected=False),
TestData(data=None, expected=False),
]
)
def test_is_whitespace(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_whitespace(test_case.data))

@cases(
[
TestData(data="a", expected=True),
TestData(data="1", expected=True),
TestData(data="*", expected=True),
TestData(data="\u001D", expected=False),
TestData(data=None, expected=False),
TestData(data="ಕ", expected=False),
]
)
def test_is_ascii_printable(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_ascii_printable(test_case.data))

@cases(
[
TestData(data=" ", expected=False),
TestData(data="\t", expected=False),
TestData(data="a", expected=False),
TestData(data="1", expected=True),
TestData(data="Ⅳ", expected=False),
TestData(data=None, expected=False),
]
)
def test_is_digit(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_digit(test_case.data))

@cases(
[
TestData(data=" ", expected=False),
TestData(data="\t", expected=False),
TestData(data="a", expected=True),
TestData(data="1", expected=False),
TestData(data="Ⅳ", expected=False),
TestData(data="ಕ", expected=True),
TestData(data=None, expected=False),
]
)
def test_is_letter(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_letter(test_case.data))

@cases(
[
TestData(data=" ", expected=False),
TestData(data="a", expected=True),
TestData(data="1", expected=True),
TestData(data="Ⅳ", expected=True),
TestData(data="ಕ", expected=True),
TestData(data=None, expected=False),
]
)
def test_is_letter_or_digit(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_letter_or_digit(test_case.data))

@cases(
[
TestData(data=" ", expected=False),
TestData(data="a", expected=False),
TestData(data="A", expected=True),
TestData(data="1", expected=False),
TestData(data="Ⅳ", expected=True),
TestData(data="ಕ", expected=False),
TestData(data=None, expected=False),
]
)
def test_is_uppercase(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_uppercase(test_case.data))

@cases(
[
TestData(data=" ", expected=False),
TestData(data="a", expected=True),
TestData(data="A", expected=False),
TestData(data="1", expected=False),
TestData(data="Ⅳ", expected=False),
TestData(data="ಕ", expected=False),
TestData(data=None, expected=False),
]
)
def test_is_lowercase(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_lowercase(test_case.data))

@cases(
[
TestData(data=" ", expected=" "),
TestData(data="a", expected="a"),
TestData(data="A", expected="A"),
TestData(data="1", expected="1"),
TestData(data="Ⅳ", expected="Ⅳ"),
TestData(data="ಕ", expected="ಕ"),
TestData(data=None, expected=None),
]
)
def test_to_character(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.to_character(test_case.data))

@cases(
[
TestData(data=(" ", "\t"), expected=False),
TestData(data=("a", "a"), expected=True),
TestData(data=("1", "1"), expected=True),
TestData(data=(69, 78), expected=False),
TestData(data=(None, "1"), expected=False),
TestData(data=("1", None), expected=False),
TestData(data=(None, None), expected=False),
]
)
def test_is_equal(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.is_equal(*test_case.data))

@cases(
[
TestData(data=" ", expected=" "),
TestData(data="a", expected="A"),
TestData(data="A", expected="A"),
TestData(data="1", expected="1"),
TestData(data="Ⅳ", expected="Ⅳ"),
TestData(data="ಕ", expected="ಕ"),
TestData(data=None, expected=None),
]
)
def test_to_uppercase(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.to_uppercase(test_case.data))

@cases(
[
TestData(data=" ", expected=" "),
TestData(data="a", expected="a"),
TestData(data="A", expected="a"),
TestData(data="1", expected="1"),
TestData(data="Ⅳ", expected="ⅳ"),
TestData(data="ಕ", expected="ಕ"),
TestData(data=None, expected=None),
]
)
def test_to_lowercase(self, test_case: TestData):
self.assertEqual(test_case.expected, CharUtils.to_lowercase(test_case.data))
21 changes: 21 additions & 0 deletions tests/pycommons/lang/utils/test_objectutils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from unittest import TestCase

from pycommons.lang.utils.objectutils import ObjectUtils


class TestObjectUtils(TestCase):
def test_require_not_none_without_error(self):
with self.assertRaises(ValueError):
ObjectUtils.require_not_none(None)

def test_require_not_none_with_custom_error(self):
with self.assertRaises(TypeError):
ObjectUtils.require_not_none(None, TypeError())

def test_require_not_none_with_non_null_value(self):
obj = object()
ObjectUtils.require_not_none(obj)

def test_get_not_none(self):
obj = object()
self.assertEqual(obj, ObjectUtils.get_not_none(obj))