constellation_full_name(text) returns full IAU name from 3-letter abbreviation (88-entry static table, IMMUTABLE). Returns NULL for invalid input — composable with constellation() in queries. Three rise_set_status functions classify body visibility as 'rises_and_sets', 'circumpolar', or 'never_rises' by sampling elevation at 48 points across 24h. Separate diagnostic path — called only when rise/set returns NULL, zero cost in normal case. 147 → 151 SQL objects. 25 → 26 regression suites. All pass.
110 lines
5.3 KiB
SQL
110 lines
5.3 KiB
SQL
-- v015_features.sql -- Tests for v0.15.0: constellation_full_name + rise_set_status
|
|
--
|
|
-- Verifies the constellation full name lookup and the rise/set
|
|
-- status diagnostic functions.
|
|
CREATE EXTENSION IF NOT EXISTS pg_orrery;
|
|
|
|
-- ============================================================
|
|
-- constellation_full_name: known abbreviations
|
|
-- ============================================================
|
|
|
|
SELECT constellation_full_name('Ari') AS aries;
|
|
SELECT constellation_full_name('CMa') AS canis_major;
|
|
SELECT constellation_full_name('UMi') AS ursa_minor;
|
|
SELECT constellation_full_name('Ori') AS orion;
|
|
SELECT constellation_full_name('Cyg') AS cygnus;
|
|
SELECT constellation_full_name('Oct') AS octans;
|
|
SELECT constellation_full_name('TrA') AS tri_australe;
|
|
|
|
-- ============================================================
|
|
-- constellation_full_name: composability with constellation()
|
|
-- ============================================================
|
|
|
|
-- Chain: equatorial -> abbreviation -> full name
|
|
SELECT constellation_full_name(constellation(2.5303, 89.264)) AS polaris_full;
|
|
SELECT constellation_full_name(constellation(6.7525, -16.716)) AS sirius_full;
|
|
|
|
-- Chain with planet equatorial
|
|
SELECT constellation_full_name(
|
|
constellation(planet_equatorial(5, '2024-01-15 12:00:00+00'::timestamptz))
|
|
) AS jupiter_full;
|
|
|
|
-- ============================================================
|
|
-- constellation_full_name: NULL for invalid abbreviation
|
|
-- ============================================================
|
|
|
|
SELECT constellation_full_name('XYZ') IS NULL AS invalid_returns_null;
|
|
SELECT constellation_full_name('') IS NULL AS empty_returns_null;
|
|
SELECT constellation_full_name('Toolong') IS NULL AS toolong_returns_null;
|
|
|
|
-- ============================================================
|
|
-- constellation_full_name: all 88 are reachable (count check)
|
|
-- ============================================================
|
|
|
|
-- Use generate_series to count distinct full names from the
|
|
-- known constellation abbreviations via a spot check
|
|
SELECT count(DISTINCT constellation_full_name(abbr)) = 7
|
|
AS spot_check_7_names
|
|
FROM (VALUES ('Ari'), ('CMa'), ('UMi'), ('Ori'), ('Cyg'), ('Oct'), ('TrA')) AS t(abbr);
|
|
|
|
-- ============================================================
|
|
-- sun_rise_set_status: mid-latitude (Eagle, Idaho) in winter
|
|
-- Sun rises and sets normally
|
|
-- ============================================================
|
|
|
|
SELECT sun_rise_set_status('(43.7,-116.4,800)'::observer, '2024-01-15 00:00:00+00'::timestamptz)
|
|
AS sun_status_midlat;
|
|
|
|
-- ============================================================
|
|
-- sun_rise_set_status: 70N in June (midnight sun)
|
|
-- ============================================================
|
|
|
|
SELECT sun_rise_set_status('(70.0,25.0,0)'::observer, '2024-06-21 00:00:00+00'::timestamptz)
|
|
AS sun_status_midnight_sun;
|
|
|
|
-- ============================================================
|
|
-- sun_rise_set_status: 70N in December (polar night)
|
|
-- ============================================================
|
|
|
|
SELECT sun_rise_set_status('(70.0,25.0,0)'::observer, '2024-12-21 00:00:00+00'::timestamptz)
|
|
AS sun_status_polar_night;
|
|
|
|
-- ============================================================
|
|
-- moon_rise_set_status: mid-latitude — Moon normally rises/sets
|
|
-- ============================================================
|
|
|
|
SELECT moon_rise_set_status('(43.7,-116.4,800)'::observer, '2024-01-15 00:00:00+00'::timestamptz)
|
|
AS moon_status_midlat;
|
|
|
|
-- ============================================================
|
|
-- planet_rise_set_status: Jupiter from mid-latitude (normal)
|
|
-- ============================================================
|
|
|
|
SELECT planet_rise_set_status(5, '(43.7,-116.4,800)'::observer, '2024-01-15 00:00:00+00'::timestamptz)
|
|
AS jupiter_status_midlat;
|
|
|
|
-- ============================================================
|
|
-- Consistency: status matches rise/set NULL contract
|
|
-- ============================================================
|
|
|
|
-- When sun_next_set returns NULL (circumpolar), status should say so
|
|
SELECT sun_next_set('(70.0,25.0,0)'::observer, '2024-06-21 00:00:00+00'::timestamptz) IS NULL
|
|
AS sun_no_set_null;
|
|
SELECT sun_rise_set_status('(70.0,25.0,0)'::observer, '2024-06-21 00:00:00+00'::timestamptz)
|
|
= 'circumpolar' AS status_confirms_circumpolar;
|
|
|
|
-- When sun_next_rise returns NULL (polar night), status should say so
|
|
SELECT sun_next_rise('(70.0,25.0,0)'::observer, '2024-12-21 00:00:00+00'::timestamptz) IS NULL
|
|
AS sun_no_rise_null;
|
|
SELECT sun_rise_set_status('(70.0,25.0,0)'::observer, '2024-12-21 00:00:00+00'::timestamptz)
|
|
= 'never_rises' AS status_confirms_never_rises;
|
|
|
|
-- ============================================================
|
|
-- Error cases
|
|
-- ============================================================
|
|
|
|
-- Invalid body_id for planet_rise_set_status
|
|
DO $$ BEGIN PERFORM planet_rise_set_status(0, '(43.7,-116.4,800)'::observer, '2024-01-15 00:00:00+00'::timestamptz); EXCEPTION WHEN OTHERS THEN RAISE NOTICE 'body_id=0: %', SQLERRM; END $$;
|
|
DO $$ BEGIN PERFORM planet_rise_set_status(3, '(43.7,-116.4,800)'::observer, '2024-01-15 00:00:00+00'::timestamptz); EXCEPTION WHEN OTHERS THEN RAISE NOTICE 'body_id=3(Earth): %', SQLERRM; END $$;
|
|
DO $$ BEGIN PERFORM planet_rise_set_status(9, '(43.7,-116.4,800)'::observer, '2024-01-15 00:00:00+00'::timestamptz); EXCEPTION WHEN OTHERS THEN RAISE NOTICE 'body_id=9: %', SQLERRM; END $$;
|