-
Notifications
You must be signed in to change notification settings - Fork 135
/
bool.t
138 lines (110 loc) · 4.39 KB
/
bool.t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
use v6;
use Test;
plan 68;
#L<S12/Built-in Enumerations/"Two built-in enumerations are">
# tests True and False are Bool's
isa-ok(Bool::True, Bool);
isa-ok(Bool::False, Bool);
# tests they keep their Bool'ness when stored
my $a = Bool::True;
isa-ok($a, Bool);
$a = Bool::False;
isa-ok($a, Bool);
# tests that Bool.Bool works
isa-ok (Bool::True).Bool, Bool, "Bool.Bool is a Bool";
isa-ok (Bool::False).Bool, Bool, "Bool.Bool is a Bool";
is (Bool::True).Bool, Bool::True, "Bool.Bool works for True";
is (Bool::False).Bool, Bool::False, "Bool.Bool works for False";
# tests that ?Bool works
isa-ok ?(Bool::True), Bool, "?Bool is a Bool";
isa-ok ?(Bool::False), Bool, "?Bool is a Bool";
is ?(Bool::True), Bool::True, "?Bool works for True";
is ?(Bool::False), Bool::False, "?Bool works for False";
# tests they work with && and ||
Bool::True && pass('True works');
Bool::False || pass('False works');
# tests they work with !
!Bool::True || pass('!True works');
!Bool::False && pass('!False works');
# tests True with ok()
ok(Bool::True, 'True works');
# tests False with ok() and !
ok(!Bool::False, 'False works');
# tests Bool stringification - interaction with ~
isa-ok(~Bool::True, Str);
isa-ok(~Bool::False, Str);
is(~Bool::True, 'True', 'Bool stringification (True)');
is(~Bool::False, 'False', 'Bool stringification (False)');
is Bool::True.Str, 'True', 'True.Str';
is Bool::False.Str, 'False', 'False.Str';
is Bool::True.gist, 'True', 'True.gist';
is Bool::False.gist, 'False', 'False.gist';
is Bool::True.perl, 'Bool::True', 'True.perl';
is Bool::False.perl, 'Bool::False', 'False.perl';
# numification - interaction with +
ok(+Bool::True ~~ Numeric);
ok(+Bool::False ~~ Numeric);
isa-ok(+Bool::True, Int, 'True numifies to an Int');
isa-ok(+Bool::False, Int, 'False numifies to an Int');
ok(Bool::True.Int == 1, 'True Intifies to 1');
ok(Bool::False.Int == 0, 'False Intifies to 0');
is(+Bool::True, '1', 'True numifies to 1');
is(+Bool::False, '0', 'False numifies to 0');
# Arithmetic operations
my $bool = Bool::False;
is(++$bool, Bool::True, 'Increment of Bool::False produces Bool::True');
is(++$bool, Bool::True, 'Increment of Bool::True still produces Bool::True');
is(--$bool, Bool::False, 'Decrement of Bool::True produces Bool::False');
is(--$bool, Bool::False, 'Decrement of Bool::False produces Bool::False');
# RT #65514
{
ok (0 but Bool::True), 'Bool::True works with "but"';
is (0 but Bool::True), 0, 'Bool::True works with "but"';
ok !('RT65514' but Bool::False), 'Bool::False works with "but"';
is ('RT65514' but Bool::False), 'RT65514', 'Bool::False works with "but"';
}
{
is Bool::True.key, 'True', 'Bool::True.key works (is "True")';
is Bool::False.key, 'False', 'Bool::False.key works (is "False")';
}
{
my $x = Bool.pick;
ok ($x === True || $x === False), 'Bool.pick return True or False';
is Bool.pick(*).elems, 2, 'Bool.pick(*) returns two elems';;
my @a = Bool.roll(30);
ok @a.grep({$_}), 'Bool.roll(30) contains a True';
ok @a.grep({!$_}), 'Bool.roll(30) contains a False';
is Bool.roll(*).[^10].elems, 10, 'Bool.roll(*) contains at least 10 elems';
}
# RT #72580
{
ok True ~~ Int, "True ~~ Int";
ok Bool ~~ Int, "Bool ~~ Int";
}
# RT #127019
{
is Bool::True.Int, 1, 'Bool::True coerced to Int returns 1';
is Bool::False.Int, 0, 'Bool::False coerced to Int return 0';
my Bool $b = True;
is $b.Int, 1, 'Bool typed scalar coerces to Int';
}
{ # coverage; 2016-09-25
is-deeply ?Bool, Bool::False, '?Bool:U returns False';
is-deeply (so Bool), Bool::False, 'so Bool:U returns False';
is infix:<^^>(
Any, sub { pass 'sub{} operand of ^^ op gets called'; 42 },
), 42, '^^ operator with sub {} right operand works correctly';
is infix:<//>(
Any, sub { pass 'sub{} operand of // op gets called'; 42 },
), 42, '// operator with sub {} right operand works correctly';
is infix:<xor>(
Any, sub { pass 'sub{} operand of xor op gets called'; 42 },
), 42, 'xor operator with sub {} right operand works correctly';
is infix:<and>(42), 42, 'infix:<and> with 1 arg returns the arg';
is infix:<and>( ), Bool::True, 'infix:<and> with no args returns True';
}
# RT #130867
is-deeply quietly { Bool.Str }, '', 'Bool:U stringifies to empty string';
# https://irclog.perlgeek.de/perl6-dev/2017-07-10#i_14852407
is-deeply (((my int $ = 0) < 1) || 3), True, 'construct returns Bool, not Int';
# vim: ft=perl6