prop/test/microwaveprop/canopy_test.exs
Graham McIntire da332d3174
test: 100% coverage push — Valkey.RedixAdapter, Buildings.BulkFetch, AprsRepo, Maidenhead, Canopy
- Valkey.RedixAdapter: 0% -> 100% (delegation lines exercised)
- Buildings.BulkFetch: 0% -> 56% (run/4 with stubbed empty index)
- AprsRepo: 50% -> exercises repo config + Ecto.Repo callbacks
- Maidenhead.valid?/1: covers non-binary non-nil arms
- Canopy.tile_filename/2: S/E hemisphere prefix branches
2026-05-08 10:01:28 -05:00

74 lines
2.5 KiB
Elixir

defmodule Microwaveprop.CanopyTest do
use ExUnit.Case, async: true
alias Microwaveprop.Canopy
@samples 4
setup do
tiles_dir = Path.join(System.tmp_dir!(), "canopy_test_#{:erlang.unique_integer([:positive])}")
File.mkdir_p!(tiles_dir)
on_exit(fn -> File.rm_rf!(tiles_dir) end)
{:ok, tiles_dir: tiles_dir}
end
defp write_tile(tiles_dir, lat, lon, heights) do
path = Path.join(tiles_dir, Canopy.tile_filename(lat, lon))
File.write!(path, IO.iodata_to_binary(heights))
path
end
test "tile_filename/2 follows SRTM naming convention" do
assert Canopy.tile_filename(32.5, -97.5) == "N32W098.canopy"
assert Canopy.tile_filename(33.0, -96.0) == "N33W096.canopy"
end
test "tile_filename/2 uses S prefix for southern hemisphere" do
assert Canopy.tile_filename(-15.5, 30.0) == "S16E030.canopy"
end
test "tile_filename/2 uses E prefix for eastern hemisphere" do
assert Canopy.tile_filename(48.0, 11.5) == "N48E011.canopy"
end
test "lookup/3 returns 0 when tile is missing", %{tiles_dir: tiles_dir} do
assert Canopy.lookup(32.5, -97.5, tiles_dir, samples: @samples) == 0
end
test "lookup/3 returns the height at the matching pixel", %{tiles_dir: tiles_dir} do
# 4x4 grid, row 0 = north edge, so:
# row 0 = lat 33 (N edge)
# row 3 = lat 32 (S edge)
heights =
List.flatten([
[10, 11, 12, 13],
[20, 21, 22, 23],
[30, 31, 32, 33],
[40, 41, 42, 43]
])
write_tile(tiles_dir, 32.5, -97.5, heights)
# Interior near NW (row 0, col 0) -> 10
assert Canopy.lookup(32.999, -97.999, tiles_dir, samples: @samples) == 10
# Interior near NE (row 0, col 3) -> 13
assert Canopy.lookup(32.999, -97.001, tiles_dir, samples: @samples) == 13
# Interior near SW (row 3, col 0) -> 40
assert Canopy.lookup(32.001, -97.999, tiles_dir, samples: @samples) == 40
# Interior near SE (row 3, col 3) -> 43
assert Canopy.lookup(32.001, -97.001, tiles_dir, samples: @samples) == 43
end
test "lookup_many/2 batches lookups grouping by tile", %{tiles_dir: tiles_dir} do
heights = List.duplicate(25, @samples * @samples)
write_tile(tiles_dir, 32.5, -97.5, heights)
points = [{32.5, -97.5}, {32.1, -97.9}]
result = Canopy.lookup_many(points, tiles_dir, samples: @samples)
assert result[{32.5, -97.5}] == 25
assert result[{32.1, -97.9}] == 25
# Point in a tile that doesn't exist is 0.
assert Canopy.lookup_many([{40.0, -90.0}], tiles_dir, samples: @samples)[{40.0, -90.0}] == 0
end
end