The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

use Test::More tests => 15;
BEGIN {
    use lib qw(lib);
    use_ok('Data::Path')
};


my $hash=
    { scalar => 'scalar_value'
    , array  =>
        [ qw( array_value0 array_value1 array_value2 array_value3)
        ]
    , hash   =>
        {  hash1 => 'hash_value1'
        ,  hash2 => 'hash_value2'
        }
    , complex =>
        { level2 =>
            [ { level3_0 =>
                [ 'level4_0'
                , { level4_1 => { level5 => 'huhu' }
                  }
				, 'level4_2'
                ]
              }
            ]
        }

    };

my $a=Data::Path->new($hash);

ok ( $a );

my $v='';

$v=$a->get('/scalar');
ok ( $v eq 'scalar_value' , " value=$v");

$v=$a->get('/array[0]');
ok ( $v eq 'array_value0' , " value=$v");

$v=$a->get('/hash/hash1');
ok ( $v eq 'hash_value1'  , " value=$v");

$v=$a->get('/complex/level2[0]/level3_0[0]');
ok ( $v eq 'level4_0'     , " value=$v");

$v=$a->get('/complex/level2[0]/level3_0[2]');
ok ( $v eq 'level4_2'     , " value=$v");

$v=$a->get('/complex/level2[0]/level3_0[1]/level4_1/level5');
ok ( $v eq 'huhu' ," value=$v");

eval {
	$a->get('/complex/level2[99]/level3_0[1]/level4_1/level5');
};
ok ( $@ =~/does not exists/  ," check error_msg = $@");

eval {
	$a->get('/complex/level2[0]/level3_1[1]/level4_1/level5');
};
ok ( $@ =~/does not exists/  ," check error_msg = $@");

$v=$a->get('/complex/level2[0]/level3_0[1]/level4_1/level5_not_exists') || 'UNDEF';
ok ( $v eq 'UNDEF' ," value=$v");

$v=$a->get('/complex/level2[0]/level3_0[99]') || 'UNDEF';
ok ( $v eq 'UNDEF' ," value=$v");

$v=$a->get('/complex/level2[0]/level3_0[2]') || 'UNDEF';
ok ( $v eq 'level4_2' ," value=$v");


my $b=Data::Path->new($hash,
	{ 'key_does_not_exist'=>sub{ die 'callback_error_key' } 
	, 'index_does_not_exist'=>sub{ die 'callback_error_index' } 
	} );
eval {
	$b->get('/complex/home/');
};
ok ( $@ =~/callback_error_key/  ," check error_msg = $@");

eval {
	$b->get('/complex/level2[99]/level3_0');
};
ok ( $@ =~/callback_error_index/  ," check error_msg = $@");