import importlib.util import pathlib import unittest ROOT = pathlib.Path(__file__).resolve().parents[1] spec = importlib.util.spec_from_file_location( "rna_extraction", ROOT / "blender-5.2.0/source/blender/web_engine/extract_id_property_rna.py") module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) class RNAExtractionTests(unittest.TestCase): def test_braces_in_strings_and_comments_are_not_structure(self): source = 'value = {"}", /* { */ {1, 2}}; trailing' self.assertEqual('value = {"}", /* { */ {1, 2}};', module.initializer(source, 0)) def test_missing_terminator_is_rejected(self): with self.assertRaises(ValueError): module.initializer("value = {1} trailing", 0) def test_unterminated_initializer_is_rejected(self): with self.assertRaises(ValueError): module.initializer('value = {"}"', 0) def sources(self): generated = ROOT / "build_web_blender6/source/blender/makesrna/intern/rna_ID_gen.cc" if not generated.exists(): self.skipTest("makesrna output has not been built locally") native = ROOT / "blender-5.2.0/source/blender/makesrna/intern/rna_ID.cc" return generated.read_text(), native.read_text() def test_extraction_reuses_all_original_descriptors_and_callbacks(self): generated, native = self.sources() output = module.extract(generated, native) self.assertEqual(output, module.extract(generated, native)) self.assertEqual(16, output.count(" = reinterpret_cast")) self.assertIn(module.function(native, "rna_IDPArray_begin")[1], output) self.assertIn(module.function(generated, "PropertyGroupItem_rna_type_get")[1], output) self.assertNotIn("ID_code_to_RNA_type", output) self.assertNotIn("RNA_blender_rna_get", output) def test_changed_generator_schema_fails_closed(self): generated, native = self.sources() with self.assertRaisesRegex(ValueError, "Missing makesrna descriptor"): module.extract(generated.replace("rna_PropertyGroupItem_int_", "renamed_descriptor"), native) if __name__ == "__main__": unittest.main()