+8
-20
@@ -23,10 +23,8 @@ class modulus_export_test(unittest.TestCase):
|
||||
"name": "sample",
|
||||
},
|
||||
}
|
||||
|
||||
def write_config(self, root, config):
|
||||
(root / "modulus.json").write_text(json.dumps(config), encoding="utf-8")
|
||||
|
||||
def write_package(self, package):
|
||||
for directory in (
|
||||
"modulus",
|
||||
@@ -43,16 +41,19 @@ class modulus_export_test(unittest.TestCase):
|
||||
(package / "modulus" / "cli.py").write_text("", encoding="utf-8")
|
||||
(package / "modulus" / "config.py").write_text("", encoding="utf-8")
|
||||
(package / "modulus" / "export.py").write_text("", encoding="utf-8")
|
||||
(package / "modulus" / "formatting.py").write_text("", encoding="utf-8")
|
||||
(package / "modulus" / "format_layout.py").write_text("", encoding="utf-8")
|
||||
(package / "tools" / "configure.py").write_text("#!/usr/bin/env python3\n", encoding="utf-8")
|
||||
(package / "tools" / "lsp.py").write_text("#!/usr/bin/env python3\n", encoding="utf-8")
|
||||
(package / "tools" / "run.py").write_text("#!/usr/bin/env python3\n", encoding="utf-8")
|
||||
(package / "tools" / "format.py").write_text("#!/usr/bin/env python3\n", encoding="utf-8")
|
||||
(package / "tools" / "docker" / "format-requirements.txt").write_text("autopep8==2.3.2\n", encoding="utf-8")
|
||||
(package / "tools" / "docker" / "Dockerfile").write_text("FROM scratch\n", encoding="utf-8")
|
||||
(package / "include" / "modulus" / "types.hpp").write_text("", encoding="utf-8")
|
||||
(package / "tests" / "test.cpp").write_text("", encoding="utf-8")
|
||||
(package / "lib" / "cmake" / "modulus" / "modulus-config.cmake").write_text("", encoding="utf-8")
|
||||
(package / "share" / "modulus" / "duplicate.py").write_text("", encoding="utf-8")
|
||||
(package / "bin" / "modulus-tool").write_text("", encoding="utf-8")
|
||||
|
||||
def test_boost_requirement_options_enable_configured_components(self):
|
||||
config = modulus.config.normalize(self.config())
|
||||
boost_options = modulus.config.boost_requirement_options(config)
|
||||
@@ -61,7 +62,6 @@ class modulus_export_test(unittest.TestCase):
|
||||
self.assertIs(boost_options["without_container"], False)
|
||||
self.assertIs(boost_options["without_charconv"], False)
|
||||
self.assertIs(boost_options["without_atomic"], True)
|
||||
|
||||
def test_default_targets_include_architecture_and_build_type_matrix(self):
|
||||
config = modulus.config.normalize(self.config())
|
||||
targets = config["tooling"]["targets"]
|
||||
@@ -82,7 +82,6 @@ class modulus_export_test(unittest.TestCase):
|
||||
self.assertFalse(config["tooling"]["run"]["enabled"])
|
||||
self.assertFalse(config["tooling"]["lsp"]["enabled"])
|
||||
self.assertEqual(config["tooling"]["lsp"]["compile_databases"], [])
|
||||
|
||||
def test_product_artifact_and_run_config_are_validated(self):
|
||||
config = self.config()
|
||||
config["package"]["artifact"] = {
|
||||
@@ -111,11 +110,9 @@ class modulus_export_test(unittest.TestCase):
|
||||
self.assertEqual(normalized["package"]["artifact"]["install_prefix"], "usr")
|
||||
self.assertEqual(normalized["package"]["artifact"]["registry_url"], "https://git.thyme-labs.com/api/packages/khodo/generic")
|
||||
self.assertEqual(normalized["tooling"]["run"]["args"], [])
|
||||
|
||||
config["package"]["artifact"]["targets"] = ["missing"]
|
||||
with self.assertRaisesRegex(modulus.config.config_error, "unknown target"):
|
||||
modulus.config.normalize(config)
|
||||
|
||||
def test_target_cmake_definitions_are_validated_and_defaulted(self):
|
||||
config = self.config()
|
||||
config["tooling"] = {
|
||||
@@ -148,7 +145,6 @@ class modulus_export_test(unittest.TestCase):
|
||||
},
|
||||
)
|
||||
self.assertEqual(normalized["tooling"]["targets"]["release"]["cmake_definitions"], {})
|
||||
|
||||
config["tooling"]["targets"]["native"]["cmake_definitions"] = {
|
||||
"SAMPLE_BAD": [
|
||||
"invalid",
|
||||
@@ -156,7 +152,6 @@ class modulus_export_test(unittest.TestCase):
|
||||
}
|
||||
with self.assertRaisesRegex(modulus.config.config_error, "tooling.targets.native.cmake_definitions"):
|
||||
modulus.config.normalize(config)
|
||||
|
||||
def test_lsp_compile_databases_are_validated_and_defaulted(self):
|
||||
config = self.config()
|
||||
config["tooling"] = {
|
||||
@@ -183,11 +178,9 @@ class modulus_export_test(unittest.TestCase):
|
||||
self.assertEqual(database["generator"], "Ninja")
|
||||
self.assertEqual(database["env"], {})
|
||||
self.assertEqual(database["unset_env"], ["CC", "CXX"])
|
||||
|
||||
config["tooling"]["lsp"]["compile_databases"][0]["unset_env"] = ["bad-name"]
|
||||
with self.assertRaisesRegex(modulus.config.config_error, "tooling.lsp.compile_databases\\[0\\].unset_env"):
|
||||
modulus.config.normalize(config)
|
||||
|
||||
def test_checked_in_profile_overrides_exported_default_profile(self):
|
||||
with tempfile.TemporaryDirectory() as repo_dir:
|
||||
repo = pathlib.Path(repo_dir)
|
||||
@@ -197,14 +190,12 @@ class modulus_export_test(unittest.TestCase):
|
||||
profile.write_text("[settings]\n", encoding="utf-8")
|
||||
config = modulus.config.load_repo_config(repo)
|
||||
self.assertEqual(config["tooling"]["targets"]["x86_64_gcc12_release"]["profile"], "conan/profiles/x86_64_gcc12_release")
|
||||
|
||||
def test_docker_defaults_use_shared_modulus_marker(self):
|
||||
config = modulus.config.normalize(self.config())
|
||||
self.assertEqual(config["tooling"]["docker"]["image"], "modulus-build:dev")
|
||||
self.assertEqual(config["tooling"]["docker"]["marker"], "/opt/modulus-build-image")
|
||||
self.assertNotIn("apt_architectures", config["tooling"]["docker"])
|
||||
self.assertNotIn("apt_packages", config["tooling"]["docker"])
|
||||
|
||||
def test_export_project_copies_runtime_and_exported_tools(self):
|
||||
with tempfile.TemporaryDirectory() as repo_dir, tempfile.TemporaryDirectory() as package_dir:
|
||||
repo = pathlib.Path(repo_dir)
|
||||
@@ -226,6 +217,10 @@ class modulus_export_test(unittest.TestCase):
|
||||
self.assertTrue((runtime / "modulus" / "cli.py").is_file())
|
||||
self.assertTrue((runtime / "modulus" / "config.py").is_file())
|
||||
self.assertTrue((runtime / "modulus" / "export.py").is_file())
|
||||
self.assertTrue((runtime / "modulus" / "formatting.py").is_file())
|
||||
self.assertTrue((runtime / "modulus" / "format_layout.py").is_file())
|
||||
self.assertTrue((repo / "build/build_tools/format.py").is_file())
|
||||
self.assertTrue((repo / "build/build_tools/docker/format-requirements.txt").is_file())
|
||||
self.assertFalse((runtime / "CMakeLists.txt").exists())
|
||||
self.assertFalse((runtime / "README.md").exists())
|
||||
self.assertFalse((runtime / "conanfile.py").exists())
|
||||
@@ -239,7 +234,6 @@ class modulus_export_test(unittest.TestCase):
|
||||
self.assertFalse((runtime / "lib").exists())
|
||||
self.assertFalse((runtime / "share").exists())
|
||||
self.assertFalse((runtime / "bin").exists())
|
||||
|
||||
def test_editor_defaults_use_configured_target(self):
|
||||
config = modulus.config.normalize(self.config())
|
||||
config["tooling"].pop("editor")
|
||||
@@ -250,7 +244,6 @@ class modulus_export_test(unittest.TestCase):
|
||||
self.assertEqual(editor["clangd"][0]["Diagnostics"]["ClangTidy"]["Remove"], ["*"])
|
||||
self.assertIn("conanfile.py", editor["pyright"]["include"])
|
||||
self.assertNotIn("package/conanfile.py", editor["pyright"]["include"])
|
||||
|
||||
def test_editor_replacements_and_refresh_are_idempotent(self):
|
||||
config = self.config()
|
||||
editor = {
|
||||
@@ -277,7 +270,6 @@ class modulus_export_test(unittest.TestCase):
|
||||
before = {path.name: path.stat().st_mtime_ns for path in root.iterdir()}
|
||||
modulus.export.sync_editor_files(root, normalized)
|
||||
self.assertEqual(before, {path.name: path.stat().st_mtime_ns for path in root.iterdir()})
|
||||
|
||||
def test_editor_config_rejects_invalid_shapes(self):
|
||||
for editor in (None, [], {"unknown": {}}, {"clangd": {}}, {"clangd": []}, {"clangd": ["bad"]}, {"pyright": []}, {"clang_format": None}, {"pyright": {"value": float("nan")}}):
|
||||
with self.subTest(editor=editor):
|
||||
@@ -285,7 +277,6 @@ class modulus_export_test(unittest.TestCase):
|
||||
config["tooling"] = {"editor": editor}
|
||||
with self.assertRaises(modulus.config.config_error):
|
||||
modulus.config.normalize(config)
|
||||
|
||||
def test_export_requires_packaged_tools(self):
|
||||
with tempfile.TemporaryDirectory() as repo_dir, tempfile.TemporaryDirectory() as package_dir:
|
||||
repo = pathlib.Path(repo_dir)
|
||||
@@ -295,7 +286,6 @@ class modulus_export_test(unittest.TestCase):
|
||||
(package / "modulus" / "cli.py").write_text("", encoding="utf-8")
|
||||
with self.assertRaisesRegex(RuntimeError, "missing tools directory"):
|
||||
modulus.export.sync_project(repo, package)
|
||||
|
||||
def test_normalize_rejects_invalid_cmake_values(self):
|
||||
config = self.config()
|
||||
config["package"]["name"] = "BadName"
|
||||
@@ -305,13 +295,11 @@ class modulus_export_test(unittest.TestCase):
|
||||
config["docs"] = {}
|
||||
with self.assertRaisesRegex(modulus.config.config_error, "unknown keys: docs"):
|
||||
modulus.config.normalize(config)
|
||||
|
||||
def test_unknown_top_level_config_keys_are_rejected(self):
|
||||
config = self.config()
|
||||
config["old_config"] = {}
|
||||
with self.assertRaisesRegex(modulus.config.config_error, "unknown keys: old_config"):
|
||||
modulus.config.normalize(config)
|
||||
|
||||
def test_removed_setup_generation_fields_are_rejected(self):
|
||||
config = self.config()
|
||||
config["schema_version"] = 1
|
||||
|
||||
Reference in New Issue
Block a user