def test_repr_with_strings(): assert "DataclassBuilder(Types, int_=1, float_=1.0, str_='one')" == repr( DataclassBuilder(Types, int_=1, float_=1.0, str_="one")) assert "DataclassBuilder(Types, float_=1.0, str_='one')" == repr( DataclassBuilder(Types, float_=1.0, str_="one")) assert "DataclassBuilder(Types, str_='one')" == repr( DataclassBuilder(Types, str_="one"))
def test_init_false_field_not_required(): # fields passed in constructor builder = DataclassBuilder(Circle, radius=3.0) assert Circle(3.0) == build(builder) # fields set by assignment builder = DataclassBuilder(Circle) builder.radius = 9.0 assert Circle(9.0) == build(builder)
def test_repr(): assert "DataclassBuilder(PixelCoord, x=3, y=7)" == repr( DataclassBuilder(PixelCoord, x=3, y=7)) assert "DataclassBuilder(PixelCoord, x=3, y=7)" == repr( DataclassBuilder(PixelCoord, y=7, x=3)) assert "DataclassBuilder(PixelCoord, x=3)" == repr( DataclassBuilder(PixelCoord, x=3)) assert "DataclassBuilder(PixelCoord, y=7)" == repr( DataclassBuilder(PixelCoord, y=7))
def test_init_false_field_cannot_be_set(): # fields passed in constructor with pytest.raises(TypeError): DataclassBuilder(Circle, radius=3.0, area=10) # fields set by assignment builder = DataclassBuilder(Circle) with pytest.raises(UndefinedFieldError): builder.area = 1 try: builder.area = 1 except UndefinedFieldError as err: assert err.dataclass == Circle assert err.field == "area"
def test_undefined_field(): # fields passed in constructor with pytest.raises(TypeError): DataclassBuilder(PixelCoord, z=10) # fields set by assignment builder = DataclassBuilder(PixelCoord) with pytest.raises(UndefinedFieldError): builder.z = 1 try: builder.z = 1 except UndefinedFieldError as err: assert err.dataclass == PixelCoord assert err.field == "z"
def test_missing_field(): # fields passed in constructor builder = DataclassBuilder(PixelCoord, y=7) with pytest.raises(MissingFieldError): build(builder) try: build(builder) except MissingFieldError as err: assert err.dataclass == PixelCoord assert err.field == dataclasses.fields(PixelCoord)[0] # fields set by assignment builder = DataclassBuilder(PixelCoord) builder.x = 9 with pytest.raises(MissingFieldError): build(builder) try: build(builder) except MissingFieldError as err: assert err.dataclass == PixelCoord assert err.field == dataclasses.fields(PixelCoord)[1]
def test_fields_returns_optional_fields(): fields_ = fields(DataclassBuilder(PixelCoord), required=False) assert [] == list(fields_.keys()) assert [] == [f.name for f in fields_.values()] assert [] == [f.type for f in fields_.values()] fields_ = fields(DataclassBuilder(Point), required=False) assert ["w"] == list(fields_.keys()) assert ["w"] == [f.name for f in fields_.values()] assert [float] == [f.type for f in fields_.values()] fields_ = fields(DataclassBuilder(Circle), required=False) assert [] == list(fields_.keys()) assert [] == [f.name for f in fields_.values()] assert [] == [f.type for f in fields_.values()] fields_ = fields(DataclassBuilder(Types), required=False) assert ["str_"] == list(fields_.keys()) assert ["str_"] == [f.name for f in fields_.values()] assert [str] == [f.type for f in fields_.values()]
def test_fields_returns_required_fields(): fields_ = fields(DataclassBuilder(PixelCoord), optional=False) assert ["x", "y"] == list(fields_.keys()) assert ["x", "y"] == [f.name for f in fields_.values()] assert [int, int] == [f.type for f in fields_.values()] fields_ = fields(DataclassBuilder(Point), optional=False) assert ["x", "y"] == list(fields_.keys()) assert ["x", "y"] == [f.name for f in fields_.values()] assert [float, float] == [f.type for f in fields_.values()] fields_ = fields((DataclassBuilder(Circle)), optional=False) assert ["radius"] == list(fields_.keys()) assert ["radius"] == [f.name for f in fields_.values()] assert [float] == [f.type for f in fields_.values()] fields_ = fields(DataclassBuilder(Types), optional=False) assert ["int_", "float_"] == list(fields_.keys()) assert ["int_", "float_"] == [f.name for f in fields_.values()] assert [int, float] == [f.type for f in fields_.values()]
def test_fields_returns_settable_fields(): fields_ = fields(DataclassBuilder(PixelCoord)) assert ["x", "y"] == list(fields_.keys()) assert ["x", "y"] == [f.name for f in fields_.values()] assert [int, int] == [f.type for f in fields_.values()] fields_ = fields(DataclassBuilder(Point)) assert ["x", "y", "w"] == list(fields_.keys()) assert ["x", "y", "w"] == [f.name for f in fields_.values()] assert [float, float, float] == [f.type for f in fields_.values()] fields_ = fields(DataclassBuilder(Circle)) assert ["radius"] == list(fields_.keys()) assert ["radius"] == [f.name for f in fields_.values()] assert [float] == [f.type for f in fields_.values()] fields_ = fields(DataclassBuilder(Types)) assert ["int_", "float_", "str_"] == list(fields_.keys()) assert ["int_", "float_", "str_"] == [f.name for f in fields_.values()] assert [int, float, str] == [f.type for f in fields_.values()]
def test_optional_field_can_be_set(): # fields passed in constructor builder = DataclassBuilder(Point, x=3.0, y=7.0, w=0.3) assert Point(3.0, 7.0, 0.3) == build(builder) # fields set by assignment builder = DataclassBuilder(Point) builder.x = 9.0 builder.y = 1.0 builder.w = 1.7 assert Point(9.0, 1.0, 1.7) == build(builder)
def test_order_invariant(): # fields passed in constructor builder = DataclassBuilder(PixelCoord, y=7, x=3) assert PixelCoord(3, 7) == build(builder) # fields set by assignment builder = DataclassBuilder(PixelCoord) builder.y = 1 builder.x = 9 assert PixelCoord(9, 1) == build(builder)
def test_all_fields_set(): # fields passed in constructor builder = DataclassBuilder(PixelCoord, x=3, y=7) assert PixelCoord(3, 7) == build(builder) # fields set by assignment builder = DataclassBuilder(PixelCoord) builder.x = 9 builder.y = 1 assert PixelCoord(9, 1) == build(builder)
def test_optional_field_not_required(): # fields passed in constructor builder = DataclassBuilder(Point, x=3.0, y=7.0) assert Point(3.0, 7.0, 1.0) == build(builder) # fields set by assignment builder = DataclassBuilder(Point) builder.x = 9.0 builder.y = 1.0 assert Point(9.0, 1.0, 1.0) == build(builder)
def test_must_be_dataclass(): with pytest.raises(TypeError): DataclassBuilder(NotADataclass)
def test_handles_dataclass_without_fields(): builder = DataclassBuilder(NoFields) assert NoFields() == build(builder) builder = DataclassBuilder(NoInitFields) assert NoInitFields() == build(builder)
def test_no_positional_arguments(): with pytest.raises(TypeError): DataclassBuilder(PixelCoord, 3, 5) # type: ignore with pytest.raises(TypeError): DataclassBuilder(NoFields, 3) # type: ignore
def test_typing_module(): builder = DataclassBuilder(Typing) builder.sequence = [1, 2, 3] builder.mapping = {"one": 1.0, "two": 2.0, "pi": 3.14}
def test_access_invalid_field(): builder = DataclassBuilder(Point) with pytest.raises(AttributeError): print(builder.i)
def test_access_unset_field(): builder = DataclassBuilder(Point) assert builder.x == REQUIRED assert builder.y == REQUIRED assert builder.w == OPTIONAL