1# -*- Mode: CPerl -*-
2
3use strict;
4use warnings;
5
6use Test::More 'no_plan';
7
8use Data::Dumper;
9
10use Hash::MultiKey;
11
12tie my (%hmk), 'Hash::MultiKey';
13
14my @mk = (["foo"],
15          ["foo", "bar", "baz"],
16          ["foo", "bar", "baz", "zoo"],
17          ["goo"],
18          ["goo", "car", "caz"],
19          ["goo", "car", "caz", "aoo"],
20          ["branch", "with", "no", "bifur$;ations"],);
21
22my @v = (undef,
23         1,
24         'string',
25         ['array', 'ref'],
26         {hash => 'ref', with => 'three', keys => undef},
27         \7,
28         undef,);
29
30# initialize %hmk
31$hmk{$mk[$_]} = $v[$_] foreach 0..$#mk;
32
33# each in list context
34while (my ($mk, $v) = each %hmk) {
35    is_deeply($hmk{$mk}, $v, "each all: list context");
36}
37
38# each in scalar context
39my $i = 0;
40while (my $mk = each %hmk) {
41    ++$i;
42    ok(exists $hmk{$mk}, 'each all: scalar context');
43}
44is(scalar(keys %hmk), $i, 'each all: number of iterations');
45
46foreach (0..$#mk) {
47    delete $hmk{$mk[$_]};
48    while (my ($mk, $v) = each %hmk) {
49        is_deeply($hmk{$mk}, $v, "each $i: @$mk");
50    }
51}
52
53# initialize %hmk again
54$hmk{$mk[$_]} = $v[$_] foreach 0..$#mk;
55
56# deletion of the last element must be safe
57while (my ($mk, $v) = each %hmk) {
58    is_deeply(delete $hmk{$mk}, $v, 'deletion in each');
59}
60