1use strict;
2use warnings;
3use Test2::Tools::Tiny;
4
5{
6    package Foo::Bar;
7
8    use Test2::Util::ExternalMeta;
9    use Test2::Util::HashBase qw/foo bar/;
10}
11
12ok(Foo::Bar->can($_), "Imported '$_'") for qw/meta get_meta set_meta delete_meta/;
13
14my $one = Foo::Bar->new(foo => 1, bar => 2);
15ok($one->isa('Foo::Bar'), "Got instance");
16
17is_deeply($one, {foo => 1, bar => 2}, "nothing fishy.. yet");
18
19is($one->get_meta('foo'), undef, "no meta-data for foo");
20is($one->get_meta('bar'), undef, "no meta-data for bar");
21is($one->get_meta('baz'), undef, "no meta-data for baz");
22
23is($one->meta('foo'), undef, "no meta-data for foo");
24is($one->meta('bar'), undef, "no meta-data for bar");
25is($one->meta('baz'), undef, "no meta-data for baz");
26
27is_deeply($one, {foo => 1, bar => 2}, "Still have not modified instance");
28
29$one->set_meta('foo' => 123);
30is($one->foo, 1, "did not change attribute");
31is($one->meta('foo'), 123, "get meta-data for foo");
32is($one->get_meta('foo'), 123, "get meta-data for foo again");
33
34$one->meta('foo', 345);
35is($one->foo, 1, "did not change attribute");
36is($one->meta('foo', 678), 123, "did not alter already set meta-attribute");
37is($one->get_meta('foo'), 123, "still did not alter already set meta-attribute");
38
39is($one->meta('bar', 789), 789, "used default for bar");
40is($one->bar, 2, "did not change attribute");
41
42is_deeply(
43    $one,
44    {
45        foo => 1,
46        bar => 2,
47        Test2::Util::ExternalMeta::META_KEY() => {
48            foo => 123,
49            bar => 789,
50        },
51    },
52    "Stored meta-data"
53);
54
55is($one->delete_meta('foo'), 123, "got old value on delete");
56is($one->meta('foo'), undef, "no more value");
57
58is_deeply(
59    $one,
60    {
61        foo => 1,
62        bar => 2,
63        Test2::Util::ExternalMeta::META_KEY() => {
64            bar => 789,
65        },
66    },
67    "Deleted the meta key"
68);
69
70done_testing;
71