1# -*- Mode: CPerl -*-
2
3use strict;
4use warnings;
5
6use Test::More 'no_plan';
7
8use Hash::MultiKey;
9
10tie my (%hmk), 'Hash::MultiKey';
11
12my @mk = (["foo"],
13          ["foo", "bar", "baz"],
14          ["foo", "bar", "baz", "zoo"],
15          ["goo"],
16          ["goo", "car", "caz"],
17          ["goo", "car", "caz", "aoo"],);
18
19my @v = (undef,
20         1,
21         'string',
22         ['array', 'ref'],
23         {hash => 'ref', with => 'three', keys => undef},
24         \7,);
25
26# initialize %hmk
27$hmk{[join $;, @{$mk[$_]}]} = $v[$_] foreach 0..$#mk;
28
29# values must be returned in the same order as keys reports their
30# corresponding keys
31my @v_in_keys_order = ();
32push @v_in_keys_order, $hmk{$_} foreach keys %hmk;
33is_deeply([values %hmk], \@v_in_keys_order, "values - all");
34
35# aliased values?
36$_ = 1 foreach values %hmk;
37is($_, 1, 'aliased value') foreach values %hmk;
38
39foreach my $v (values %hmk) {
40    $v =~ s/1/2/g;
41}
42is($_, 2, 'aliased value (2)') foreach values %hmk;
43
44# initialize %hmk again
45$hmk{[join $;, @{$mk[$_]}]} = $v[$_] foreach 0..$#mk;
46
47foreach my $i (0..$#mk) {
48    delete $hmk{[join $;, @{$mk[$i]}]};
49    @v_in_keys_order = ();
50    push @v_in_keys_order, $hmk{$_} foreach keys %hmk;
51    is_deeply([values %hmk], \@v_in_keys_order, 'values - all');
52}
53