|
| 1 | +import os |
| 2 | +import tempfile |
| 3 | +import unittest |
| 4 | + |
| 5 | +from repokg.code import walk |
| 6 | +from repokg.deps import _jvm_modules, _jvm_package_index |
| 7 | + |
| 8 | + |
| 9 | +def write(root, rel, text): |
| 10 | + path = os.path.join(root, rel) |
| 11 | + os.makedirs(os.path.dirname(path), exist_ok=True) |
| 12 | + with open(path, "w", encoding="utf-8") as f: |
| 13 | + f.write(text) |
| 14 | + |
| 15 | + |
| 16 | +class TestJVMDiscovery(unittest.TestCase): |
| 17 | + def setUp(self): |
| 18 | + self.tmp = tempfile.TemporaryDirectory() |
| 19 | + self.repo = self.tmp.name |
| 20 | + |
| 21 | + def tearDown(self): |
| 22 | + self.tmp.cleanup() |
| 23 | + |
| 24 | + def tree(self): |
| 25 | + return dict(walk(self.repo)) |
| 26 | + |
| 27 | + def test_maven_and_gradle_modules(self): |
| 28 | + write(self.repo, "pom.xml", "<project/>") |
| 29 | + write(self.repo, "core/pom.xml", "<project/>") |
| 30 | + write(self.repo, "api/build.gradle", "") |
| 31 | + write(self.repo, "app/build.gradle.kts", "") |
| 32 | + write(self.repo, "docs/readme.txt", "") |
| 33 | + self.assertEqual(_jvm_modules(self.tree()), ["", "api", "app", "core"]) |
| 34 | + |
| 35 | + def test_package_index_java_and_kotlin(self): |
| 36 | + write(self.repo, "core/src/main/java/com/acme/core/Engine.java", |
| 37 | + "// (c) acme\npackage com.acme.core;\n\npublic class Engine {}\n") |
| 38 | + write(self.repo, "core/src/main/java/com/acme/core/util/Str.java", |
| 39 | + "package com.acme.core.util;\nclass Str {}\n") |
| 40 | + # Kotlin: no semicolon, collapsed dir convention (dir != package path) |
| 41 | + write(self.repo, "api/src/main/kotlin/Handlers.kt", |
| 42 | + "package com.acme.api\n\nfun handle() {}\n") |
| 43 | + idx = _jvm_package_index(self.repo, self.tree()) |
| 44 | + self.assertEqual(idx["com.acme.core"], |
| 45 | + {"core/src/main/java/com/acme/core"}) |
| 46 | + self.assertEqual(idx["com.acme.core.util"], |
| 47 | + {"core/src/main/java/com/acme/core/util"}) |
| 48 | + self.assertEqual(idx["com.acme.api"], {"api/src/main/kotlin"}) |
| 49 | + |
| 50 | + def test_javadoc_and_comments_not_mistaken_for_declarations(self): |
| 51 | + write(self.repo, "src/A.java", |
| 52 | + "/**\n * package fake.name\n */\npackage real.pkg;\nclass A {}\n") |
| 53 | + write(self.repo, "src/B.java", "// package another.fake\nclass B {}\n") |
| 54 | + idx = _jvm_package_index(self.repo, self.tree()) |
| 55 | + self.assertEqual(set(idx), {"real.pkg"}) |
| 56 | + |
| 57 | + def test_default_package_files_ignored(self): |
| 58 | + write(self.repo, "src/Main.java", "public class Main {}\n") |
| 59 | + self.assertEqual(_jvm_package_index(self.repo, self.tree()), {}) |
| 60 | + |
| 61 | + |
| 62 | +if __name__ == "__main__": |
| 63 | + unittest.main() |
0 commit comments