/
combinations.t
95 lines (80 loc) 路 3.9 KB
/
combinations.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
use v6;
use Test;
plan 32;
# L<S32::Containers/List/=item combinations>
is-deeply (1, 2, 3).combinations(1), ((1,), (2,), (3,)),
"single-item combinations";
is-deeply (1, 2, 3).combinations(2), ((1, 2), (1, 3), (2, 3)),
"two item combinations";
is-deeply (1, 2, 3).combinations(3), ((1,2,3),),
"three items of a three-item list";
is-deeply (1, 2, 3).combinations(1..2), ((1,), (2,), (3,), (1, 2), (1, 3), (2, 3)),
"1..2 items";
is-deeply (1, 2, 3).combinations(0..3),
((), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)), "0..3 items";
is-deeply (1, 2, 3).combinations(2..3), ((1, 2), (1, 3), (2, 3), (1, 2, 3)),
"2..3 items";
is-deeply (1, 2, 3).combinations(0..0), ((),), "0..0 items";
is-deeply (1, 2, 3).combinations,
((), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)),
'defaults to "powerset"';
is-deeply (1, 2, 3).combinations(2..4),
((1, 2), (1, 3), (2, 3), (1, 2, 3)), "2..4 items (range autofit)";
is-deeply (1, 2, 3).combinations(2..^5), ((1, 2), (1, 3), (2, 3), (1, 2, 3)),
"2..^5 items (range autofit)";
# open end-points
is-deeply (1, 2, 3).combinations(1..^3),
((1,), (2,), (3,), (1, 2), (1, 3), (2, 3)), "1..^3 items";
is-deeply (1, 2, 3).combinations(-1^..3),
((), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)), "-1^..3 items";
is-deeply (1, 2, 3).combinations(1^..3), ((1, 2), (1, 3), (2, 3), (1, 2, 3)),
"1^..3 items";
is-deeply (1, 2, 3).combinations(1^..^3), ((1, 2), (1, 3), (2, 3)), "1^..^3 items";
is-deeply combinations(3,2), ((0, 1), (0, 2), (1, 2)), "combinations function";
is-deeply combinations(3,0), ((),), "zero k combinations function";
# Pathological cases
is-deeply (1, 2, 3).combinations(4), (),
"combinations 4 items from 3 item list is empty";
is-deeply (1, 2, 3).combinations(1..0), (), "1..0 items is empty";
is-deeply (1, 2, 3).combinations(1^..0), (), "1^..0 items is empty";
is-deeply (1, 2, 3).combinations(1..^0), (), "1..^0 items is empty";
is-deeply (1, 2, 3).combinations(0^..0), (), "0^..0 items is empty";
is-deeply (1, 2, 3).combinations(0..^0), (), "0..^0 items is empty";
is-deeply (1, 2, 3).combinations(0^..^0), (), "0^..^0 items is empty";
is-deeply (1, 2, 3).combinations(-1..-2), (), "-1..-2 items is empty";
is-deeply (1, 2, 3).combinations(-2..-1), (), "-2..-1 items is empty";
is-deeply combinations(3,-1), (), "negative k combinations function is empty";
is-deeply combinations(3,4), (), "too high k combinations function is empty";
# RT #127778
{
is-deeply combinations(-2,2), (),
'negative $n in sub combinations (1)';
is-deeply combinations(-9999999999999999999,2), (),
'negative $n in sub combinations (2)';
is-deeply combinations(2,-2), (),
'negative $k in sub combinations gives empty list (1)';
is-deeply combinations(-2,-2), (),
'negative $k in sub combinations gives empty list (2)';
}
# RT #127779
subtest {
plan 12;
is-deeply combinations( 2, 0.5), ((),), 'Rat in $k';
is-deeply combinations(0.5, 2), (), 'Rat in $n';
is-deeply combinations(0.5, 0.5), ((),), 'Rat in $n and $k';
is-deeply combinations( -2, -0.5), ((),), 'Rat in $k (negatives)';
is-deeply combinations(-0.5, -2), (), 'Rat in $n (negatives)';
is-deeply combinations(-0.5, -0.5), ((),), 'Rat in $n and $k (negatives)';
is-deeply combinations(3, 2.5), ((0, 1), (0, 2), (1, 2),),
'Rat in $k (non-zero .Int)';
is-deeply combinations(3.5, 2), ((0, 1), (0, 2), (1, 2),),
'Rat in $n (non-zero .Int)';
is-deeply combinations(3.5, 2.5), ((0, 1), (0, 2), (1, 2),),
'Rat in $n and $k (non-zero .Int)';
is-deeply combinations(3.5e0, 2.5e0), ((0, 1), (0, 2), (1, 2),),
'Num in $n and $k';
is-deeply combinations(|<3.5 2e0>), ((0, 1), (0, 2), (1, 2),),
'RatStr/NumStr in $n and $k';
is-deeply combinations(3.5+0i, 2.5+0i), ((0, 1), (0, 2), (1, 2),),
'Complex in $n and $k';
}, 'Non-Int values in combinations';