use v6-alpha; use Test; plan 38; use Set; class Person {}; my $bob = Person.new; my $bert = Person.new; my $set = set(0, 1, 2, 3, $bob); my $union = $set + set(4,5,6); isa_ok($union, Set, "set() - infix:<+>"); my $stringified = ~$set; ok($stringified ~~ rx:P5/^set\(.*Person.*\)$/, "prefix:<~>", :todo); ok($union == set(0..6, $bob), "set() - infix:<==>"); ok(!($union != set(0..6, $bob)), "set() - !infix:"); ok($union != set(0..5, $bob), "set() - infix:"); ok(!($union == set(0..5, $bob)), "set() - !infix:<==>"); ok($union != set(0..6, $bob, $bert), "set() - infix:"); ok(!($union == set(0..6, $bob, $bert)), "set() - !infix:<==>"); my $other_set = set(2..3, 7, $bob, $bert); my $intersection = $set * $other_set; is($intersection, set(2..3, $bob), "intersection"); my $difference = $set - $other_set; is($difference, set(0,1), "difference"); my $sym_difference = $set % $other_set; is($sym_difference, set(0,1,7,$bert), "symmetric_difference"); is( ($set - $other_set) + ($other_set - $set), $set % $other_set, "long form of symmetric difference"); my ($homer, $marge, $bart, $lisa, $maggie) = (1..5).map:{ Person.new }; my $simpsons = set($homer, $marge, $bart, $lisa, $maggie); my $parents = set($homer, $marge); my $empty = set(); ok($parents < $simpsons, 'infix:"<"'); ok(!($simpsons < $parents), '!infix:"<"'); ok(!($parents < $parents), '!infix:"<" (equal sets)'); ok($parents <= $simpsons, 'infix:"<="'); ok(!($simpsons <= $parents), '!infix:"<="'); ok($parents <= $parents, 'infix:"<=" (equal sets)'); ok($empty < $simpsons, "infix:'<' (empty)"); ok($empty <= $simpsons, "infix:'<=' (empty)"); ok($simpsons > $parents, "infix:'>'"); ok(!($parents > $simpsons), "!infix:'>'"); ok(!($parents > $parents), "!infix:'>' (equal sets)"); ok($simpsons >= $parents, "infix:'>='"); ok(!($parents >= $simpsons), "!infix:'>='"); ok($parents >= $parents, "infix:'>=' (equal sets)"); ok($simpsons > $empty, "infix:'>' (empty)"); ok($parents >= $empty, "infix:'>=' (empty)"); ok((set(1,2,3) ∋ 1), "infix:<∋>"); # Smartmatch operator ok 42 ~~ set(23, 42, 63), "infix:<~~> works (1)"; ok not(42 ~~ set(23, 43, 63)), "infix:<~~> works (2)"; # Rubyish set operations on arrays # Note: We only test for the correct number of elements, as there's no # particular order. # "Why do you write "+[hash]" instead of "+#" in the test descriptions?" # -- The test harness doesn't get that the "#" in "+#" does not start a # comment, and thus doesn't interpret the "# TODO feature". is eval('+([1,2,3] +# [1,2,3])'), 3, "infix:<+[hash]> works (1)"; is eval('+([1,2,3] +# [1,2,3,4])'), 4, "infix:<+[hash]> works (2)"; is eval('+([1,2,3] -# [1,2,3])'), 0, "infix:<-[hash]> works (1)"; is eval('+([1,2,3] -# [1,2,3,4])'), 0, "infix:<-[hash]> works (2)"; is eval('+([1,2,3] *# [2,3])'), 2, "infix:<*[hash]> works (1)", :todo; is eval('+([1,2,3] *# [])'), 0, "infix:<*[hash]> works (2)", :todo; is eval('+([1,2,3] %# [1,2,6])'), 2, "infix:<%[hash]> works", :todo;