import json import tempfile import unittest from pathlib import Path import reflection_config_generator as rgen class ReflectionConfigGeneratorTests(unittest.TestCase): def test_parse_package_filters_deduplicates_and_normalizes(self) -> None: filters = rgen.parse_package_filters( ["com.acme.*, org.foo", "com.acme", " org.foo.bar "] ) self.assertEqual(filters, ["com.acme", "org.foo", "org.foo.bar"]) def test_extract_top_level_types_ignores_nested_types(self) -> None: source = """ package com.acme; public class Outer { class Inner {} } record Value(String v) {} enum Mode { A, B } """ cleaned = rgen.strip_comments_and_literals(source) self.assertEqual( rgen.extract_top_level_types(cleaned), ["Outer", "Value", "Mode"], ) def test_main_generates_reflection_config_for_filtered_packages(self) -> None: with tempfile.TemporaryDirectory() as tmp: root = Path(tmp) (root / "src/com/acme").mkdir(parents=True) (root / "src/com/acme/sub").mkdir(parents=True) (root / "src/org/other").mkdir(parents=True) (root / "src/com/acme/A.java").write_text( "package com.acme; public class A {}", encoding="utf-8", ) (root / "src/com/acme/sub/B.java").write_text( "package com.acme.sub; public record B(String name) {}", encoding="utf-8", ) (root / "src/org/other/C.java").write_text( "package org.other; public class C {}", encoding="utf-8", ) out_file = root / "reflection-config.json" exit_code = rgen.main( [ "--source-root", str(root / "src"), "--package", "com.acme", "--output", str(out_file), ] ) self.assertEqual(exit_code, 0) content = json.loads(out_file.read_text(encoding="utf-8")) self.assertEqual( [entry["name"] for entry in content], ["com.acme.A", "com.acme.sub.B"], ) self.assertTrue(content[0]["allDeclaredMethods"]) self.assertTrue(content[0]["allDeclaredConstructors"]) self.assertTrue(content[0]["allDeclaredFields"]) self.assertNotIn("allPublicMethods", content[0]) if __name__ == "__main__": unittest.main()