use Test::Most 'die';

use lib 'lib';
use 5.12.0;
use Unknown::Values;

# Kleene's three-value logic

use constant true  => 1;
use constant false => 0;
my $value = unknown;

sub is_false($) {
    my $value = shift;
    return ( !$value && !is_unknown($value) );
}

# sanity
ok is_unknown unknown, 'unknown should be unknown';
ok !is_unknown undef, 'undef is not unknown';
ok !is_unknown false, 'a defined false value is not unknown';
ok !is_unknown true,  'a defined true value is not unknown';

# negation
ok is_unknown !unknown, 'not unknown should evaluate to unknown';

# logical or
ok unknown            || true,  'unknown || true should be true';
ok is_unknown unknown || false, 'unknown || false should be unknown';
ok is_unknown unknown || unknown, 'unknown || unknown should be unknown';

ok + ( unknown            or true ),  'unknown or true should be true';
ok + ( is_unknown unknown or false ), 'unknown or false should be unknown';
ok + ( is_unknown unknown or unknown ), 'unknown or unknown should be unknown';

# logical and
ok is_unknown unknown && true, 'unknown && true should be unknown';
ok is_false( unknown && false ), 'unknown && false should be false';
ok is_unknown unknown && unknown, 'unknown && unknown should be unknown';

ok + ( is_unknown unknown and true ), 'unknown and true should be unknown';
ok + ( is_false( unknown and false ) ), 'unknown and false should be false';
ok + ( is_unknown unknown and unknown ),
  'unknown and unknown should be unknown';

done_testing;