Skip to content

Commit a71839e

Browse files
committed
Expand .is-prime tests
Test method and sub coersions for all numerics. Rakudo fixes: rakudo/rakudo@f01c50f1a4 rakudo/rakudo@237019665b rakudo/rakudo@893d09ffad rakudo/rakudo@b2b39bad0a
1 parent 496fdd7 commit a71839e

File tree

1 file changed

+37
-6
lines changed

1 file changed

+37
-6
lines changed

S32-num/is-prime.t

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,40 @@ is-deeply 170141183460469231731687303715884105725.is-prime, False,
4949
is-deeply 6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151.is-prime,
5050
True, 'M13 is prime';
5151

52-
ok is-prime(2.0), 'correct coersion (Rat)';
53-
ok is-prime(2e0), 'correct coersion (Num)';
54-
ok is-prime('2.0'), 'correct coersion (Str)';
55-
nok is-prime(2.5), 'decimal numbers are not prime (Rat)';
56-
nok is-prime(2e5), 'decimal numbers are not prime (Num)';
57-
nok is-prime(-2), 'negative numbers are not prime';
52+
subtest 'coersion from different types' => {
53+
my @prime := '2.0', 3, <5>, 2.0, <3.0>, 5e0, <2e0>, <3+0i>, <5+0i >,
54+
FatRat.new(2,1), FatRat.new(6,2);
55+
my @un-prime := '4.0', 6, <8>, 4.0, <6.0>, 8e0, <4e0>, <6+0i>, <8+0i >,
56+
'2.1', 2.3, <3.4>, 5.1e0, <2.7e0>, <3.8+0i>, <5.3+0i >, <3.8e0+0i>,
57+
<5.3e0+0i >, '-4.0', '−4.0', -6, <-8>, -4.0, <-6.0>, -8e0, <-4e0>,
58+
<-6+0i>, <-8+0i >, FatRat.new(4,1), FatRat.new(12,2);
59+
plan 2*(@prime + @un-prime);
60+
61+
for @prime {
62+
my $desc := "{.perl} {.^name} is prime";
63+
is-deeply is-prime($_), True, "$desc (sub form)";
64+
is-deeply .is-prime, True, "$desc (method form)";
65+
}
66+
for @un-prime {
67+
my $desc := "{.perl} {.^name} is NOT prime";
68+
is-deeply is-prime($_), False, "$desc (sub form)";
69+
is-deeply .is-prime, False, "$desc (method form)";
70+
}
71+
}
72+
73+
subtest 'Complex.is-prime with Complex that cannot be Real throw' => {
74+
plan 2*my @tests := <3-3i >, <2+5i>, <-3-3i >, <-2+5i>, <0+31337i>;
75+
for @tests {
76+
throws-like { .is-prime }, X::Numeric::Real, "{.perl} (method form)";
77+
throws-like { is-prime $_ }, X::Numeric::Real, "{.perl} (sub form)";
78+
}
79+
}
80+
81+
# Some implementations have lazily-reduced Rational addition, which makes it
82+
# possible to cause bugs in `.is-prime` impls that test for .denominator == 1
83+
is-deeply (<3/2> + <3/2>).is-prime, True, 'lazily-reduced Rat (method)';
84+
is-deeply is-prime(<3/2> + <3/2>), True, 'lazily-reduced Rat (sub)';
85+
is-deeply (FatRat.new(3,2) + FatRat.new(3,2)).is-prime, True,
86+
'lazily-reduced FatRat (method)';
87+
is-deeply is-prime(FatRat.new(3,2) + FatRat.new(3,2)), True,
88+
'lazily-reduced FatRat (sub)';

0 commit comments

Comments
 (0)