use strict;
use warnings;

use Test::More;
use Test::Warnings;

use Data::DynamicValidator qw/validator/;

subtest 'no-rebase-on-empty-path' => sub {
    my $rebase_rule_called = 0;
    my $errors = validator({})->rebase('/a' => sub {
        $rebase_rule_called = 1;
    })->errors;
    is_deeply $errors, [], "no errors";
    is $rebase_rule_called, 0, "no rebase rule has been called";
};

subtest 'rebase-simple' => sub {
    my $data = [
        {
            a => {
                b => [1],
                c => {
                    dd => { v1 => 2 },
                    ee => [ 3, 4 ],
                }
            },
        },
        {
            zz => [6],
        }
    ];
    my @visited_bases;
    my $errors = validator($data)->rebase('/*/*[key eq "a"]' => sub {
        my $v = shift;
        push @visited_bases, $v->current_base;
        $v->(
            on      => '/b/0',
            should  => sub {
                push @visited_bases, "/0/a/b/0";
                $_[0] == 1;
            },
            because => '...r1...',
        );
        $v->rebase('/c' => sub {
            my $v = shift;
            push @visited_bases, $v->current_base;
            $v->(
                on      => '/dd/v1',
                should  => sub {
                    push @visited_bases, "/0/a/c/dd/v1";
                    $_[0] == 2;
                },
                because => '...r2...',
            )->(
                on      => '/ee/*',
                should  => sub {
                    push @visited_bases, "/0/a/c/ee";
                    @_ == 2 && $_[0] == 3 && $_[1] == 4;
                },
                because => '...r3..',
            )->(
                on      => '//1/zz/*',
                should  => sub {
                    push @visited_bases, "/1/zz/1";
                    $_[0] == 6;
                },
                because => '...r5...',
            );
        });
    })->(
        on      => '/1/zz/*',
        should  => sub {
            push @visited_bases, "/1/zz/1";
            $_[0] == 6;
        },
        because => '...r4...',
    )->errors;
    is_deeply $errors, [], "no errors";

    # we have hash, so, walking order can be undertermined
    @visited_bases = sort @visited_bases;
    is_deeply \@visited_bases, [
        "/0/a",
        "/0/a/b/0",
        "/0/a/c",
        "/0/a/c/dd/v1",
        "/0/a/c/ee",
        "/1/zz/1",
        "/1/zz/1",
    ], "visited routes with rebasing are correct";
};

done_testing;