79 lines
2.7 KiB
Python
79 lines
2.7 KiB
Python
import os
|
|
import unittest
|
|
from concurrent.futures import ThreadPoolExecutor
|
|
|
|
from ci.paths import PROJECT_ROOT
|
|
|
|
NUM_WORKERS = (os.cpu_count() or 1) * 4
|
|
|
|
|
|
WASM_ROOT = PROJECT_ROOT / "src" / "platforms" / "wasm"
|
|
|
|
|
|
class TestMissingPragmaOnce(unittest.TestCase):
|
|
|
|
def check_file(self, file_path: str) -> list[str]:
|
|
"""Check if a header file has #pragma once directive or if a cpp file incorrectly has it."""
|
|
failings: list[str] = []
|
|
|
|
with open(file_path, "r", encoding="utf-8", errors="ignore") as f:
|
|
if file_path.endswith(".h") or file_path.endswith(".cpp"):
|
|
content = f.read()
|
|
# For header files, check if #pragma once is missing
|
|
if "EM_ASM_" in content and "// clang-format off\n" not in content:
|
|
if "clang-format off" not in content:
|
|
failings.append(f"Missing clang-format off in {file_path}")
|
|
else:
|
|
failings.append(f"clang-format off is malformed in {file_path}")
|
|
|
|
return failings
|
|
|
|
def test_esm_asm_and_clang_format(self) -> None:
|
|
files_to_check = []
|
|
current_dir = None
|
|
|
|
# Collect files to check
|
|
for root, _, files in os.walk(WASM_ROOT):
|
|
# Log when we enter a new directory
|
|
rel_path = os.path.relpath(root, WASM_ROOT)
|
|
if current_dir != rel_path:
|
|
current_dir = rel_path
|
|
print(f"Traversing directory: {rel_path}")
|
|
|
|
for file in files:
|
|
if file.endswith((".h", ".cpp")): # Check both header and cpp files
|
|
file_path = os.path.join(root, file)
|
|
files_to_check.append(file_path)
|
|
|
|
print(f"Found {len(files_to_check)} files to check")
|
|
|
|
# Process files in parallel
|
|
all_failings = []
|
|
with ThreadPoolExecutor(max_workers=NUM_WORKERS) as executor:
|
|
futures = [
|
|
executor.submit(self.check_file, file_path)
|
|
for file_path in files_to_check
|
|
]
|
|
for future in futures:
|
|
all_failings.extend(future.result())
|
|
|
|
# Report results
|
|
if all_failings:
|
|
msg = (
|
|
f"Found {len(all_failings)} clang format issues in wasm: \n"
|
|
+ "\n".join(all_failings)
|
|
)
|
|
for failing in all_failings:
|
|
print(failing)
|
|
print(
|
|
"Please be aware you need // then one space then clang-format off then a new line exactly"
|
|
)
|
|
self.fail(msg)
|
|
else:
|
|
print("All files passed the check.")
|
|
|
|
print(f"Clange format check completed. Processed {len(files_to_check)} files.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|