Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(tests): move sionna download to fixture #114

Merged
merged 4 commits into from
Sep 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ To run build this package locally, you need:

- [Python 3.9](https://www.python.org/) or above;
- [Rust](https://www.rust-lang.org/) stable toolchain;
- any modern C compiler;
- [just](https://github.com/casey/just) to easily run commands listed in `justfile`s;
- [Maturin](https://www.maturin.rs/) for building Python bindings from Rust code;
- and [uv](https://docs.astral.sh/uv/) to manage this project.
Expand Down
3 changes: 3 additions & 0 deletions differt/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ vispy = [
]
vispy-backend = ["PyQt6>=6.6.1"]

[project.scripts]
"download-sionna-scenes" = "differt.scene.sionna:download_sionna_scenes"

[project.urls]
Changelog = "https://github.com/jeertmans/DiffeRT/releases"
Documentation = "https://eertmans.be/DiffeRT"
Expand Down
6 changes: 0 additions & 6 deletions differt/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
import pytest
from jaxtyping import PRNGKeyArray

from differt.scene.sionna import download_sionna_scenes


@pytest.fixture
def seed() -> int:
Expand All @@ -23,10 +21,6 @@ def rng(seed: int) -> np.random.Generator:
return np.random.default_rng(seed=seed)


def pytest_sessionstart(session: pytest.Session) -> None: # noqa: ARG001
download_sionna_scenes(timeout=600)


@pytest.fixture(scope="session")
def test_dir() -> Path:
return Path(__file__).parent
Expand Down
11 changes: 11 additions & 0 deletions differt/tests/scene/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from pathlib import Path

import pytest

from differt.scene.sionna import SIONNA_SCENES_FOLDER, download_sionna_scenes


@pytest.fixture(scope="session")
def sionna_folder() -> Path:
download_sionna_scenes(folder=SIONNA_SCENES_FOLDER)
return SIONNA_SCENES_FOLDER
46 changes: 24 additions & 22 deletions differt/tests/scene/test_sionna.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from functools import partial
from pathlib import Path
from timeit import timeit

import pytest

from differt.scene.sionna import (
SIONNA_SCENES_FOLDER,
download_sionna_scenes,
get_sionna_scene,
list_sionna_scenes,
Expand All @@ -15,51 +15,53 @@
download_sionna_scenes = partial(download_sionna_scenes, timeout=600)


@pytest.fixture
def folder() -> Path:
return SIONNA_SCENES_FOLDER


@pytest.fixture
def empty_folder(tmp_path_factory: pytest.TempPathFactory) -> Path:
return tmp_path_factory.mktemp("scenes")


def test_download_sionna_scenes(folder: Path) -> None:
download_sionna_scenes(folder=folder)
download_sionna_scenes(folder=str(folder))
def test_download_sionna_scenes_cached(sionna_folder: Path) -> None:
# Downloading should be pretty fast, because we use cached folder
assert timeit(lambda: download_sionna_scenes(folder=sionna_folder), number=1) < 1
assert (
timeit(lambda: download_sionna_scenes(folder=str(sionna_folder)), number=1) < 1
)


def test_download_sionna_scenes_existing_empty_folder(empty_folder: Path) -> None:
download_sionna_scenes(folder=empty_folder, cached=False)


def test_download_sionna_scenes_existing_non_empty_folder(folder: Path) -> None:
def test_download_sionna_scenes_existing_non_empty_folder(sionna_folder: Path) -> None:
with pytest.raises(OSError, match="[Dd]irectory (is )?not empty"):
download_sionna_scenes(folder=folder, cached=False)
download_sionna_scenes(folder=sionna_folder, cached=False)


def test_list_sionna_scenes(sionna_folder: Path) -> None:
l_a = list_sionna_scenes(folder=sionna_folder)
assert len(l_a) > 0
l_b = list_sionna_scenes(folder=str(sionna_folder))

def test_list_sionna_scenes(folder: Path) -> None:
list_sionna_scenes(folder=folder)
list_sionna_scenes(folder=str(folder))
for s_a, s_b in zip(l_a, l_b):
assert s_a == s_b


@pytest.mark.parametrize("scene_name", ["foo", "bar"])
def test_get_unexisting_sionna_scene(scene_name: str, folder: Path) -> None:
def test_get_unexisting_sionna_scene(scene_name: str, sionna_folder: Path) -> None:
with pytest.raises(ValueError, match="Cannot find scene_name"):
_ = get_sionna_scene(scene_name, folder=folder)
_ = get_sionna_scene(scene_name, folder=sionna_folder)


@pytest.mark.parametrize("scene_name", ["box", "etoile", "munich"])
def test_get_existing_sionna_scene(scene_name: str, folder: Path) -> None:
assert Path(get_sionna_scene(scene_name, folder=folder)).exists()
assert Path(get_sionna_scene(scene_name, folder=str(folder))).exists()
def test_get_existing_sionna_scene(scene_name: str, sionna_folder: Path) -> None:
assert Path(get_sionna_scene(scene_name, folder=sionna_folder)).exists()
assert Path(get_sionna_scene(scene_name, folder=str(sionna_folder))).exists()


class TestSionnaScene:
def test_load_xml(self, folder: Path) -> None:
for scene_name in list_sionna_scenes(folder=folder):
file = get_sionna_scene(scene_name, folder=folder)
def test_load_xml(self, sionna_folder: Path) -> None:
for scene_name in list_sionna_scenes(folder=sionna_folder):
file = get_sionna_scene(scene_name, folder=sionna_folder)
scene = SionnaScene.load_xml(file)

assert len(scene.shapes) > 0
Expand Down
29 changes: 15 additions & 14 deletions differt/tests/scene/test_triangle_scene.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,31 @@
from pathlib import Path

import equinox as eqx
import jax.numpy as jnp
import pytest

from differt.scene.sionna import (
download_sionna_scenes,
get_sionna_scene,
list_sionna_scenes,
)
from differt.scene.triangle_scene import TriangleScene
from differt_core.scene.sionna import SionnaScene

download_sionna_scenes()


class TestTriangleScene:
@pytest.mark.parametrize("scene_name", list_sionna_scenes())
def test_load_xml(self, scene_name: str) -> None:
def test_load_xml(self, sionna_folder: Path) -> None:
# Sionne scenes are all triangle scenes.
file = get_sionna_scene(scene_name)
scene = TriangleScene.load_xml(file)
sionna_scene = SionnaScene.load_xml(file)

assert len(scene.meshes) == len(sionna_scene.shapes)

def test_plot(self) -> None:
file = get_sionna_scene("simple_street_canyon")
for scene_name in list_sionna_scenes(folder=sionna_folder):
file = get_sionna_scene(scene_name, folder=sionna_folder)
scene = TriangleScene.load_xml(file)
sionna_scene = SionnaScene.load_xml(file)

assert len(scene.meshes) == len(sionna_scene.shapes)

def test_plot(
self,
sionna_folder: Path,
) -> None:
file = get_sionna_scene("simple_street_canyon", folder=sionna_folder)
scene = TriangleScene.load_xml(file)

tx = jnp.array([[0.0, 0.0, 0.0]])
Expand Down
3 changes: 3 additions & 0 deletions docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,9 @@
]

nb_execution_mode = "off" if os.environ.get("NB_OFF") else "auto"
nb_execution_timeout = (
600 # So cells can take a long time, especially when downloading sionna scenes
)
nb_merge_streams = True

# By default, MyST-nb chooses the Widget output instead of the 2D snapshot
Expand Down
Loading