-
Notifications
You must be signed in to change notification settings - Fork 4
/
test_cli.py
105 lines (79 loc) · 3.73 KB
/
test_cli.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import hashlib
from pathlib import Path
import pytest
from click.testing import CliRunner
from rasterio.errors import RasterioIOError
from mapa.cli import dem2stl, mapa
from mapa.stl_file import get_dimensions_of_stl_file
def test_dem2stl__version() -> None:
cli = CliRunner()
result = cli.invoke(dem2stl, ["--version"])
assert result.exit_code == 0, result.stdout
assert "dem2stl, version" in result.stdout
result = cli.invoke(mapa, ["--version"])
assert result.exit_code == 0, result.stdout
assert "mapa, version" in result.stdout
def test_dem2stl__no_input_file_no_demo(caplog) -> None:
cli = CliRunner()
result = cli.invoke(dem2stl)
assert result.exit_code == 1, result.stdout
assert "💥 Either of --input or --demo is required, try --help." in caplog.text
assert "Aborted!" in result.stdout
def test_dem2stl__not_a_tiff_file(corrupted_tiff, tmpdir) -> None:
cli = CliRunner()
output_file = tmpdir / "foo.stl"
result = cli.invoke(dem2stl, ["--input", str(corrupted_tiff), "--output", output_file])
assert result.exit_code == 1, result.stdout
with pytest.raises(RasterioIOError, match="not recognized as a supported file format"):
raise result.exception
def _dimensions_are_equal(stl_a, stl_b) -> bool:
dim_a = get_dimensions_of_stl_file(stl_a)
dim_b = get_dimensions_of_stl_file(stl_b)
return dim_a == dim_b
def _md5_sum(path: Path) -> str:
hash_md5 = hashlib.md5()
with open(path, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
def test_dem2stl__binary(test_tiff, tmpdir, test_stl_binary, caplog) -> None:
cli = CliRunner()
output_file = tmpdir / "output.stl"
result = cli.invoke(dem2stl, ["--input", str(test_tiff), "--output", output_file])
assert result.exit_code == 0, result.stdout
assert f"successfully generated STL file: {Path(output_file).absolute()}" in caplog.text
assert Path(output_file).is_file()
assert _dimensions_are_equal(test_stl_binary, output_file)
def test_dem2stl__ascii(test_tiff, tmpdir, test_stl_ascii, caplog) -> None:
cli = CliRunner()
output_file = tmpdir / "hawaii_ascii.stl"
result = cli.invoke(dem2stl, ["--input", str(test_tiff), "--as-ascii", "--output", output_file])
assert result.exit_code == 0, result.stdout
assert f"successfully generated STL file: {Path(output_file).absolute()}" in caplog.text
assert Path(output_file).is_file()
assert _dimensions_are_equal(test_stl_ascii, output_file)
assert _md5_sum(test_stl_ascii) == _md5_sum(output_file)
def test_dem2stl__model_size(test_tiff, tmpdir, test_stl_binary) -> None:
cli = CliRunner()
# create output file of model size 200
output_file_200 = tmpdir / "output_100.stl"
result = cli.invoke(
dem2stl,
["--input", str(test_tiff), "--output", output_file_200, "--model-size", 200],
)
assert result.exit_code == 0, result.stdout
assert _dimensions_are_equal(test_stl_binary, output_file_200)
output_200_size = Path(output_file_200).stat().st_size
expected_size = Path(test_stl_binary).stat().st_size
assert output_200_size == expected_size
# create output file of model size 100
output_file_100 = tmpdir / "output_200.stl"
result = cli.invoke(
dem2stl,
["--input", str(test_tiff), "--output", output_file_100, "--model-size", 100],
)
assert result.exit_code == 0, result.stdout
assert not _dimensions_are_equal(test_stl_binary, output_file_100)
output_100_size = Path(output_file_100).stat().st_size
# even though the files are different, their sizes (and thus the number of triangles) should be the same
assert output_100_size == expected_size