|
|
|
|
|
|
|
|
|
|
|
|
|
import importlib |
|
import json |
|
import os |
|
import sys |
|
import unittest |
|
import unittest.mock |
|
from collections import Counter |
|
|
|
from .common_testing import get_pytorch3d_dir |
|
|
|
|
|
|
|
in_conda_build = os.environ.get("CONDA_BUILD_STATE", "") == "TEST" |
|
in_re_worker = os.environ.get("INSIDE_RE_WORKER") is not None |
|
|
|
|
|
class TestBuild(unittest.TestCase): |
|
def test_name_clash(self): |
|
|
|
|
|
source_dir = get_pytorch3d_dir() / "pytorch3d" |
|
|
|
stems = [] |
|
for extension in [".cu", ".cpp"]: |
|
files = source_dir.glob(f"**/*{extension}") |
|
stems.extend(f.stem for f in files) |
|
|
|
counter = Counter(stems) |
|
for k, v in counter.items(): |
|
self.assertEqual(v, 1, f"Too many files with stem {k}.") |
|
|
|
@unittest.skipIf(in_re_worker, "In RE worker") |
|
def test_valid_ipynbs(self): |
|
|
|
root_dir = get_pytorch3d_dir() |
|
tutorials_dir = root_dir / "docs" / "tutorials" |
|
tutorials = sorted(tutorials_dir.glob("*.ipynb")) |
|
|
|
for tutorial in tutorials: |
|
with open(tutorial) as f: |
|
json.load(f) |
|
|
|
@unittest.skipIf(in_conda_build or in_re_worker, "In conda build, or RE worker") |
|
def test_enumerated_ipynbs(self): |
|
|
|
root_dir = get_pytorch3d_dir() |
|
tutorials_dir = root_dir / "docs" / "tutorials" |
|
tutorials_on_disk = sorted(i.stem for i in tutorials_dir.glob("*.ipynb")) |
|
|
|
json_file = root_dir / "website" / "tutorials.json" |
|
with open(json_file) as f: |
|
cfg_dict = json.load(f) |
|
listed_in_json = [] |
|
for section in cfg_dict.values(): |
|
listed_in_json.extend(item["id"] for item in section) |
|
|
|
self.assertListEqual(sorted(listed_in_json), tutorials_on_disk) |
|
|
|
@unittest.skipIf(in_conda_build or in_re_worker, "In conda build, or RE worker") |
|
def test_enumerated_notes(self): |
|
|
|
root_dir = get_pytorch3d_dir() |
|
notes_dir = root_dir / "docs" / "notes" |
|
notes_on_disk = sorted(i.stem for i in notes_dir.glob("*.md")) |
|
|
|
json_file = root_dir / "website" / "sidebars.json" |
|
with open(json_file) as f: |
|
cfg_dict = json.load(f) |
|
listed_in_json = [] |
|
for section in cfg_dict["docs"].values(): |
|
listed_in_json.extend(section) |
|
|
|
self.assertListEqual(sorted(listed_in_json), notes_on_disk) |
|
|
|
def test_no_import_cycles(self): |
|
|
|
|
|
|
|
with unittest.mock.patch.dict(sys.modules): |
|
for module in list(sys.modules): |
|
|
|
|
|
if module.startswith("pytorch3d"): |
|
sys.modules.pop(module, None) |
|
|
|
root_dir = get_pytorch3d_dir() / "pytorch3d" |
|
for module_file in root_dir.glob("**/*.py"): |
|
if module_file.stem in ("__init__", "plotly_vis"): |
|
continue |
|
if "implicitron" in str(module_file): |
|
continue |
|
relative_module = str(module_file.relative_to(root_dir))[:-3] |
|
module = "pytorch3d." + relative_module.replace("/", ".") |
|
with self.subTest(name=module): |
|
with unittest.mock.patch.dict(sys.modules): |
|
importlib.import_module(module) |
|
|