#!perl
use strict;
use warnings;
use lib 'lib';
use Test::More;
use Test::Exception;
use Test::Warnings;
# Lists
# https://proj.org/development/reference/functions.html#lists
plan tests => 4 + 6 + 6 + 6 + 4 + 1;
use Geo::LibProj::FFI qw( :all );
my ($list, @e);
# proj_list_operations
lives_ok { $list = proj_list_operations() } 'list_operations';
ok scalar @$list > 1, 'list_operations multiple';
@e = grep {$_->{id} eq 'noop'} @$list;
ok @e, 'list_operations id noop';
like ${$e[0]->{descr}}, qr/\bNo operation\b/i, 'list_operations descr';
# proj_list_ellps
lives_ok { $list = proj_list_ellps() } 'list_ellps';
ok scalar @$list > 1, 'list_ellps multiple';
@e = grep {$_->{id} eq 'intl'} @$list;
ok @e, 'list_ellps id intl';
like $e[0]->{name}, qr/\bHayford\b/i, 'list_ellps name';
like $e[0]->{major}, qr/\b6378388\b/, 'list_ellps major';
like $e[0]->{ell}, qr/\b297\b/, 'list_ellps major';
# proj_list_units
lives_ok { $list = proj_list_units() } 'list_units';
ok scalar @$list > 1, 'list_units multiple';
@e = grep {$_->{id} eq 'm'} @$list;
ok @e, 'list_units id m';
like $e[0]->{name}, qr/\bMeter\b/i, 'list_units name';
is $e[0]->{to_meter}, "1", 'list_units to_meter';
is $e[0]->{factor}, 1, 'list_units factor';
# proj_list_angular_units
lives_ok { $list = proj_list_angular_units() } 'list_angular_units';
ok scalar @$list > 1, 'list_angular_units multiple';
@e = grep {$_->{id} eq 'deg'} @$list;
ok @e, 'list_angular_units id deg';
like $e[0]->{name}, qr/\bDegree\b/i, 'list_angular_units name';
like $e[0]->{to_meter}, qr/^0\.0174/, 'list_angular_units to_meter ballpark';
like $e[0]->{factor}, qr/^0\.0174/, 'list_angular_units factor ballpark';
# proj_list_prime_meridians
lives_ok { $list = proj_list_prime_meridians() } 'list_prime_meridians';
ok scalar @$list > 1, 'list_prime_meridians multiple';
@e = grep {$_->{id} eq 'greenwich'} @$list;
ok @e, 'list_prime_meridians id lonlat';
is $e[0]->{defn}, "0dE", 'list_prime_meridians defn';
# the PROJ docs actually say it's .def, not .defn
done_testing;