aprs.me/test/aprsme/packet_geometry_test.exs
Graham McIntire e917a6b718
Add test coverage for conversion, geometry, PHG, and encoding modules
Cover to_float, to_decimal, normalize_data_type, weather_fields,
sanitize_packet_strings, to_float_safe, has_weather_data, create_point,
extract_coordinates, lat/lon helpers, PHG extraction, and altitude
extraction with 79 new tests across 4 test files.
2026-02-20 13:53:26 -06:00

109 lines
3.4 KiB
Elixir

defmodule Aprsme.PacketGeometryTest do
use Aprsme.DataCase, async: true
alias Aprsme.Packet
describe "create_point/2" do
test "creates point from valid float coordinates" do
point = Packet.create_point(40.7128, -74.006)
assert %Geo.Point{coordinates: {-74.006, 40.7128}, srid: 4326} = point
end
test "creates point from Decimal coordinates" do
lat = Decimal.new("40.7128")
lon = Decimal.new("-74.006")
point = Packet.create_point(lat, lon)
assert %Geo.Point{srid: 4326} = point
end
test "creates point from integer coordinates" do
point = Packet.create_point(40, -74)
assert %Geo.Point{coordinates: {-74, 40}, srid: 4326} = point
end
test "returns nil for invalid latitude" do
assert is_nil(Packet.create_point(91.0, 0.0))
assert is_nil(Packet.create_point(-91.0, 0.0))
end
test "returns nil for invalid longitude" do
assert is_nil(Packet.create_point(0.0, 181.0))
assert is_nil(Packet.create_point(0.0, -181.0))
end
test "returns nil for nil coordinates" do
assert is_nil(Packet.create_point(nil, nil))
assert is_nil(Packet.create_point(40.0, nil))
assert is_nil(Packet.create_point(nil, -74.0))
end
test "handles boundary coordinates" do
# North pole
assert %Geo.Point{} = Packet.create_point(90.0, 0.0)
# South pole
assert %Geo.Point{} = Packet.create_point(-90.0, 0.0)
# Date line
assert %Geo.Point{} = Packet.create_point(0.0, 180.0)
assert %Geo.Point{} = Packet.create_point(0.0, -180.0)
# Equator/prime meridian
point = Packet.create_point(0.0, 0.0)
assert %Geo.Point{srid: 4326} = point
assert point.coordinates == {0.0, 0.0}
end
test "returns nil for non-numeric types" do
assert is_nil(Packet.create_point("40.0", "-74.0"))
assert is_nil(Packet.create_point(:lat, :lon))
end
end
describe "extract_coordinates/1" do
test "extracts lat/lon from Geo.Point" do
point = %Geo.Point{coordinates: {-74.006, 40.7128}, srid: 4326}
assert {40.7128, -74.006} = Packet.extract_coordinates(point)
end
test "returns nil tuple for nil" do
assert {nil, nil} = Packet.extract_coordinates(nil)
end
test "returns nil tuple for non-point input" do
assert {nil, nil} = Packet.extract_coordinates(%{lat: 40.0, lon: -74.0})
assert {nil, nil} = Packet.extract_coordinates("not a point")
end
end
describe "lat/1" do
test "returns latitude from packet with location" do
packet = %Packet{location: %Geo.Point{coordinates: {-74.006, 40.7128}, srid: 4326}}
assert Packet.lat(packet) == 40.7128
end
test "returns nil for packet without location" do
packet = %Packet{location: nil}
assert is_nil(Packet.lat(packet))
end
test "returns nil for non-packet" do
assert is_nil(Packet.lat(nil))
assert is_nil(Packet.lat(%{}))
end
end
describe "lon/1" do
test "returns longitude from packet with location" do
packet = %Packet{location: %Geo.Point{coordinates: {-74.006, 40.7128}, srid: 4326}}
assert Packet.lon(packet) == -74.006
end
test "returns nil for packet without location" do
packet = %Packet{location: nil}
assert is_nil(Packet.lon(packet))
end
test "returns nil for non-packet" do
assert is_nil(Packet.lon(nil))
assert is_nil(Packet.lon(%{}))
end
end
end