drop perl requirement to 5.8
[catagits/DOM-Tiny.git] / t / collection.t
CommitLineData
d6512b50 1use strict;
2use warnings;
3use Test::More;
4use DOM::Tiny::Collection 'c';
5use JSON::Tiny 'encode_json';
6
7# Array
8is c(1, 2, 3)->[1], 2, 'right result';
9is_deeply [@{c(3, 2, 1)}], [3, 2, 1], 'right result';
10my $collection = c(1, 2);
11push @$collection, 3, 4, 5;
12is_deeply [@$collection], [1, 2, 3, 4, 5], 'right result';
13
14# Tap into method chain
15is_deeply c(1, 2, 3)->tap(sub { $_->[1] += 2 })->to_array, [1, 4, 3],
16 'right result';
17
18# compact
19is_deeply c(undef, 0, 1, '', 2, 3)->compact->to_array, [0, 1, 2, 3],
20 'right result';
21is_deeply c(3, 2, 1)->compact->to_array, [3, 2, 1], 'right result';
22is_deeply c()->compact->to_array, [], 'right result';
23
24# flatten
25is_deeply c(1, 2, [3, 4], 5, c(6, 7))->flatten->to_array,
26 [1, 2, 3, 4, 5, 6, 7], 'right result';
27is_deeply c(undef, 1, [2, {}, [3, c(4, 5)]], undef, 6)->flatten->to_array,
28 [undef, 1, 2, {}, 3, 4, 5, undef, 6], 'right result';
29
30# each
31$collection = c(3, 2, 1);
32is_deeply [$collection->each], [3, 2, 1], 'right elements';
33$collection = c([3], [2], [1]);
34my @results;
35$collection->each(sub { push @results, $_->[0] });
36is_deeply \@results, [3, 2, 1], 'right elements';
37@results = ();
38$collection->each(sub { push @results, shift->[0], shift });
39is_deeply \@results, [3, 1, 2, 2, 1, 3], 'right elements';
40
41# first
42$collection = c(5, 4, [3, 2], 1);
43is $collection->first, 5, 'right result';
44is_deeply $collection->first(sub { ref $_ eq 'ARRAY' }), [3, 2], 'right result';
45is $collection->first(sub { shift() < 5 }), 4, 'right result';
46is $collection->first(qr/[1-4]/), 4, 'right result';
47is $collection->first(sub { ref $_ eq 'CODE' }), undef, 'no result';
48$collection = c(c(1, 2, 3), c(4, 5, 6), c(7, 8, 9));
49is_deeply $collection->first(first => sub { $_ == 5 })->to_array, [4, 5, 6],
50 'right result';
51$collection = c();
52is $collection->first, undef, 'no result';
53is $collection->first(sub {defined}), undef, 'no result';
54
55# last
56is c(5, 4, 3)->last, 3, 'right result';
57is c(5, 4, 3)->reverse->last, 5, 'right result';
58is c()->last, undef, 'no result';
59
60# grep
61$collection = c(1, 2, 3, 4, 5, 6, 7, 8, 9);
62is_deeply $collection->grep(qr/[6-9]/)->to_array, [6, 7, 8, 9],
63 'right elements';
64is_deeply $collection->grep(sub {/[6-9]/})->to_array, [6, 7, 8, 9],
65 'right elements';
66is_deeply $collection->grep(sub { $_ > 5 })->to_array, [6, 7, 8, 9],
67 'right elements';
68is_deeply $collection->grep(sub { $_ < 5 })->to_array, [1, 2, 3, 4],
69 'right elements';
70is_deeply $collection->grep(sub { shift == 5 })->to_array, [5],
71 'right elements';
72is_deeply $collection->grep(sub { $_ < 1 })->to_array, [], 'no elements';
73is_deeply $collection->grep(sub { $_ > 9 })->to_array, [], 'no elements';
74$collection = c(c(1, 2, 3), c(4, 5, 6), c(7, 8, 9));
75is_deeply $collection->grep(first => sub { $_ >= 5 })->flatten->to_array,
76 [4, 5, 6, 7, 8, 9], 'right result';
77
78# join
79$collection = c(1, 2, 3);
80is $collection->join, '123', 'right result';
81is $collection->join(''), '123', 'right result';
82is $collection->join('---'), '1---2---3', 'right result';
83is $collection->join("\n"), "1\n2\n3", 'right result';
84#is $collection->join('/')->url_escape, '1%2F2%2F3', 'right result'; # no bytestream object
85
86# map
87$collection = c(1, 2, 3);
88is $collection->map(sub { $_ + 1 })->join(''), '234', 'right result';
89is_deeply [@$collection], [1, 2, 3], 'right elements';
90is $collection->map(sub { shift() + 2 })->join(''), '345', 'right result';
91is_deeply [@$collection], [1, 2, 3], 'right elements';
92$collection = c(c(1, 2, 3), c(4, 5, 6), c(7, 8, 9));
93is $collection->map('reverse')->map(join => "\n")->join("\n"),
94 "3\n2\n1\n6\n5\n4\n9\n8\n7", 'right result';
95is $collection->map(join => '-')->join("\n"), "1-2-3\n4-5-6\n7-8-9",
96 'right result';
97
98# reverse
99$collection = c(3, 2, 1);
100is_deeply $collection->reverse->to_array, [1, 2, 3], 'right order';
101$collection = c(3);
102is_deeply $collection->reverse->to_array, [3], 'right order';
103$collection = c();
104is_deeply $collection->reverse->to_array, [], 'no elements';
105
106# shuffle
107$collection = c(0 .. 10000);
108my $random = $collection->shuffle;
109is $collection->size, $random->size, 'same number of elements';
110isnt "@$collection", "@$random", 'different order';
111is_deeply c()->shuffle->to_array, [], 'no elements';
112
113# size
114$collection = c();
115is $collection->size, 0, 'right size';
116$collection = c(undef);
117is $collection->size, 1, 'right size';
118$collection = c(23);
119is $collection->size, 1, 'right size';
120$collection = c([2, 3]);
121is $collection->size, 1, 'right size';
122$collection = c(5, 4, 3, 2, 1);
123is $collection->size, 5, 'right size';
124
125# reduce
126$collection = c(2, 5, 4, 1);
127is $collection->reduce(sub { $a + $b }), 12, 'right result';
128is $collection->reduce(sub { $a + $b }, 5), 17, 'right result';
129is c()->reduce(sub { $a + $b }), undef, 'no result';
130
131# sort
132$collection = c(2, 5, 4, 1);
133is_deeply $collection->sort->to_array, [1, 2, 4, 5], 'right order';
134is_deeply $collection->sort(sub { $b cmp $a })->to_array, [5, 4, 2, 1],
135 'right order';
136is_deeply $collection->sort(sub { $_[1] cmp $_[0] })->to_array, [5, 4, 2, 1],
137 'right order';
138$collection = c(qw(Test perl Mojo));
139is_deeply $collection->sort(sub { uc(shift) cmp uc(shift) })->to_array,
140 [qw(Mojo perl Test)], 'right order';
141$collection = c();
142is_deeply $collection->sort->to_array, [], 'no elements';
143is_deeply $collection->sort(sub { $a cmp $b })->to_array, [], 'no elements';
144
145# slice
146$collection = c(1, 2, 3, 4, 5, 6, 7, 10, 9, 8);
147is_deeply $collection->slice(0)->to_array, [1], 'right result';
148is_deeply $collection->slice(1)->to_array, [2], 'right result';
149is_deeply $collection->slice(2)->to_array, [3], 'right result';
150is_deeply $collection->slice(-1)->to_array, [8], 'right result';
151is_deeply $collection->slice(-3, -5)->to_array, [10, 6], 'right result';
152is_deeply $collection->slice(1, 2, 3)->to_array, [2, 3, 4], 'right result';
153is_deeply $collection->slice(6, 1, 4)->to_array, [7, 2, 5], 'right result';
154is_deeply $collection->slice(6 .. 9)->to_array, [7, 10, 9, 8], 'right result';
155
156# uniq
157$collection = c(1, 2, 3, 2, 3, 4, 5, 4);
158is_deeply $collection->uniq->to_array, [1, 2, 3, 4, 5], 'right result';
159is_deeply $collection->uniq->reverse->uniq->to_array, [5, 4, 3, 2, 1],
160 'right result';
161$collection = c([1, 2, 3], [3, 2, 1], [3, 1, 2]);
162is_deeply $collection->uniq(sub { $_->[1] }), [[1, 2, 3], [3, 1, 2]],
163 'right result';
164$collection = c(c(1, 2), c(1, 2), c(2, 1));
165is_deeply $collection->uniq(join => ',')->flatten->to_array, [1, 2, 2, 1],
166 'right result';
167
168# TO_JSON
169is encode_json(c(1, 2, 3)), '[1,2,3]', 'right result';
170
171done_testing();