#!/usr/bin/perl
#

use strict;
use C4::Boolean;

use vars qw( @tests );
use vars qw( $loaded );

sub f ($) {
   my($x) = @_;
   my $it;
   # Returns either the value returned prefixed with 'OK:',
   # or the caught exception (string expected)
   local($@);
   eval {
      $it = 'OK:' . C4::Boolean::true_p($x);
   };
   if ($@) {
      $it = $@;
      $it =~ s/ at \S+ line \d+\.\n//s;
   }
   return $it;
}

BEGIN {
   @tests = (
   [
      'control',
      sub { C4::Boolean::INVALID_BOOLEAN_STRING_EXCEPTION },
      'The given value does not seem to be interpretable as a Boolean value',
      undef

   # False strings
   ], [
      '"0"',     \&f, 'OK:0', '0'
   ], [
      '"false"', \&f, 'OK:0', 'false'
   ], [
      '"off"',   \&f, 'OK:0', 'off'
   ], [
      '"no"',    \&f, 'OK:0', 'no'

   # True strings
   ], [
      '"1"',     \&f, 'OK:1', '1'
   ], [
      '"true"',  \&f, 'OK:1', 'true'
   ], [
      '"on"',    \&f, 'OK:1', 'on'
   ], [
      '"yes"',   \&f, 'OK:1', 'yes'
   ], [
      '"YES"',   \&f, 'OK:1', 'YES'	# verify case insensitivity

   # Illegal strings
#   ], [
#      'undef',   \&f, C4::Boolean::INVALID_BOOLEAN_STRING_EXCEPTION, undef
#   ], [
#      '"foo"',   \&f, C4::Boolean::INVALID_BOOLEAN_STRING_EXCEPTION, 'foo'
   ],
);
}

BEGIN { $| = 1; printf "1..%d\n", scalar(@tests); }
END {print "not ok 1\n" unless $loaded;}
$loaded = 1;


# Run all tests in sequence
for (my $i = 1; $i <= scalar @tests; $i += 1) {
   my $test = $tests[$i - 1];
   my($title, $f, $expected, $input) = @$test;
   die "not ok $i (malformed test case)\n"
      unless @$test == 4 && ref $f eq 'CODE';

   my $output = &$f($input);
   if (
	 (!defined $output && !defined $expected)
      || (defined $output && defined $expected && $output eq $expected)
   ) {
      print "ok $i - $title\n";
   } else {
      print "not ok $i - $title: got ",
	    (defined $output? "\"$output\"": 'undef'),
	    ', expected ',
	    (defined $expected? "\"$expected\"": 'undef'),
	    "\n";
   }
}





