#!/usr/bin/pugs

use v6;
use Test;

=kwid
   Relational Operators
=cut

plan 42;

## For Numbers: <, <=, <=>, >=, >

# less than

ok(1 < 2, '1 is less than 2');
ok(!(2 < 1), '2 is ~not~ less than 1');

# greater than

ok(2 > 1, '2 is greater than 1');
ok(!(1 > 2), '1 is ~not~ greater than 2');

# less than or equal to

ok(1 <= 2, '1 is less than or equal to 2');
ok(1 <= 1, '1 is less than or equal to 2');
ok(!(1 <= 0), '1 is ~not~ less than or equal to 0');

# greater than or eqaul to

ok(2 >= 1, '2 is greater than or equal to 1');
ok(2 >= 2, '2 is greater than or equal to 2');
ok(!(2 >= 3), '2 is ~not~ greater than or equal to 3');

# spaceship

is(1 <=> 1, 0,  '1 is equal to 1');
is(1 <=> 2, -1, '1 is less than 2');
is(2 <=> 1, 1,  '2 is greater than 1');

## Multiway comparisons (RFC 025)

# L<S03/"Chained comparisons">

# this works ...
is(5 > 1 < 10, 5 > 1 && 1 < 10, 'multi-way comp 5 > 1 < 10 works');

# however this doesn't which makes 
# me think these are not implemented
is(5 < 1 < 10, 5 < 1 && 1 < 10, 'multi-way comp 5 < 1 < 10 works');

## NOTE: these tests moved here from t/03operator.t 
# L<S03/"Chained comparisons">

ok(5 > 4 > 3, "chained comparison");
ok(3 < 4 < 5, "chained comparison");
ok(5 == 5 > -5, "chained comparison with equality");
ok(!(3 > 4 < 5), "chained n > n < n comparison");
ok(5 <= 5 > -5, "chained comparison with <=");
ok(-5 < 5 >= 5, "chained comparison with >=");

## For Strings: <, <=, <=>, >=, >

# less than

ok('a' lt 'b', 'a is less than b');
ok(!('b' lt 'a'), 'b is ~not~ less than a');

# greater than

ok('b' gt 'a', 'b is greater than a');
ok(!('a' gt 'b'), 'a is ~not~ greater than b');

# less than or equal to

ok('a' le 'b', 'a is less than or equal to b');
ok('a' le 'a', 'a is less than or equal to a');
ok(!('b' le 'a'), 'b is ~not~ less than or equal to a');

# greater than or eqaul to

ok('b' ge 'a', 'b is greater than or equal to a');
ok('b' ge 'b', 'b is greater than or equal to b');
ok(!('b' ge 'c'), 'b is ~not~ greater than or equal to c');

# cmp

is('a' cmp 'a', 0,  'a is equal to a');
is('a' cmp 'b', -1, 'a is less than b');
is('b' cmp 'a', 1,  'b is greater than a');

## Multiway comparisons (RFC 025)
# L<S03/"Chained comparisons">

# this works ...
is('e' gt 'a' lt 'j', 'e' gt 'a' && 'a' lt 'j', 'multi-way comp e gt a lt j works');

# however this doesn't which makes 
# me think these are not implemented
is('e' lt 'a' lt 'j', 'e' lt 'a' && 'a' lt 'j', 'multi-way comp e lt a lt j works');

## NOTE: these tests moved here from t/03operator.t 
# L<S03/"Chained comparisons">

ok("5" gt "4" gt "3", "5 gt 4 gt 3 chained str comparison");
ok("3" lt "4" lt "5", "3 lt 4 gt 5 chained str comparison");
ok(!("3" gt "4" lt "5"), "!(3 gt 4 lt 5) chained str comparison");
ok("5" eq "5" gt "0", '"5" eq "5" gt "0" chained str comparison with equality');
ok("5" le "5" gt "0", "5 le 5 gt 0 chained str comparison with le");
ok("0" lt "5" ge "5", "0 lt 5 ge 5 chained comparison with ge");