import pathlib import sys import unittest ROOT = pathlib.Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT / "blender-5.2.0/source/blender/web_engine")) import extract_modifier_accessors as extractor from extract_id_property_rna import function class ModifierAccessorTests(unittest.TestCase): def source(self): source = ROOT / "build_web_blender6/source/blender/makesrna/intern/rna_modifier_gen.cc" if not source.exists(): self.skipTest("makesrna output has not been built") return source.read_text() def test_each_field_uses_original_generated_accessors(self): source = self.source() output = extractor.generate(source) for modifier, fields in extractor.FIELDS.items(): for name, _, _, _ in fields: for operation in ("get", "set"): self.assertIn(function(source, f"{modifier}Modifier_{name}_{operation}")[1], output) self.assertEqual(output, extractor.generate(source)) def test_missing_source_accessor_rejects_generation(self): source = self.source().replace("BevelModifier_segments_set", "Removed_segments_set") with self.assertRaisesRegex(ValueError, "Missing generated function"): extractor.generate(source) def test_schema_field_names_are_unique_and_numeric_bounds_are_valid(self): for fields in extractor.FIELDS.values(): self.assertEqual(len(fields), len({field[0] for field in fields})) for _, kind, lower, upper in fields: if kind.startswith("bool"): self.assertIsNone(lower) self.assertIsNone(upper) else: self.assertLess(lower, upper) if __name__ == "__main__": unittest.main()