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.
109 lines
3.4 KiB
Elixir
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
|