67 lines
2.3 KiB
Python
67 lines
2.3 KiB
Python
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
SCRIPTS = Path(__file__).parents[1]
|
|
sys.path.insert(0, str(SCRIPTS))
|
|
import run # noqa: E402
|
|
|
|
|
|
def cube_step(path: Path, x: float) -> Path:
|
|
run.execute([
|
|
{"command": "solid.box", "params": {"length": 10, "width": 10, "height": 10, "body_name": "Cube"}},
|
|
{"command": "solid.move", "params": {"bodies": ["Cube"], "translate": [x, 0, 0]}},
|
|
{"command": "file.export", "params": {"path": str(path), "bodies": ["Cube"]}},
|
|
])
|
|
return path
|
|
|
|
|
|
@pytest.fixture
|
|
def cubes(tmp_path):
|
|
return cube_step(tmp_path / "a.step", 0), cube_step(tmp_path / "b.step", 1)
|
|
|
|
|
|
def compare(*args):
|
|
return subprocess.run([sys.executable, SCRIPTS / "compare_step.py", *args], capture_output=True, text=True)
|
|
|
|
|
|
def test_identical_solids_have_no_difference(cubes):
|
|
a, _ = cubes
|
|
result = compare(a, a)
|
|
assert result.returncode == 0, result.stderr
|
|
assert "xor 0 mm3" in result.stdout
|
|
|
|
|
|
def test_shifted_solid_shows_where_it_differs(cubes):
|
|
a, b = cubes
|
|
result = compare(b, a)
|
|
assert result.returncode == 1, result.stderr
|
|
assert "xor 200 mm3 in 2 pieces" in result.stdout
|
|
assert "only in actual: 100 mm3 at (10, 0, 0)..(11, 10, 10)" in result.stdout
|
|
assert "only in expected: 100 mm3 at (0, 0, 0)..(1, 10, 10)" in result.stdout
|
|
|
|
|
|
def test_tolerance(cubes):
|
|
a, b = cubes
|
|
result = compare(b, a, "--tolerance", "500")
|
|
assert result.returncode == 0, result.stderr
|
|
assert "xor 200 mm3 in 2 pieces" in result.stdout
|
|
|
|
|
|
def two_boxes_step(path: Path, shift: float) -> Path:
|
|
run.execute([
|
|
{"command": "solid.box", "params": {"length": 10, "width": 10, "height": 10, "body_name": "A"}},
|
|
{"command": "solid.box", "params": {"length": 10, "width": 10, "height": 10, "body_name": "B"}},
|
|
{"command": "solid.move", "params": {"bodies": ["B"], "translate": [shift, 0, 0]}},
|
|
{"command": "file.export", "params": {"path": str(path), "bodies": ["A", "B"]}},
|
|
])
|
|
return path
|
|
|
|
|
|
def test_overlapping_solids_in_one_file_count_once(tmp_path):
|
|
result = compare(two_boxes_step(tmp_path / "a.step", 5), two_boxes_step(tmp_path / "b.step", 10))
|
|
assert "volume 1500 vs 2000 mm3" in result.stdout, result.stdout + result.stderr
|
|
assert "xor 500 mm3" in result.stdout
|