The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use warnings;
use strict;

use Test::More tests => 21;

BEGIN {
	use_ok "Time::TAI::Now",
		qw(now_tai_rat now_tai_gsna now_tai_flt now_tai_dec);
}

my @rat = now_tai_rat();
is scalar(@rat), 2;
isa_ok $rat[0], "Math::BigRat";
ok $rat[0] >= 0;
SKIP: {
	skip "no inaccuracy bound", 2 unless defined $rat[1];
	isa_ok $rat[1], "Math::BigRat";
	ok $rat[1] >= 0;
}

sub is_int($) {
	my($arg) = @_;
	return 0 unless ref(\$arg) eq "SCALAR" && defined($arg);
	return $arg =~ /\A(?:0|-?[1-9][0-9]*)\z/;
}

sub is_gsna($) {
	my($arg) = @_;
	return 0 unless ref($arg) eq "ARRAY" && @$arg == 4;
	foreach(@$arg) {
		return 0 unless is_int($_);
	}
	foreach(@{$arg}[1..3]) {
		return 0 unless $_ >= 0 && $_ < 1000000000;
	}
	return 1;
}

my @gsna = now_tai_gsna();
is scalar(@gsna), 2;
ok is_gsna($gsna[0]);
ok $gsna[0]->[0] >= 0;
SKIP: {
	skip "no inaccuracy bound", 2 unless defined $gsna[1];
	ok is_gsna($gsna[1]);
	ok $gsna[1]->[0] >= 0;
}

sub is_num($) {
	my($arg) = @_;
	return 0 unless ref(\$arg) eq "SCALAR" && defined($arg);
	my $warned;
	local $SIG{__WARN__} = sub { $warned = 1; };
	{ no warnings "void"; 0 + $arg; }
	return !$warned;
}

my @flt = now_tai_flt();
is scalar(@flt), 2;
ok is_num($flt[0]);
ok $flt[0] >= 0;
SKIP: {
	skip "no inaccuracy bound", 2 unless defined $flt[1];
	ok is_num($flt[1]);
	ok $flt[1] >= 0;
}

sub is_dec($) {
	my($arg) = @_;
	return 0 unless ref(\$arg) eq "SCALAR" && defined($arg);
	return $arg =~ /\A(?:-(?!0\z))?(?:0|[1-9][0-9]*)(?:\.[0-9]*[1-9])?\z/;
}

my @dec = now_tai_dec();
is scalar(@dec), 2;
ok is_dec($dec[0]);
ok $dec[0] !~ /\A-/;
SKIP: {
	skip "no inaccuracy bound", 2 unless defined $dec[1];
	ok is_dec($dec[1]);
	ok $dec[1] !~ /\A-/;
}

1;