1use Test2::Bundle::Extended -target => 'Test2::Compare::Meta';
2
3local *convert = Test2::Compare->can('strict_convert');
4
5subtest simple => sub {
6    my $one = $CLASS->new();
7    isa_ok($one, $CLASS, 'Test2::Compare::Base');
8    is($one->items, [], "generated an empty items array");
9    is($one->name, '<META CHECKS>', "sane name");
10    is($one->verify(exists => 0), 0, "Does not verify for non-existent values");
11    is($one->verify(exists => 1), 1, "always verifies for existing values");
12    ok(defined $CLASS->new(items => []), "Can provide items");
13};
14
15subtest add_prop => sub {
16    my $one = $CLASS->new();
17
18    like(
19        dies { $one->add_prop(undef, convert(1)) },
20        qr/prop name is required/,
21        "property name is required"
22    );
23
24    like(
25        dies { $one->add_prop('fake' => convert(1)) },
26        qr/'fake' is not a known property/,
27        "Must use valid property"
28    );
29
30    like(
31        dies { $one->add_prop('blessed') },
32        qr/check is required/,
33        "Must use valid property"
34    );
35
36    ok($one->add_prop('blessed' => convert('xxx')), "normal");
37};
38
39{
40    package FooBase;
41
42    package Foo;
43    our @ISA = 'FooBase';
44}
45
46subtest deltas => sub {
47    my $one = $CLASS->new();
48
49    my $it = bless {a => 1, b => 2, c => 3}, 'Foo';
50
51    $one->add_prop('blessed' => 'Foo');
52    $one->add_prop('reftype' => 'HASH');
53    $one->add_prop('isa' => 'FooBase');
54    $one->add_prop('this' => exact_ref($it));
55    $one->add_prop('size' => 3);
56
57    is(
58        [$one->deltas(got => $it, convert => \&convert, seen => {})],
59        [],
60        "Everything matches"
61    );
62
63    my $not_it = bless ['a'], 'Bar';
64
65    like(
66        [$one->deltas(got => $not_it, convert => \&convert, seen => {})],
67        [
68            { verified => F(), got => 'Bar' },
69            { verified => F(), got => 'ARRAY' },
70            { verified => F(), got => $not_it },
71            { verified => F(), got => $not_it },
72            { verified => F(), got => 1 },
73        ],
74        "Nothing matches"
75    );
76
77    like(
78        [$one->deltas(got => 'a', convert => \&convert, seen => {})],
79        [
80            { verified => F(), got => undef },
81            { verified => F(), got => undef },
82            { verified => F(), got => 'a' },
83            { verified => F(), got => 'a' },
84            { verified => F(), got => undef },
85        ],
86        "Nothing matches, wrong everything"
87    );
88};
89
90done_testing;
91