xref: /openbsd-src/gnu/usr.bin/perl/t/op/each_array.t (revision 9f11ffb7133c203312a01e4b986886bc88c7d74b)
1b39c5158Smillert#!./perl
2b39c5158Smillert
3b39c5158SmillertBEGIN {
4b39c5158Smillert    chdir 't' if -d 't';
5b39c5158Smillert    require './test.pl';
6*9f11ffb7Safresh1    set_up_inc('../lib');
7b39c5158Smillert}
8b39c5158Smillertuse strict;
9b39c5158Smillertuse warnings;
10*9f11ffb7Safresh1our (@array, @r, $k, $v, $c);
11b39c5158Smillert
12b8851fccSafresh1plan tests => 65;
13b39c5158Smillert
14b39c5158Smillert@array = qw(crunch zam bloop);
15b39c5158Smillert
16b39c5158Smillert(@r) = each @array;
1791f110e0Safresh1is (scalar @r, 2, "'each' on array returns index and value of next element");
1891f110e0Safresh1is ($r[0], 0, "got expected index");
1991f110e0Safresh1is ($r[1], 'crunch', "got expected value");
20b39c5158Smillert($k, $v) = each @array;
2191f110e0Safresh1is ($k, 1, "got expected index of next element");
2291f110e0Safresh1is ($v, 'zam', "got expected value of next element");
23b39c5158Smillert($k, $v) = each @array;
2491f110e0Safresh1is ($k, 2, "got expected index of remaining element");
2591f110e0Safresh1is ($v, 'bloop', "got expected value of remaining element");
26b39c5158Smillert(@r) = each @array;
2791f110e0Safresh1is (scalar @r, 0,
2891f110e0Safresh1    "no elements remaining to be iterated over in original array");
29b39c5158Smillert
30b39c5158Smillert(@r) = each @array;
3191f110e0Safresh1is (scalar @r, 2, "start second iteration over original array");
3291f110e0Safresh1is ($r[0], 0, "got expected index");
3391f110e0Safresh1is ($r[1], 'crunch', "got expected value");
34b39c5158Smillert($k) = each @array;
3591f110e0Safresh1is ($k, 1, "got index when only index was assigned to variable");
36b39c5158Smillert
37898184e3Ssthenmy @lex_array = qw(PLOP SKLIZZORCH RATTLE);
38b39c5158Smillert
39b39c5158Smillert(@r) = each @lex_array;
4091f110e0Safresh1is (scalar @r, 2, "'each' on array returns index and value of next element");
4191f110e0Safresh1is ($r[0], 0, "got expected index");
4291f110e0Safresh1is ($r[1], 'PLOP', "got expected value");
43b39c5158Smillert($k, $v) = each @lex_array;
4491f110e0Safresh1is ($k, 1, "got expected index of next element");
4591f110e0Safresh1is ($v, 'SKLIZZORCH', "got expected value of next element");
46b39c5158Smillert($k) = each @lex_array;
4791f110e0Safresh1is ($k, 2, "got expected index of remaining element");
48b39c5158Smillert(@r) = each @lex_array;
4991f110e0Safresh1is (scalar @r, 0,
5091f110e0Safresh1    "no elements remaining to be iterated over in original array");
51b39c5158Smillert
52b39c5158Smillertmy $ar = ['bacon'];
53b39c5158Smillert
54b39c5158Smillert(@r) = each @$ar;
5591f110e0Safresh1is (scalar @r, 2,
5691f110e0Safresh1    "'each' on array inside reference returns index and value of next element");
5791f110e0Safresh1is ($r[0], 0, "got expected index");
5891f110e0Safresh1is ($r[1], 'bacon', "got expected value of array element inside reference");
59b39c5158Smillert
60b39c5158Smillert(@r) = each @$ar;
6191f110e0Safresh1is (scalar @r, 0,
6291f110e0Safresh1    "no elements remaining to be iterated over in array inside reference");
63b39c5158Smillert
6491f110e0Safresh1is (each @$ar, 0, "scalar context 'each' on array returns expected index");
6591f110e0Safresh1is (scalar each @$ar, undef,
6691f110e0Safresh1    "no elements remaining to be iterated over; array reference case");
67b39c5158Smillert
68b39c5158Smillertmy @keys;
69b39c5158Smillert@keys = keys @array;
7091f110e0Safresh1is ("@keys", "0 1 2",
7191f110e0Safresh1    "'keys' on array in list context returns list of indices");
72b39c5158Smillert
73b39c5158Smillert@keys = keys @lex_array;
7491f110e0Safresh1is ("@keys", "0 1 2",
7591f110e0Safresh1    "'keys' on another array in list context returns list of indices");
76b39c5158Smillert
77b39c5158Smillert($k, $v) = each @array;
7891f110e0Safresh1is ($k, 0, "got expected index");
7991f110e0Safresh1is ($v, 'crunch', "got expected value");
80b39c5158Smillert
81b39c5158Smillert@keys = keys @array;
8291f110e0Safresh1is ("@keys", "0 1 2",
8391f110e0Safresh1    "'keys' on array in list context returns list of indices");
84b39c5158Smillert
85b39c5158Smillert($k, $v) = each @array;
8691f110e0Safresh1is ($k, 0, "following 'keys', got expected index");
8791f110e0Safresh1is ($v, 'crunch', "following 'keys', got expected value");
88b39c5158Smillert
89b39c5158Smillert
90b39c5158Smillert
91b39c5158Smillertmy @values;
92b39c5158Smillert@values = values @array;
9391f110e0Safresh1is ("@values", "@array",
9491f110e0Safresh1    "'values' on array returns list of values");
95b39c5158Smillert
96b39c5158Smillert@values = values @lex_array;
9791f110e0Safresh1is ("@values", "@lex_array",
9891f110e0Safresh1    "'values' on another array returns list of values");
99b39c5158Smillert
100898184e3Ssthen($k, $v) = each @array;
10191f110e0Safresh1is ($k, 0, "following 'values', got expected index");
10291f110e0Safresh1is ($v, 'crunch', "following 'values', got expected index");
103b39c5158Smillert
104b39c5158Smillert@values = values @array;
10591f110e0Safresh1is ("@values", "@array",
10691f110e0Safresh1    "following 'values' and 'each', 'values' continues to return expected list of values");
107b39c5158Smillert
108898184e3Ssthen($k, $v) = each @array;
10991f110e0Safresh1is ($k, 0,
11091f110e0Safresh1    "following 'values', 'each' and 'values', 'each' continues to return expected index");
11191f110e0Safresh1is ($v, 'crunch',
11291f110e0Safresh1    "following 'values', 'each' and 'values', 'each' continues to return expected value");
113898184e3Ssthen
114898184e3Ssthen# reset
115898184e3Ssthenwhile (each @array) { }
116898184e3Ssthen
117898184e3Ssthen# each(ARRAY) in the conditional loop
118898184e3Ssthen$c = 0;
119898184e3Ssthenwhile (($k, $v) = each @array) {
12091f110e0Safresh1    is ($k, $c, "'each' on array in loop returns expected index '$c'");
12191f110e0Safresh1    is ($v, $array[$k],
12291f110e0Safresh1        "'each' on array in loop returns expected value '$array[$k]'");
123898184e3Ssthen    $c++;
124b39c5158Smillert}
125b39c5158Smillert
126898184e3Ssthen# each(ARRAY) on scalar context in conditional loop
127898184e3Ssthen# should guarantee to be wrapped into defined() function.
128898184e3Ssthen# first return value will be 0 --> [#90888]
129898184e3Ssthen$c = 0;
130898184e3Ssthen$k = 0;
131898184e3Ssthen$v = 0;
132898184e3Ssthenwhile ($k = each @array) {
13391f110e0Safresh1    is ($k, $v,
13491f110e0Safresh1        "'each' on array in scalar context in loop returns expected index '$v'");
135898184e3Ssthen    $v++;
136898184e3Ssthen}
137b39c5158Smillert
138898184e3Ssthen# each(ARRAY) in the conditional loop
139898184e3Ssthen$c = 0;
140898184e3Ssthenfor (; ($k, $v) = each @array ;) {
14191f110e0Safresh1    is ($k, $c,
14291f110e0Safresh1        "'each' on array in list context in loop returns expected index '$c'");
14391f110e0Safresh1    is ($v, $array[$k],
14491f110e0Safresh1        "'each' on array in list context in loop returns expected value '$array[$k]'");
145898184e3Ssthen    $c++;
146898184e3Ssthen}
147b39c5158Smillert
148898184e3Ssthen# each(ARRAY) on scalar context in conditional loop
149898184e3Ssthen# --> [#90888]
150898184e3Ssthen$c = 0;
151898184e3Ssthen$k = 0;
152898184e3Ssthen$v = 0;
153898184e3Ssthenfor (; $k = each(@array) ;) {
15491f110e0Safresh1    is ($k, $v,
15591f110e0Safresh1        "'each' on array in scalar context in loop returns expected index '$v'");
156898184e3Ssthen    $v++;
157898184e3Ssthen}
15891f110e0Safresh1
15991f110e0Safresh1# Reset the iterator when the array is cleared [RT #75596]
16091f110e0Safresh1{
16191f110e0Safresh1    my @a = 'a' .. 'c';
16291f110e0Safresh1    my ($i, $v) = each @a;
16391f110e0Safresh1    is ("$i-$v", '0-a', "got expected index and value");
16491f110e0Safresh1    @a = 'A' .. 'C';
16591f110e0Safresh1    ($i, $v) = each @a;
16691f110e0Safresh1    is ("$i-$v", '0-A',
16791f110e0Safresh1        "got expected new index and value after array gets new content");
16891f110e0Safresh1}
16991f110e0Safresh1
17091f110e0Safresh1# Check that the iterator is reset when localization ends
17191f110e0Safresh1{
17291f110e0Safresh1    @array = 'a' .. 'c';
17391f110e0Safresh1    my ($i, $v) = each @array;
17491f110e0Safresh1    is ("$i-$v", '0-a', "got expected index and value");
17591f110e0Safresh1    {
17691f110e0Safresh1        local @array = 'A' .. 'C';
17791f110e0Safresh1        my ($i, $v) = each @array;
17891f110e0Safresh1        is ("$i-$v", '0-A',
17991f110e0Safresh1            "got expected new index and value after array is localized and gets new content");
18091f110e0Safresh1        ($i, $v) = each @array;
18191f110e0Safresh1        is ("$i-$v", '1-B',
18291f110e0Safresh1            "got expected next index and value after array is localized and gets new content");
18391f110e0Safresh1    }
18491f110e0Safresh1    ($i, $v) = each @array;
18591f110e0Safresh1    is ("$i-$v", '1-b',
18691f110e0Safresh1         "got expected next index and value upon return to pre-localized array");
18791f110e0Safresh1    # Explicit reset
18891f110e0Safresh1    while (each @array) { }
18991f110e0Safresh1}
190b8851fccSafresh1
191b8851fccSafresh1my $a = 7;
192b8851fccSafresh1*a = sub  { \@_ }->($a);
193b8851fccSafresh1($a, $b) = each our @a;
194b8851fccSafresh1is "$a $b", "0 7", 'each in list assignment';
195b8851fccSafresh1$a = 7;
196b8851fccSafresh1($a, $b) = (3, values @a);
197b8851fccSafresh1is "$a $b", "3 7", 'values in list assignment';
198