|
2 | 2 |
|
3 | 3 | import mlc
|
4 | 4 | import mlc.dataclasses as mlcd
|
| 5 | +import pytest |
5 | 6 |
|
6 | 7 |
|
7 | 8 | @mlcd.py_class("mlc.testing.py_class_base")
|
@@ -57,6 +58,12 @@ def __post_init__(self) -> None:
|
57 | 58 | self.b = self.b.upper()
|
58 | 59 |
|
59 | 60 |
|
| 61 | +@mlcd.py_class("mlc.testing.py_class_frozen", frozen=True) |
| 62 | +class Frozen(mlcd.PyClass): |
| 63 | + a: int |
| 64 | + b: str |
| 65 | + |
| 66 | + |
60 | 67 | def test_base() -> None:
|
61 | 68 | base = Base(1, "a")
|
62 | 69 | base_str = "mlc.testing.py_class_base(base_a=1, base_b='a')"
|
@@ -120,6 +127,30 @@ def test_post_init() -> None:
|
120 | 127 | assert repr(post_init) == "mlc.testing.py_class_post_init(a=1, b='A')"
|
121 | 128 |
|
122 | 129 |
|
| 130 | +def test_frozen_set_fail() -> None: |
| 131 | + frozen = Frozen(1, "a") |
| 132 | + with pytest.raises(AttributeError) as e: |
| 133 | + frozen.a = 2 |
| 134 | + # depends on Python version, there are a few possible error messages |
| 135 | + assert str(e.value) in [ |
| 136 | + "property 'a' of 'Frozen' object has no setter", |
| 137 | + "can't set attribute", |
| 138 | + ] |
| 139 | + assert frozen.a == 1 |
| 140 | + assert frozen.b == "a" |
| 141 | + |
| 142 | + |
| 143 | +def test_frozen_force_set() -> None: |
| 144 | + frozen = Frozen(1, "a") |
| 145 | + frozen._mlc_setattr("a", 2) |
| 146 | + assert frozen.a == 2 |
| 147 | + assert frozen.b == "a" |
| 148 | + |
| 149 | + frozen._mlc_setattr("b", "b") |
| 150 | + assert frozen.a == 2 |
| 151 | + assert frozen.b == "b" |
| 152 | + |
| 153 | + |
123 | 154 | def test_derived_derived() -> None:
|
124 | 155 | # __init__(base_a, derived_derived_a, base_b, derived_a, derived_b)
|
125 | 156 | obj = DerivedDerived(1, "a", [1, 2], 2, "b")
|
|
0 commit comments