from __future__ import absolute_import
# Copyright (c) 2010-2017 openpyxl
import pytest
from .. import Strict
[docs]class TestDescriptor:
from ..base import Descriptor
[docs] def test_ctor(self):
d = self.Descriptor('key', size=1)
assert d.name == 'key'
assert d.size == 1
[docs] def test_setter(self):
d = self.Descriptor('key')
client = self.Dummy()
d.__set__(client, 42)
assert client.key == 42
@pytest.fixture
[docs]def boolean():
from ..base import Bool
class Dummy(Strict):
value = Bool()
return Dummy()
[docs]class TestBool:
[docs] def test_valid(self, boolean):
boolean.value = True
assert boolean.value
@pytest.mark.parametrize("value, expected",
[
(1, True,),
(0, False),
('true', True),
('false', False),
('0', False),
('f', False),
('', False),
([], False)
]
)
[docs] def test_cast(self, boolean, value, expected):
boolean.value = value
assert boolean.value == expected
[docs]def test_nested():
from ..base import Bool
class DummyNested(Strict):
value = Bool(nested=True)
dummy = DummyNested()
dummy.value = True
assert dummy.__class__.value.nested == True
@pytest.fixture
[docs]def integer():
from ..base import Integer
class Dummy(Strict):
value = Integer()
return Dummy()
[docs]class TestInt:
[docs] def test_valid(self, integer):
integer.value = 4
assert integer.value == 4
@pytest.mark.parametrize("value", ['a', '4.5', None])
[docs] def test_invalid(self, integer, value):
with pytest.raises(TypeError):
integer.value = value
@pytest.mark.parametrize("value, expected",
[
('4', 4),
(4.5, 4),
])
[docs] def test_cast(self, integer, value, expected):
integer.value = value
assert integer.value == expected
@pytest.fixture
[docs]def float():
from ..base import Float
class Dummy(Strict):
value = Float()
return Dummy()
[docs]class TestFloat:
[docs] def test_valid(self, float):
float.value = 4
assert float.value == 4
@pytest.mark.parametrize("value", ['a', None])
[docs] def test_invalid(self, float, value):
with pytest.raises(TypeError):
float.value = value
@pytest.mark.parametrize("value, expected",
[
('4.5', 4.5),
(4.5, 4.5),
(4, 4.0),
])
[docs] def test_cast(self, float, value, expected):
float.value = value
assert float.value == expected
@pytest.fixture
[docs]def allow_none():
from ..base import Float
class Dummy(Strict):
value = Float(allow_none=True)
return Dummy()
[docs]class TestAllowNone:
[docs] def test_valid(self, allow_none):
allow_none.value = None
assert allow_none.value is None
@pytest.fixture
[docs]def maximum():
from ..base import Max
class Dummy(Strict):
value = Max(max=5)
return Dummy()
[docs]class TestMax:
[docs] def test_ctor(self):
from ..base import Max
with pytest.raises(TypeError):
class Dummy(Strict):
value = Max()
[docs] def test_valid(self, maximum):
maximum.value = 4
assert maximum.value == 4
[docs] def test_invalid(self, maximum):
with pytest.raises(ValueError):
maximum.value = 6
@pytest.fixture
[docs]def minimum():
from ..base import Min
class Dummy(Strict):
value = Min(min=0)
return Dummy()
[docs]class TestMin:
[docs] def test_ctor(self):
from ..base import Min
with pytest.raises(TypeError):
class Dummy(Strict):
value = Min()
[docs] def test_valid(self, minimum):
minimum.value = 2
assert minimum.value == 2
[docs] def test_invalid(self, minimum):
with pytest.raises(ValueError):
minimum.value = -1
@pytest.fixture
[docs]def min_max():
from ..base import MinMax
class Dummy(Strict):
value = MinMax(min=-1, max=1)
return Dummy()
[docs]class TestMinMax:
[docs] def test_ctor(self):
from ..base import MinMax
with pytest.raises(TypeError):
class Dummy(Strict):
value = MinMax(min=-10)
with pytest.raises(TypeError):
class Dummy(Strict):
value = MinMax(max=10)
[docs] def test_valid(self, min_max):
min_max.value = 1
assert min_max.value == 1
[docs] def test_invalid(self, min_max):
with pytest.raises(ValueError):
min_max.value = 2
@pytest.fixture
[docs]def set():
from ..base import Set
class Dummy(Strict):
value = Set(values=[1, 'a', None])
return Dummy()
[docs]class TestValues:
[docs] def test_ctor(self):
from ..base import Set
with pytest.raises(TypeError):
class Dummy(Strict):
value = Set()
[docs] def test_valid(self, set):
set.value = 1
assert set.value == 1
[docs] def test_invalid(self, set):
with pytest.raises(ValueError):
set.value = 2
[docs]def test_noneset():
from ..base import NoneSet
class Dummy(Strict):
value = NoneSet(values=[1, 2, 3])
obj = Dummy()
obj.value = 'none'
assert obj.value is None
with pytest.raises(ValueError):
obj.value = 5
@pytest.fixture
[docs]def ascii():
from ..base import ASCII
class Dummy(Strict):
value = ASCII()
return Dummy()
[docs]class TestASCII:
[docs] def test_valid(self, ascii):
ascii.value = b'some text'
assert ascii.value == b'some text'
value = b'\xc3\xbc'.decode("utf-8")
@pytest.mark.parametrize("value",
[
value,
10,
[]
]
)
[docs] def test_invalid(self, ascii, value):
with pytest.raises(TypeError):
ascii.value = value
@pytest.fixture
[docs]def string():
from ..base import String
class Dummy(Strict):
value = String()
return Dummy()
[docs]class TestString:
[docs] def test_valid(self, string):
value = b'\xc3\xbc'.decode("utf-8")
string.value = value
assert string.value == value
[docs] def test_invalid(self, string):
with pytest.raises(TypeError):
string.value = 5
@pytest.fixture
[docs]def Tuple():
from ..base import Tuple
class Dummy(Strict):
value = Tuple()
return Dummy()
[docs]class TestTuple:
[docs] def test_valid(self, Tuple):
Tuple.value = (1, 2)
assert Tuple.value == (1, 2)
[docs] def test_invalid(self, Tuple):
with pytest.raises(TypeError):
Tuple.value = [1, 2, 3]
@pytest.fixture
[docs]def Length():
from ..base import Length
class Dummy(Strict):
value = Length(length=4)
return Dummy()
[docs]class TestLength:
[docs] def test_valid(self, Length):
Length.value = "this"
[docs] def test_invalid(self, Length):
with pytest.raises(ValueError):
Length.value = "2"