1use Test::More 'no_plan'; 2 3my %hash = ( 4 top_1 => 'def val top 1', 5 top_2 => 'def val top 2', 6 top_3 => 'def val top 3', 7 8 Classname_1 => { 9 top_2 => 'class 1 val top 2', 10 }, 11 12 Classname_2 => { 13 top_1 => 'class 2 val top 1', 14 top_2 => 'class 2 val top 2', 15 top_3 => 'class 2 val top 3', 16 }, 17 18 Bad => 'class', 19); 20 21my %orig_hash = %hash; 22 23my %expect_1 = ( 24 top_1 => 'def val top 1', 25 top_2 => 'class 1 val top 2', 26 top_3 => 'def val top 3', 27 28 Classname_1 => { 29 top_2 => 'class 1 val top 2', 30 }, 31 32 Classname_2 => { 33 top_1 => 'class 2 val top 1', 34 top_2 => 'class 2 val top 2', 35 top_3 => 'class 2 val top 3', 36 }, 37 38 Bad => 'class', 39); 40 41my %expect_2 = ( 42 top_1 => 'class 2 val top 1', 43 top_2 => 'class 2 val top 2', 44 top_3 => 'class 2 val top 3', 45 46 Classname_1 => { 47 top_2 => 'class 1 val top 2', 48 }, 49 50 Classname_2 => { 51 top_1 => 'class 2 val top 1', 52 top_2 => 'class 2 val top 2', 53 top_3 => 'class 2 val top 3', 54 }, 55 56 Bad => 'class', 57); 58 59package Classname_1; 60use Class::Std::Utils; 61 62my %args1 = extract_initializers_from(\%hash); 63 64::is_deeply \%hash, \%orig_hash => 'Original args unchanged in class 1'; 65::is_deeply \%args1, \%expect_1 => 'Extracted as expected in class 1'; 66 67 68package Classname_2; 69use Class::Std::Utils; 70 71my %args2 = extract_initializers_from(\%hash); 72 73::is_deeply \%hash, \%orig_hash => 'Original args unchanged in class 2'; 74::is_deeply \%args2, \%expect_2 => 'Extracted as expected in class 2'; 75 76package Classname_3; 77use Class::Std::Utils; 78 79my %args3 = extract_initializers_from(\%hash); 80 81::is_deeply \%hash, \%orig_hash => 'Original args unchanged in class 2'; 82::is_deeply \%args3, \%hash => 'Extracted as expected in class 3'; 83 84 85package Bad; 86use Class::Std::Utils; 87 88::ok !eval { extract_initializers_from(\%hash); 1 } 89 => 'Exception for bad specification'; 90 91::like $@, qr/^Bad initializer must be a nested hash/ 92 => 'Correct exception thrown'; 93 94