import unittest
from tests import test_bootstrap # noqa: F401
from blender_mcp.dsl import DslValidationError, validate_ops_request
class TestDslValidation(unittest.TestCase):
def test_minimal_request(self):
req = {
"dsl_version": "1",
"ops": [{"type": "deselect_all"}],
}
out = validate_ops_request(req)
self.assertEqual(out["dsl_version"], "1")
self.assertEqual(out["transaction"], "atomic")
self.assertEqual(out["dry_run"], False)
self.assertEqual(out["ops"][0]["type"], "deselect_all")
def test_reject_wrong_version(self):
with self.assertRaises(DslValidationError):
validate_ops_request({"dsl_version": "2", "ops": [{"type": "deselect_all"}]})
def test_reject_empty_ops(self):
with self.assertRaises(DslValidationError):
validate_ops_request({"dsl_version": "1", "ops": []})
def test_reject_unknown_op(self):
with self.assertRaises(DslValidationError):
validate_ops_request({"dsl_version": "1", "ops": [{"type": "do_the_thing"}]})
def test_create_primitive_normalization(self):
out = validate_ops_request(
{
"dsl_version": "1",
"transaction": "none",
"dry_run": True,
"ops": [{"type": "create_primitive", "primitive": "cube", "size": 2}],
}
)
op = out["ops"][0]
self.assertEqual(op["primitive"], "cube")
self.assertEqual(op["size"], 2.0)
def test_set_material_params_ranges(self):
with self.assertRaises(DslValidationError):
validate_ops_request(
{
"dsl_version": "1",
"ops": [{"type": "set_material_params", "material": "M", "params": {"roughness": 2}}],
}
)
def test_set_texture_maps_requires_at_least_one(self):
with self.assertRaises(DslValidationError):
validate_ops_request(
{
"dsl_version": "1",
"ops": [{"type": "set_texture_maps", "material": "M", "maps": {}}],
}
)
def test_set_visibility_requires_one_field(self):
with self.assertRaises(DslValidationError):
validate_ops_request({"dsl_version": "1", "ops": [{"type": "set_visibility", "names": ["Cube"]}]})
def test_set_shading_normalization(self):
out = validate_ops_request(
{"dsl_version": "1", "ops": [{"type": "set_shading", "names": ["Cube"], "shade": "smooth", "auto_smooth_angle": 30}]}
)
op = out["ops"][0]
self.assertEqual(op["type"], "set_shading")
self.assertEqual(op["shade"], "smooth")
self.assertEqual(op["auto_smooth_angle"], 30.0)
def test_boolean_operation_requires_target_and_cutter(self):
with self.assertRaises(DslValidationError):
validate_ops_request({"dsl_version": "1", "ops": [{"type": "boolean_operation", "target": "A"}]})
if __name__ == "__main__":
unittest.main()