"Fossies" - the Fresh Open Source Software Archive

Member "RPerl-5.002000/t/06_type_hash.t" (30 Aug 2019, 85546 Bytes) of package /linux/misc/RPerl-5.002000.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Perl source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. See also the last Fossies "Diffs" side-by-side code changes report for "06_type_hash.t": 4.001000_vs_4.002000.

    1 #!/usr/bin/env perl
    2 
    3 # [[[ PRE-HEADER ]]]
    4 # suppress 'WEXRP00: Found multiple rperl executables' due to blib/ & pre-existing installation(s)
    5 BEGIN { $ENV{RPERL_WARNINGS} = 0; }
    6 
    7 # [[[ HEADER ]]]
    8 use strict;
    9 use warnings;
   10 use RPerl::AfterSubclass;
   11 our $VERSION = 0.014_000;
   12 
   13 # [[[ CRITICS ]]]
   14 ## no critic qw(ProhibitUselessNoCritic ProhibitMagicNumbers RequireCheckedSyscalls)  # USER DEFAULT 1: allow numeric values & print operator
   15 ## no critic qw(ProhibitStringySplit ProhibitInterpolationOfLiterals)  # DEVELOPER DEFAULT 2: allow string test values
   16 ## no critic qw(RequireInterpolationOfMetachars)  # USER DEFAULT 2: allow single-quoted control characters & sigils
   17 
   18 # [[[ INCLUDES ]]]
   19 use RPerl::Test;
   20 use Test::More tests => 496;
   21 use Test::Exception;
   22 use Test::Number::Delta;
   23 use RPerl::DataStructure::Hash::SubTypes1D qw(integer_hashref_typetest0 integer_hashref_typetest1 number_hashref_typetest0 number_hashref_typetest1 string_hashref_typetest0 string_hashref_typetest1);
   24 use RPerl::DataStructure::Hash::SubTypes2D qw(integer_arrayref_hashref_typetest0 integer_arrayref_hashref_typetest1 number_arrayref_hashref_typetest0 number_arrayref_hashref_typetest1 string_arrayref_hashref_typetest0 string_arrayref_hashref_typetest1);
   25 
   26 # [[[ OPERATIONS ]]]
   27 
   28 BEGIN {
   29     if ( $ENV{RPERL_VERBOSE} ) {
   30         Test::More::diag('[[[ Beginning Hash Type Pre-Test Loading, RPerl Type System ]]]');
   31     }
   32     lives_and( sub { use_ok('RPerl::AfterSubclass'); }, q{use_ok('RPerl::AfterSubclass') lives} );
   33     lives_and( sub { use_ok('RPerl::DataStructure::Hash_cpp'); }, q{use_ok('RPerl::DataStructure::Hash_cpp') lives} );
   34 }
   35 
   36 # [[[ PRIMARY RUNLOOP ]]]
   37 # [[[ PRIMARY RUNLOOP ]]]
   38 # [[[ PRIMARY RUNLOOP ]]]
   39 
   40 # loop 3 times, once for each mode: PERLOPS_PERLTYPES, PERLOPS_CPPTYPES, CPPOPS_CPPTYPES
   41 foreach my integer $mode_id ( sort keys %{$RPerl::MODES} ) {
   42 #for my $mode_id ( 0 .. 0 ) {  # TMP DEBUG, PERLOPS_PERLTYPES ONLY
   43 #for my $mode_id ( 1 .. 1 ) {  # TMP DEBUG, CPPOPS_PERLTYPES ONLY
   44 #for my $mode_id ( 0 .. 1 ) {  # TMP DEBUG, PERLOPS_PERLTYPES & CPPOPS_PERLTYPES
   45 #for my $mode_id ( 2 .. 2 ) {  # TMP DEBUG, CPPOPS_CPPTYPES ONLY
   46 
   47     # [[[ MODE SETUP ]]]
   48     #    RPerl::diag("in 06_type_hash.t, top of for() loop, have \$mode_id = $mode_id\n");
   49     my scalartype_hashref $mode = $RPerl::MODES->{$mode_id};
   50     my $ops                     = $mode->{ops};
   51     my $types                   = $mode->{types};
   52     my string $mode_tagline     = $ops . 'OPS_' . $types . 'TYPES';
   53     if ( $ENV{RPERL_VERBOSE} ) {
   54         Test::More::diag( '[[[ Beginning RPerl Hash Type Tests, ' . $ops . ' Operations & ' . $types . ' Data Types' . ' ]]]' );
   55     }
   56 
   57     lives_ok( sub { rperltypes::types_enable($types) }, q{mode '} . $ops . ' Operations & ' . $types . ' Data Types' . q{' enabled} );
   58 
   59     if ( $ops eq 'PERL' ) {
   60         lives_and( sub { use_ok('RPerl::DataStructure::Hash'); }, q{use_ok('RPerl::DataStructure::Hash') lives} );
   61     }
   62     else {
   63         if ( $types eq 'CPP' ) {
   64 
   65             # force reload
   66             delete $main::{'RPerl__DataStructure__Hash__MODE_ID'};
   67         }
   68 
   69         # C++ use, load, link
   70         lives_and( sub { require_ok('RPerl::DataStructure::Hash_cpp'); }, q{require_ok('RPerl::DataStructure::Hash_cpp') lives} );
   71         lives_ok( sub { RPerl::DataStructure::Hash_cpp::cpp_load(); }, q{RPerl::DataStructure::Hash_cpp::cpp_load() lives} );
   72     }
   73 
   74     foreach my string $type (qw(DataType__Integer DataType__Number DataType__String DataStructure__Hash)) {
   75         lives_and(
   76             sub {
   77                 is( $RPerl::MODES->{ main->can( 'RPerl__' . $type . '__MODE_ID' )->() }->{ops},
   78                     $ops, 'main::RPerl__' . $type . '__MODE_ID() ops returns ' . $ops );
   79             },
   80             'main::RPerl__' . $type . '__MODE_ID() lives'
   81         );
   82         lives_and(
   83             sub {
   84                 is( $RPerl::MODES->{ main->can( 'RPerl__' . $type . '__MODE_ID' )->() }->{types},
   85                     $types, 'main::RPerl__' . $type . '__MODE_ID() types returns ' . $types );
   86             },
   87             'main::RPerl__' . $type . '__MODE_ID() lives'
   88         );
   89     }
   90 
   91     # [[[ INTEGER HASH REF TESTS ]]]
   92     # [[[ INTEGER HASH REF TESTS ]]]
   93     # [[[ INTEGER HASH REF TESTS ]]]
   94 
   95     throws_ok(    # TIVHVRV00
   96         sub { integer_hashref_to_string() },
   97         "/(EIVHVRV00.*$mode_tagline)|(Usage.*integer_hashref_to_string)/",    # DEV NOTE: 2 different error messages, RPerl & C
   98         q{TIVHVRV00 integer_hashref_to_string() throws correct exception}
   99     );
  100     throws_ok(                                                                # TIVHVRV01
  101         sub { integer_hashref_to_string(undef) },
  102         "/EIVHVRV00.*$mode_tagline/",
  103         q{TIVHVRV01 integer_hashref_to_string(undef) throws correct exception}
  104     );
  105     throws_ok(                                                                # TIVHVRV02
  106         sub { integer_hashref_to_string(2) },
  107         "/EIVHVRV01.*$mode_tagline/",
  108         q{TIVHVRV02 integer_hashref_to_string(2) throws correct exception}
  109     );
  110     throws_ok(                                                                # TIVHVRV03
  111         sub { integer_hashref_to_string(2.3) },
  112         "/EIVHVRV01.*$mode_tagline/",
  113         q{TIVHVRV03 integer_hashref_to_string(2.3) throws correct exception}
  114     );
  115     throws_ok(                                                                # TIVHVRV04
  116         sub { integer_hashref_to_string('2') },
  117         "/EIVHVRV01.*$mode_tagline/",
  118         q{TIVHVRV04 integer_hashref_to_string('2') throws correct exception}
  119     );
  120     throws_ok(                                                                # TIVHVRV05
  121         sub { integer_hashref_to_string([ 2 ]) },
  122         "/EIVHVRV01.*$mode_tagline/",
  123         q{TIVHVRV05 integer_hashref_to_string([ 2 ]) throws correct exception}
  124     );
  125     throws_ok(                                                                # TIVHVRV10
  126         sub {
  127             integer_hashref_to_string(
  128                 {   a_key => 2,
  129                     b_key => 2_112,
  130                     c_key => undef,
  131                     d_key => 23,
  132                     e_key => -877,
  133                     f_key => -33,
  134                     g_key => 1_701
  135                 }
  136             );
  137         },
  138         "/EIVHVRV02.*$mode_tagline/",
  139         q{TIVHVRV10 integer_hashref_to_string({ a_key => 2, b_key => 2_112, c_key => undef, d_key => 23, e_key => -877, f_key => -33, g_key => 1_701 }) throws correct exception}
  140     );
  141     throws_ok(    # TIVHVRV11
  142         sub {
  143             integer_hashref_to_string(
  144                 {   a_key => 2,
  145                     b_key => 2_112,
  146                     c_key => 42,
  147                     d_key => 23.3,
  148                     e_key => -877,
  149                     f_key => -33,
  150                     g_key => 1_701
  151                 }
  152             );
  153         },
  154         "/EIVHVRV03.*$mode_tagline/",
  155         q{TIVHVRV11 integer_hashref_to_string({ a_key => 2, b_key => 2_112, c_key => 42, d_key => 23.3, e_key => -877, f_key => -33, g_key => 1_701 }) throws correct exception}
  156     );
  157     throws_ok(    # TIVHVRV12
  158         sub {
  159             integer_hashref_to_string(
  160                 {   a_key => 2,
  161                     b_key => 2_112,
  162                     c_key => 42,
  163                     d_key => '23',
  164                     e_key => -877,
  165                     f_key => -33,
  166                     g_key => 1_701
  167                 }
  168             );
  169         },
  170         "/EIVHVRV03.*$mode_tagline/",
  171         q{TIVHVRV12 integer_hashref_to_string({ a_key => 2, b_key => 2_112, c_key => 42, d_key => '23', e_key => -877, f_key => -33, g_key => 1_701 }) throws correct exception}
  172     );
  173     throws_ok(    # TIVHVRV13
  174         sub {
  175             integer_hashref_to_string(
  176                 {   a_key => 2,
  177                     b_key => 2_112,
  178                     c_key => 42,
  179                     d_key => [ 23 ],
  180                     e_key => -877,
  181                     f_key => -33,
  182                     g_key => 1_701
  183                 }
  184             );
  185         },
  186         "/EIVHVRV03.*$mode_tagline/",
  187         q{TIVHVRV13 integer_hashref_to_string({ a_key => 2, b_key => 2_112, c_key => 42, d_key => [ 23 ], e_key => -877, f_key => -33, g_key => 1_701 }) throws correct exception}
  188     );
  189     throws_ok(    # TIVHVRV14
  190         sub {
  191             integer_hashref_to_string(
  192                 {   a_key => 2,
  193                     b_key => 2_112,
  194                     c_key => 42,
  195                     d_key => { a_subkey => 23 },
  196                     e_key => -877,
  197                     f_key => -33,
  198                     g_key => 1_701
  199                 }
  200             );
  201         },
  202         "/EIVHVRV03.*$mode_tagline/",
  203 #        q{TIVHVRV14 integer_hashref_to_string({ a_key => 2, b_key => 2_112, c_key => 42, d_key => {a_subkey => 23}, e_key => -877, f_key => -33, g_key => 1_701 }) throws correct exception}
  204         q{TIVHVRV14 integer_hashref_to_string({ a_key => 2, b_key => 2_112, c_key => 42, d_key => {a_subkey => 23}, ..., g_key => 1_701 }) throws correct exception}
  205     );
  206     lives_and(    # TIVHVRV20
  207         sub {
  208             is( integer_hashref_to_string( { a_key => 23 } ), q{{ 'a_key' => 23 }}, q{TIVHVRV20 integer_hashref_to_string({ a_key => 23 }) returns correct value} );
  209         },
  210         q{TIVHVRV20 integer_hashref_to_string({ a_key => 23 }) lives}
  211     );
  212     lives_and(    # TIVHVRV21
  213         sub {
  214             like(
  215                 integer_hashref_to_string(
  216                     {   a_key => 2,
  217                         b_key => 2_112,
  218                         c_key => 42,
  219                         d_key => 23,
  220                         e_key => -877,
  221                         f_key => -33,
  222                         g_key => 1_701
  223                     }
  224                 ),
  225 
  226              # NEED FIX: replace ".*" near end of this & following regexes with syntax to match exactly 6 occurrences of ", "; (,\s)* and variations don't work?
  227                 q{/^\\\{\s(?=.*'a_key' => 2\b)(?=.*'b_key' => 2_112\b)(?=.*'c_key' => 42\b)(?=.*'d_key' => 23\b)(?=.*'e_key' => -877\b)(?=.*'f_key' => -33\b)(?=.*'g_key' => 1_701\b).*\s\}$/m},
  228                 q{TIVHVRV21 integer_hashref_to_string({ a_key => 2, b_key => 2_112, c_key => 42, d_key => 23, e_key => -877, f_key => -33, g_key => 1_701 }) returns correct value}
  229             );
  230         },
  231         q{TIVHVRV21 integer_hashref_to_string({ a_key => 2, b_key => 2_112, c_key => 42, d_key => 23, e_key => -877, f_key => -33, g_key => 1_701 }) lives}
  232     );
  233     throws_ok(    # TIVHVRV30
  234         sub { integer_hashref_typetest0() },
  235         "/(EIVHVRV00.*$mode_tagline)|(Usage.*integer_hashref_typetest0)/",    # DEV NOTE: 2 different error messages, RPerl & C
  236         q{TIVHVRV30 integer_hashref_typetest0() throws correct exception}
  237     );
  238     throws_ok(                                                                 # TIVHVRV31
  239         sub { integer_hashref_typetest0(2) },
  240         "/EIVHVRV01.*$mode_tagline/",
  241         q{TIVHVRV31 integer_hashref_typetest0(2) throws correct exception}
  242     );
  243     throws_ok(                                                                 # TIVHVRV32
  244         sub {
  245             integer_hashref_typetest0(
  246                 {   'binary'       => 2,
  247                     'rush'         => 2_112,
  248                     'ERROR_FUNKEY' => undef,
  249                     'answer'       => 42,
  250                     'fnord'        => 23,
  251                     'units'        => -877,
  252                     'degree'       => -33,
  253                     'ncc'          => 1_701
  254                 }
  255             );
  256         },
  257         "/EIVHVRV02.*$mode_tagline/",
  258         q{TIVHVRV32 integer_hashref_typetest0({ 'binary' => 2, 'rush' => 2_112, 'ERROR_FUNKEY' => undef, ..., 'ncc' => 1_701 }) throws correct exception}
  259     );
  260     throws_ok(    # TIVHVRV33
  261         sub {
  262             integer_hashref_typetest0(
  263                 {   'binary'       => 2,
  264                     'rush'         => 2_112,
  265                     'ERROR_FUNKEY' => 'abcdefg',
  266                     'answer'       => 42,
  267                     'fnord'        => 23,
  268                     'units'        => -877,
  269                     'degree'       => -33,
  270                     'ncc'          => 1_701
  271                 }
  272             );
  273         },
  274         "/EIVHVRV03.*$mode_tagline/",
  275         q{TIVHVRV33 integer_hashref_typetest0({ 'binary' => 2, 'rush' => 2_112, 'ERROR_FUNKEY' => 'abcdefg', ..., 'ncc' => 1_701 }) throws correct exception}
  276     );
  277     lives_and(    # TIVHVRV34
  278         sub {
  279             like(
  280                 integer_hashref_typetest0(
  281                     {   'binary' => 2,
  282                         'rush'   => 2_112,
  283                         'answer' => 42,
  284                         'fnord'  => 23,
  285                         'units'  => -877,
  286                         'degree' => -33,
  287                         'ncc'    => 1_701
  288                     }
  289                 ),
  290                 q{/^\\\{\s(?=.*'binary' => 2\b)(?=.*'rush' => 2_112\b)(?=.*'answer' => 42\b)(?=.*'fnord' => 23\b)(?=.*'units' => -877\b)(?=.*'degree' => -33\b)(?=.*'ncc' => 1_701\b).*\s\}}
  291                     . $mode_tagline . q{$/m},
  292 
  293 #                q{TIVHVRV34 integer_hashref_typetest0({ 'binary' => 2, 'rush' => 2_112, 'answer' => 42, 'fnord' => 23, 'units' => -877, 'degree' => -33, 'ncc' => 1_701 }) returns correct value}
  294                 q{TIVHVRV34 integer_hashref_typetest0({ 'binary' => 2, 'rush' => 2_112, ..., 'ncc' => 1_701 }) returns correct value}
  295             );
  296         },
  297         q{TIVHVRV34 integer_hashref_typetest0({ 'binary' => 2, 'rush' => 2_112, ..., 'ncc' => 1_701 }) lives}
  298     );
  299     lives_and(    # TIVHVRV40
  300         sub {
  301             is_deeply(
  302                 integer_hashref_typetest1(5),
  303                 {   "$mode_tagline\_funkey2" => 10,
  304                     "$mode_tagline\_funkey3" => 15,
  305                     "$mode_tagline\_funkey4" => 20,
  306                     "$mode_tagline\_funkey1" => 5,
  307                     "$mode_tagline\_funkey0" => 0
  308                 },
  309                 q{TIVHVRV40 integer_hashref_typetest1(5) returns correct value}
  310             );
  311         },
  312         q{TIVHVRV40 integer_hashref_typetest1(5) lives}
  313     );
  314 
  315     # [[[ NUMBER HASH REF TESTS ]]]
  316     # [[[ NUMBER HASH REF TESTS ]]]
  317     # [[[ NUMBER HASH REF TESTS ]]]
  318 
  319     throws_ok(    # TNVHVRV00
  320         sub { number_hashref_to_string() },
  321         "/(ENVHVRV00.*$mode_tagline)|(Usage.*number_hashref_to_string)/",    # DEV NOTE: 2 different error messages, RPerl & C
  322         q{TNVHVRV00 number_hashref_to_string() throws correct exception}
  323     );
  324     throws_ok(                                                               # TNVHVRV01
  325         sub { number_hashref_to_string(undef) },
  326         "/ENVHVRV00.*$mode_tagline/",
  327         q{TNVHVRV01 number_hashref_to_string(undef) throws correct exception}
  328     );
  329     throws_ok(                                                               # TNVHVRV02
  330         sub { number_hashref_to_string(2) },
  331         "/ENVHVRV01.*$mode_tagline/",
  332         q{TNVHVRV02 number_hashref_to_string(2) throws correct exception}
  333     );
  334     throws_ok(                                                               # TNVHVRV03
  335         sub { number_hashref_to_string(2.3) },
  336         "/ENVHVRV01.*$mode_tagline/",
  337         q{TNVHVRV03 number_hashref_to_string(2.3) throws correct exception}
  338     );
  339     throws_ok(                                                               # TNVHVRV04
  340         sub { number_hashref_to_string('2') },
  341         "/ENVHVRV01.*$mode_tagline/",
  342         q{TNVHVRV04 number_hashref_to_string('2') throws correct exception}
  343     );
  344     throws_ok(                                                               # TNVHVRV05
  345         sub { number_hashref_to_string([ 2 ]) },
  346         "/ENVHVRV01.*$mode_tagline/",
  347         q{TNVHVRV05 number_hashref_to_string([ 2 ]) throws correct exception}
  348     );
  349     throws_ok(                                                               # TNVHVRV10
  350         sub {
  351             number_hashref_to_string(
  352                 {   a_key => 2,
  353                     b_key => 2_112,
  354                     c_key => undef,
  355                     d_key => 23,
  356                     e_key => -877,
  357                     f_key => -33,
  358                     g_key => 1_701
  359                 }
  360             );
  361         },
  362         "/ENVHVRV02.*$mode_tagline/",
  363         q{TNVHVRV10 number_hashref_to_string({ a_key => 2, b_key => 2_112, c_key => undef, d_key => 23, e_key => -877, f_key => -33, g_key => 1_701 }) throws correct exception}
  364     );
  365     throws_ok(    # TNVHVRV11
  366         sub {
  367             number_hashref_to_string(
  368                 {   a_key => 2,
  369                     b_key => 2_112,
  370                     c_key => 42.3,
  371                     d_key => '23',
  372                     e_key => -877,
  373                     f_key => -33,
  374                     g_key => 1_701
  375                 }
  376             );
  377         },
  378         "/ENVHVRV03.*$mode_tagline/",
  379         q{TNVHVRV11 number_hashref_to_string({ a_key => 2, b_key => 2_112, c_key => 42.3, d_key => '23', e_key => -877, f_key => -33, g_key => 1_701 }) throws correct exception}
  380     );
  381     throws_ok(    # TNVHVRV12
  382         sub {
  383             number_hashref_to_string(
  384                 {   a_key => 2,
  385                     b_key => 2_112,
  386                     c_key => 42.3,
  387                     d_key => [ 23 ],
  388                     e_key => -877,
  389                     f_key => -33,
  390                     g_key => 1_701
  391                 }
  392             );
  393         },
  394         "/ENVHVRV03.*$mode_tagline/",
  395         q{TNVHVRV12 number_hashref_to_string({ a_key => 2, b_key => 2_112, c_key => 42.3, d_key => [ 23 ], e_key => -877, f_key => -33, g_key => 1_701 }) throws correct exception}
  396     );
  397     throws_ok(    # TNVHVRV13
  398         sub {
  399             number_hashref_to_string(
  400                 {   a_key => 2,
  401                     b_key => 2_112,
  402                     c_key => 42.3,
  403                     d_key => { a_subkey => 23 },
  404                     e_key => -877,
  405                     f_key => -33,
  406                     g_key => 1_701
  407                 }
  408             );
  409         },
  410         "/ENVHVRV03.*$mode_tagline/",
  411 
  412 #        q{TNVHVRV13 number_hashref_to_string({ a_key => 2, b_key => 2_112, c_key => 42.3, d_key => {a_subkey => 23}, e_key => -877, f_key => -33, g_key => 1_701 }) throws correct exception}
  413         q{TNVHVRV13 number_hashref_to_string({ a_key => 2, b_key => 2_112, c_key => 42.3, d_key => {a_subkey => 23}, ..., g_key => 1_701 }) throws correct exception}
  414     );
  415     lives_and(    # TNVHVRV20
  416         sub {
  417             is( number_hashref_to_string( { a_key => 23 } ), q{{ 'a_key' => 23 }}, q{TNVHVRV20 number_hashref_to_string({a_key => 23}) returns correct value} );
  418         },
  419         q{TNVHVRV20 number_hashref_to_string({ a_key => 23 }) lives}
  420     );
  421     lives_and(    # TNVHVRV21
  422         sub {
  423             like(
  424                 number_hashref_to_string(
  425                     {   a_key => 2,
  426                         b_key => 2_112,
  427                         c_key => 42,
  428                         d_key => 23,
  429                         e_key => -877,
  430                         f_key => -33,
  431                         g_key => 1_701
  432                     }
  433                 ),
  434 
  435                 q{/^\\\{\s(?=.*'a_key' => 2\b)(?=.*'b_key' => 2_112\b)(?=.*'c_key' => 42\b)(?=.*'d_key' => 23\b)(?=.*'e_key' => -877\b)(?=.*'f_key' => -33\b)(?=.*'g_key' => 1_701\b).*\s\}$/m},
  436                 q{TNVHVRV21 number_hashref_to_string({ a_key => 2, b_key => 2_112, c_key => 42, d_key => 23, e_key => -877, f_key => -33, g_key => 1_701 }) returns correct value}
  437             );
  438         },
  439         q{TNVHVRV21 number_hashref_to_string({ a_key => 2, b_key => 2_112, c_key => 42, d_key => 23, e_key => -877, f_key => -33, g_key => 1_701 }) lives}
  440     );
  441     lives_and(    # TNVHVRV22
  442         sub {
  443             like(
  444                 number_hashref_to_string( { a_key => 2.123_443_211_234_432_1 } ),
  445                 qr/\{\s'a_key' => 2\.123_443_211_234/,
  446                 q{TNVHVRV22 number_hashref_to_string({ a_key => 2.123_443_211_234_432_1 }) returns correct value}
  447             );
  448         },
  449         q{TNVHVRV22 number_hashref_to_string({ a_key => 2.123_443_211_234_432_1 }) lives}
  450     );
  451     lives_and(    # TNVHVRV23
  452         sub {
  453             like(
  454                 number_hashref_to_string(
  455                     {   a_key => 2.123_443_211_234_432_1,
  456                         b_key => 2_112.432_1,
  457                         c_key => 42.456_7,
  458                         d_key => 23.765_444_444_444_444_444,
  459                         e_key => -877.567_8,
  460                         f_key => -33.876_587_658_765_875_687_658_765,
  461                         g_key => 1_701.678_9
  462                     }
  463                 ),
  464 
  465                 q{/^\\\{\s(?=.*'a_key' => 2\.123_443_211_234)(?=.*'b_key' => 2_112\.432_1)(?=.*'c_key' => 42\.456_7)(?=.*'d_key' => 23\.765_444_444_44)(?=.*'e_key' => -877\.567_8)(?=.*'f_key' => -33\.876_587_658_76)(?=.*'g_key' => 1_701\.678_9).*\s\}$/m},
  466 
  467 #                q{TNVHVRV23 number_hashref_to_string({ a_key => 2.123_443_211_234_432_1, b_key => 2_112.432_1, c_key => 42.456_7, d_key => 23.765_444_444_444_444_444, e_key => -877.567_8, f_key => -33.876_587_658_765_875_687_658_765, g_key => 1_701.678_9 }) returns correct value}
  468                 q{TNVHVRV23 number_hashref_to_string({ a_key => 2.123_443_211_234_432_1, b_key => 2_112.432_1, c_key => 42.456_7, ..., g_key => 1_701.678_9 }) returns correct value}
  469             );
  470         },
  471         q{TNVHVRV23 number_hashref_to_string({ a_key => 2.123_443_211_234_432_1, b_key => 2_112.432_1, c_key => 42.456_7, d_key => 23.765_444_444_444_444_444, e_key => -877.567_8, f_key => -33.876_587_658_765_875_687_658_765, g_key => 1_701.678_9 }) lives}
  472     );
  473     throws_ok(    # TNVHVRV30
  474         sub { number_hashref_typetest0() },
  475         "/(ENVHVRV00.*$mode_tagline)|(Usage.*number_hashref_typetest0)/",    # DEV NOTE: 2 different error messages, RPerl & C
  476         q{TNVHVRV30 number_hashref_typetest0() throws correct exception}
  477     );
  478     throws_ok(                                                                # TNVHVRV31
  479         sub { number_hashref_typetest0(2) },
  480         "/ENVHVRV01.*$mode_tagline/",
  481         q{TNVHVRV31 number_hashref_typetest0(2) throws correct exception}
  482     );
  483     throws_ok(                                                                # TNVHVRV32
  484         sub {
  485             number_hashref_typetest0(
  486                 {   'binary'       => 2.123_443_211_234_432_1,
  487                     'rush'         => 2_112.432_1,
  488                     'ERROR_FUNKEY' => undef,
  489                     'answer'       => 42.456_7,
  490                     'fnord'        => 23.765_444_444_444_444_444,
  491                     'units'        => -877.567_8,
  492                     'degree'       => -33.876_587_658_765_875_687_658_765,
  493                     'ncc'          => 1_701.678_9
  494                 }
  495             );
  496         },
  497         "/ENVHVRV02.*$mode_tagline/",
  498         q{TNVHVRV32 number_hashref_typetest0({ 'binary' => 2.123_443_211_234_432_1, 'ERROR_FUNKEY' => undef, ..., 'ncc' => 1_701.678_9 }) throws correct exception}
  499     );
  500     throws_ok(    # TNVHVRV33
  501         sub {
  502             number_hashref_typetest0(
  503                 {   'binary'       => 2.123_443_211_234_432_1,
  504                     'rush'         => 2_112.432_1,
  505                     'ERROR_FUNKEY' => 'abcdefg',
  506                     'answer'       => 42.456_7,
  507                     'fnord'        => 23.765_444_444_444_444_444,
  508                     'units'        => -877.567_8,
  509                     'degree'       => -33.876_587_658_765_875_687_658_765,
  510                     'ncc'          => 1_701.678_9
  511                 }
  512             );
  513         },
  514         "/ENVHVRV03.*$mode_tagline/",
  515         q{TNVHVRV33 number_hashref_typetest0({ 'binary' => 2.123_443_211_234_432_1, 'ERROR_FUNKEY' => 'abcdefg', ..., 'ncc' => 1_701.678_9 }) throws correct exception}
  516     );
  517     lives_and(    # TNVHVRV34
  518         sub {
  519             like(
  520                 number_hashref_typetest0(
  521                     {   'binary' => 2.123_443_211_234_432_1,
  522                         'rush'   => 2_112.432_1,
  523                         'answer' => 42.456_7,
  524                         'fnord'  => 23.765_444_444_444_444_444,
  525                         'units'  => -877.567_8,
  526                         'degree' => -33.876_587_658_765_875_687_658_765,
  527                         'ncc'    => 1_701.678_9
  528                     }
  529                 ),
  530 
  531                 q{/^\\\{\s(?=.*'binary' => 2\.123_443_211_234)(?=.*'rush' => 2_112\.432_1)(?=.*'answer' => 42\.456_7)(?=.*'fnord' => 23\.765_444_444_44)(?=.*'units' => -877\.567_8)(?=.*'degree' => -33\.876_587_658_76)(?=.*'ncc' => 1_701\.678_9).*\s\}} . $mode_tagline . q{$/m},
  532                 q{TNVHVRV34 number_hashref_typetest0({ 'binary' => 2.123_443_211_234_432_1, 'rush' => 2_112.432_1, ..., 'ncc' => 1_701.678_9 }) returns correct value}
  533             );
  534         },
  535         q{TNVHVRV34 number_hashref_typetest0({ 'binary' => 2.123_443_211_234_432_1, 'rush' => 2_112.432_1, ..., 'ncc' => 1_701.678_9 }) lives}
  536     );
  537     lives_and(    # TNVHVRV40
  538         sub {
  539             my number_hashref $tmp_retval    = number_hashref_typetest1(5);
  540             my number_hashref $correct_retval = {
  541                 "$mode_tagline\_funkey2" => 10.246_913_578,
  542                 "$mode_tagline\_funkey3" => 15.370_370_367,
  543                 "$mode_tagline\_funkey4" => 20.493_827_156,
  544                 "$mode_tagline\_funkey1" => 5.123_456_789,
  545                 "$mode_tagline\_funkey0" => 0
  546             };
  547             foreach my string $correct_retval_key ( keys %{$correct_retval} ) {
  548                 ok( ( ( exists $tmp_retval->{$correct_retval_key} ) and ( defined $tmp_retval->{$correct_retval_key} ) ),
  549                     q{TNVHVRV40a number_hashref_typetest1(5) returns defined value, at key } . $correct_retval_key
  550                 );
  551                 delta_ok(
  552                     $correct_retval->{$correct_retval_key},
  553                     $tmp_retval->{$correct_retval_key},
  554                     q{TNVHVRV40b number_hashref_typetest1(5) returns correct value, at key } . $correct_retval_key
  555                 );
  556             }
  557         },
  558         q{TNVHVRV40 number_hashref_typetest1(5) lives}
  559     );
  560 
  561     # [[[ STRING HASH REF TESTS ]]]
  562     # [[[ STRING HASH REF TESTS ]]]
  563     # [[[ STRING HASH REF TESTS ]]]
  564 
  565     throws_ok(    # TPVHVRV00
  566         sub { string_hashref_to_string() },
  567         "/(EPVHVRV00.*$mode_tagline)|(Usage.*string_hashref_to_string)/",    # DEV NOTE: 2 different error messages, RPerl & C
  568         q{TPVHVRV00 string_hashref_to_string() throws correct exception}
  569     );
  570     throws_ok(                                                               # TPVHVRV01
  571         sub { string_hashref_to_string(undef) },
  572         "/EPVHVRV00.*$mode_tagline/",
  573         q{TPVHVRV01 string_hashref_to_string(undef) throws correct exception}
  574     );
  575     throws_ok(                                                               # TPVHVRV02
  576         sub { string_hashref_to_string(2) },
  577         "/EPVHVRV01.*$mode_tagline/",
  578         q{TPVHVRV02 string_hashref_to_string(2) throws correct exception}
  579     );
  580     throws_ok(                                                               # TPVHVRV03
  581         sub { string_hashref_to_string(2.3) },
  582         "/EPVHVRV01.*$mode_tagline/",
  583         q{TPVHVRV03 string_hashref_to_string(2.3) throws correct exception}
  584     );
  585     throws_ok(                                                               # TPVHVRV04
  586         sub { string_hashref_to_string('Lone Ranger') },
  587         "/EPVHVRV01.*$mode_tagline/",
  588         q{TPVHVRV04 string_hashref_to_string('Lone Ranger') throws correct exception}
  589     );
  590     throws_ok(                                                               # TPVHVRV05
  591         sub { string_hashref_to_string([ 'Lone Ranger' ]) },
  592         "/EPVHVRV01.*$mode_tagline/",
  593         q{TPVHVRV05 string_hashref_to_string([ 'Lone Ranger' ]) throws correct exception}
  594     );
  595     throws_ok(                                                               # TPVHVRV10
  596         sub {
  597             string_hashref_to_string(
  598                 {   'kryptonian_manofsteel_clarkkent'  => 'Superman',
  599                     'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter',
  600                     'UNDEF_NOT_STRING'                 => undef
  601                 }
  602             );
  603         },
  604         "/EPVHVRV02.*$mode_tagline/",
  605         q{TPVHVRV10 string_hashref_to_string({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., 'UNDEF_NOT_STRING' => undef }) throws correct exception}
  606     );
  607     throws_ok(                                                               # TPVHVRV11
  608         sub {
  609             string_hashref_to_string(
  610                 {   'kryptonian_manofsteel_clarkkent'  => 'Superman',
  611                     'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter',
  612                     'INTEGER_NOT_STRING'               => 23
  613                 }
  614             );
  615         },
  616         "/EPVHVRV03.*$mode_tagline/",
  617         q{TPVHVRV11 string_hashref_to_string({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., 'INTEGER_NOT_STRING' => 23 }) throws correct exception}
  618     );
  619     throws_ok(                                                               # TPVHVRV12
  620         sub {
  621             string_hashref_to_string(
  622                 {   'kryptonian_manofsteel_clarkkent'  => 'Superman',
  623                     'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter',
  624                     'NUMBER_NOT_STRING'                => -2_112.23
  625                 }
  626             );
  627         },
  628         "/EPVHVRV03.*$mode_tagline/",
  629         q{TPVHVRV12 string_hashref_to_string({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., 'NUMBER_NOT_STRING' => -2_112.23 }) throws correct exception}
  630     );
  631     throws_ok(                                                               # TPVHVRV13
  632         sub {
  633             string_hashref_to_string(
  634                 {   'kryptonian_manofsteel_clarkkent'  => 'Superman',
  635                     'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter',
  636                     'ARRAY_NOT_STRING'                 => [ 'Tonto' ]
  637                 }
  638             );
  639         },
  640         "/EPVHVRV03.*$mode_tagline/",
  641         q{TPVHVRV13 string_hashref_to_string({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., 'ARRAY_NOT_STRING' => [ 'Tonto' ] }) throws correct exception}
  642     );
  643     throws_ok(                                                               # TPVHVRV14
  644         sub {
  645             string_hashref_to_string(
  646                 {   'kryptonian_manofsteel_clarkkent'  => 'Superman',
  647                     'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter',
  648                     'HASH_NOT_STRING'                  => { fizz => 3 }
  649                 }
  650             );
  651         },
  652         "/EPVHVRV03.*$mode_tagline/",
  653         q{TPVHVRV14 string_hashref_to_string({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., 'HASH_NOT_STRING' => { fizz => 3 } }) throws correct exception}
  654     );
  655     lives_and(                                                               # TPVHVRV20
  656         sub {
  657             like(
  658                 string_hashref_to_string(
  659                     {   'stuckinaworldhenevercreated'                => 'Howard The Duck',
  660                         'kryptonian_manofsteel_clarkkent'            => 'Superman',
  661                         'gothamite_darkknight_brucewayne'            => 'Batman',
  662                         'amazonian_dianathemyscira_dianaprince'      => 'Wonder Woman',
  663                         'scarletspeedster_barryallenetal'            => 'Flash',
  664                         'alanscottetal'                              => 'Green Lantern',
  665                         'atlanteanhybrid_aquaticace_arthurcurryorin' => 'Aquaman',
  666                         'greenmartian_bloodwynd_jonnjonnz'           => 'Martian Manhunter'
  667                     }
  668                 ),
  669                 q{/^\\\{\s(?=.*'stuckinaworldhenevercreated' => 'Howard The Duck')(?=.*'kryptonian_manofsteel_clarkkent' => 'Superman')(?=.*'gothamite_darkknight_brucewayne' => 'Batman')(?=.*'amazonian_dianathemyscira_dianaprince' => 'Wonder Woman')(?=.*'scarletspeedster_barryallenetal' => 'Flash')(?=.*'alanscottetal' => 'Green Lantern')(?=.*'atlanteanhybrid_aquaticace_arthurcurryorin' => 'Aquaman')(?=.*'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter').*\s\}$/m}
  670                 ,    ## PERLTIDY BUG comma on newline
  671                 q{TPVHVRV20 string_hashref_to_string({ 'stuckinaworldhenevercreated' => 'Howard The Duck', 'kryptonian_manofsteel_clarkkent' => 'Superman', ... }) returns correct value}
  672             );
  673         },
  674         q{TPVHVRV20 string_hashref_to_string({ 'stuckinaworldhenevercreated' => 'Howard The Duck', 'kryptonian_manofsteel_clarkkent' => 'Superman', ... }) lives}
  675     );
  676     lives_and(       # TPVHVRV21
  677         sub {
  678             like(
  679                 string_hashref_to_string(
  680                     {   'kryptonian_manofsteel_clarkkent'  => 'Superman',
  681                         'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter',
  682                         'STRING_NOT_UNDEF'                 => 'undef'
  683                     }
  684                 ),
  685                 q{/^\\\{\s(?=.*'kryptonian_manofsteel_clarkkent' => 'Superman')(?=.*'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter')(?=.*'STRING_NOT_UNDEF' => 'undef').*\s\}$/m}
  686                 ,    ## PERLTIDY BUG comma on newline
  687                 q{TPVHVRV21 string_hashref_to_string({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., 'STRING_NOT_UNDEF' => 'undef' }) returns correct value}
  688             );
  689         },
  690         q{TPVHVRV21 string_hashref_to_string({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., 'STRING_NOT_UNDEF' => 'undef' }) lives}
  691     );
  692     lives_and(       # TPVHVRV22
  693         sub {
  694             like(
  695                 string_hashref_to_string(
  696                     {   'kryptonian_manofsteel_clarkkent'  => 'Superman',
  697                         'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter',
  698                         'STRING_NOT_INTEGER'               => '23'
  699                     }
  700                 ),
  701                 q{/^\\\{\s(?=.*'kryptonian_manofsteel_clarkkent' => 'Superman')(?=.*'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter')(?=.*'STRING_NOT_INTEGER' => '23').*\s\}$/m}
  702                 ,    ## PERLTIDY BUG comma on newline
  703                 q{TPVHVRV22 string_hashref_to_string({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., 'STRING_NOT_INTEGER' => '23' }) returns correct value}
  704             );
  705         },
  706         q{TPVHVRV22 string_hashref_to_string({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., 'STRING_NOT_INTEGER' => '23' }) lives}
  707     );
  708     lives_and(       # TPVHVRV23
  709         sub {
  710             like(
  711                 string_hashref_to_string(
  712                     {   'kryptonian_manofsteel_clarkkent'  => 'Superman',
  713                         'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter',
  714                         'STRING_NOT_NUMBER'                => '-2_112.23'
  715                     }
  716                 ),
  717                 q{/^\\\{\s(?=.*'kryptonian_manofsteel_clarkkent' => 'Superman')(?=.*'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter')(?=.*'STRING_NOT_NUMBER' => '-2_112.23').*\s\}$/m}
  718                 ,    ## PERLTIDY BUG comma on newline
  719                 q{TPVHVRV23 string_hashref_to_string({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., 'STRING_NOT_NUMBER' => '-2_112.23' }) returns correct value}
  720             );
  721         },
  722         q{TPVHVRV23 string_hashref_to_string({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., 'STRING_NOT_NUMBER' => '-2_112.23' }) lives}
  723     );
  724     lives_and(       # TPVHVRV24
  725         sub {
  726             like(
  727                 string_hashref_to_string(
  728                     {   'kryptonian_manofsteel_clarkkent'  => 'Superman',
  729                         'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter',
  730                         "STRING_NOT_ARRAY"                 => "[ Tonto ]"
  731                     }
  732                 ),
  733                 q{/^\\\{\s(?=.*'kryptonian_manofsteel_clarkkent' => 'Superman')(?=.*'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter')(?=.*'STRING_NOT_ARRAY' => '\[ Tonto \]').*\s\}$/m}
  734                 ,    ## PERLTIDY BUG comma on newline
  735                 q{TPVHVRV24 string_hashref_to_string({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., "STRING_NOT_ARRAY" => "[ Tonto ]" }) returns correct value}
  736             );
  737         },
  738         q{TPVHVRV24 string_hashref_to_string({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., "STRING_NOT_ARRAY" => "[ Tonto ]" }) lives}
  739     );
  740     lives_and(       # TPVHVRV25
  741         sub {
  742             like(
  743                 string_hashref_to_string(
  744                     {   'kryptonian_manofsteel_clarkkent'  => 'Superman',
  745                         'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter',
  746                         "STRING_NOT_HASH"                  => "{ buzz => 5 }"
  747                     }
  748                 ),
  749 
  750    # DEV NOTE: must surround single-q-quote below with square brackets instead of curly braces, so that the backslash-escaped curly braces inside the string
  751    # will stay backslash-escaped as they are passed to the regex, to fix Perl v5.22 error 'Unescaped left brace in regex is deprecated, passed through in regex'
  752                 q[/^\{\s(?=.*'kryptonian_manofsteel_clarkkent' => 'Superman')(?=.*'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter')(?=.*'STRING_NOT_HASH' => '\{ buzz => 5 \}').*\s\}$/m]
  753                 ,    ## PERLTIDY BUG comma on newline
  754                 q{TPVHVRV25 string_hashref_to_string({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., "STRING_NOT_HASH" => "{ buzz => 5 }" }) returns correct value}
  755             );
  756         },
  757         q{TPVHVRV25 string_hashref_to_string({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., "STRING_NOT_HASH" => "{ buzz => 5 }" }) lives}
  758     );
  759     throws_ok(       # TPVHVRV30
  760         sub { string_hashref_typetest0() },
  761         "/(EPVHVRV00.*$mode_tagline)|(Usage.*string_hashref_typetest0)/",    # DEV NOTE: 2 different error messages, RPerl & C
  762         q{TPVHVRV30 string_hashref_typetest0() throws correct exception}
  763     );
  764     throws_ok(                                                                # TPVHVRV31
  765         sub { string_hashref_typetest0(2) },
  766         "/EPVHVRV01.*$mode_tagline/",
  767         q{TPVHVRV31 string_hashref_typetest0(2) throws correct exception}
  768     );
  769     throws_ok(                                                                # TPVHVRV32
  770         sub {
  771             string_hashref_typetest0(
  772                 {   'kryptonian_manofsteel_clarkkent'            => 'Superman',
  773                     'gothamite_darkknight_brucewayne'            => 'Batman',
  774                     'amazonian_dianathemyscira_dianaprince'      => 'Wonder Woman',
  775                     'scarletspeedster_barryallenetal'            => 'Flash',
  776                     'alanscottetal'                              => 'Green Lantern',
  777                     'atlanteanhybrid_aquaticace_arthurcurryorin' => 'Aquaman',
  778                     'greenmartian_bloodwynd_jonnjonnz'           => 'Martian Manhunter',
  779                     'UNDEF_NOT_STRING'                           => undef
  780                 }
  781             );
  782         },
  783         "/EPVHVRV02.*$mode_tagline/",
  784         q{TPVHVRV32 string_hashref_typetest0({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., 'UNDEF_NOT_STRING' => undef }) throws correct exception}
  785     );
  786     throws_ok(    # TPVHVRV33
  787         sub {
  788             string_hashref_typetest0(
  789                 {   'kryptonian_manofsteel_clarkkent'            => 'Superman',
  790                     'gothamite_darkknight_brucewayne'            => 'Batman',
  791                     'amazonian_dianathemyscira_dianaprince'      => 'Wonder Woman',
  792                     'scarletspeedster_barryallenetal'            => 'Flash',
  793                     'alanscottetal'                              => 'Green Lantern',
  794                     'atlanteanhybrid_aquaticace_arthurcurryorin' => 'Aquaman',
  795                     'greenmartian_bloodwynd_jonnjonnz'           => 'Martian Manhunter',
  796                     'ARRAY_NOT_STRING'                           => [ 23, -42.3 ]
  797                 }
  798             );
  799         },
  800         "/EPVHVRV03.*$mode_tagline/",
  801         q{TPVHVRV33 string_hashref_typetest0({ 'kryptonian_manofsteel_clarkkent' => 'Superman', ..., 'ARRAY_NOT_STRING' => [ 23, -42. 3 ] }) throws correct exception}
  802     );
  803     lives_and(    # TPVHVRV34
  804         sub {
  805             like(
  806                 string_hashref_typetest0(
  807                     {   'stuckinaworldhenevercreated'                => 'Howard The Duck',
  808                         'atlanteanhybrid_aquaticace_arthurcurryorin' => 'Aquaman',
  809                         'greenmartian_bloodwynd_jonnjonnz'           => 'Martian Manhunter'
  810                     }
  811                 ),
  812                 q{/^\\\{\s(?=.*'stuckinaworldhenevercreated' => 'Howard The Duck')(?=.*'atlanteanhybrid_aquaticace_arthurcurryorin' => 'Aquaman')(?=.*'greenmartian_bloodwynd_jonnjonnz' => 'Martian Manhunter').*\s\}} . $mode_tagline . q{$/m},
  813                 q{TPVHVRV34 string_hashref_typetest0({ 'stuckinaworldhenevercreated' => 'Howard The Duck', ... }) returns correct value}
  814             );
  815         },
  816         q{TPVHVRV34 string_hashref_typetest0({ 'stuckinaworldhenevercreated' => 'Howard The Duck', ... }) lives}
  817     );
  818     lives_and(    # TPVHVRV40
  819         sub {
  820             is_deeply(
  821                 string_hashref_typetest1(5),
  822                 {   "$mode_tagline\_Luker_key3" => 'Jeffy Ten! 3/4',
  823                     "$mode_tagline\_Luker_key2" => 'Jeffy Ten! 2/4',
  824                     "$mode_tagline\_Luker_key1" => 'Jeffy Ten! 1/4',
  825                     "$mode_tagline\_Luker_key4" => 'Jeffy Ten! 4/4',
  826                     "$mode_tagline\_Luker_key0" => 'Jeffy Ten! 0/4'
  827                 },
  828                 q{TPVHVRV40 string_hashref_typetest1(5) returns correct value}
  829             );
  830         },
  831         q{TPVHVRV40 string_hashref_typetest1(5) lives}
  832     );
  833 
  834     # [[[ INTEGER ARRAY REF HASH REF TESTS ]]]
  835     # [[[ INTEGER ARRAY REF HASH REF TESTS ]]]
  836     # [[[ INTEGER ARRAY REF HASH REF TESTS ]]]
  837 
  838 =DISABLE_TEST_DATA
  839 { key_0 => [ 0, 1, 2 ], key_1 => [ 5, 6, 7 ], key_2 => [ 0, -1, -2 ] }
  840 {
  841     key_0 => [ 0,  1,  2 ],
  842     key_1 => [ 5,  6,  7 ],
  843     key_2 => [ 0, -1, -2 ]
  844 }
  845 =cut
  846 
  847     throws_ok(    # TIVAVRVHVRV00
  848         sub { integer_arrayref_hashref_to_string() },
  849         "/(EIVAVRVHVRV00.*$mode_tagline)|(Usage.*integer_arrayref_hashref_to_string)/",    # DEV NOTE: 2 different error messages, RPerl & C
  850         q{TIVAVRVHVRV00 integer_arrayref_hashref_to_string() throws correct exception}
  851     );
  852     throws_ok(                                                                # TIVAVRVHVRV01
  853         sub { integer_arrayref_hashref_to_string(undef) },
  854         "/EIVAVRVHVRV00.*$mode_tagline/",
  855         q{TIVAVRVHVRV01 integer_arrayref_hashref_to_string(undef) throws correct exception}
  856     );
  857     throws_ok(                                                                # TIVAVRVHVRV02
  858         sub { integer_arrayref_hashref_to_string(2) },
  859         "/EIVAVRVHVRV01.*$mode_tagline/",
  860         q{TIVAVRVHVRV02 integer_arrayref_hashref_to_string(2) throws correct exception}
  861     );
  862     throws_ok(                                                                # TIVAVRVHVRV03
  863         sub { integer_arrayref_hashref_to_string(2.3) },
  864         "/EIVAVRVHVRV01.*$mode_tagline/",
  865         q{TIVAVRVHVRV03 integer_arrayref_hashref_to_string(2.3) throws correct exception}
  866     );
  867     throws_ok(                                                                # TIVAVRVHVRV04
  868         sub { integer_arrayref_hashref_to_string('2') },
  869         "/EIVAVRVHVRV01.*$mode_tagline/",
  870         q{TIVAVRVHVRV04 integer_arrayref_hashref_to_string('2') throws correct exception}
  871     );
  872     throws_ok(                                                                # TIVAVRVHVRV05
  873         sub { integer_arrayref_hashref_to_string([ 2 ]) },
  874         "/EIVAVRVHVRV01.*$mode_tagline/",
  875         q{TIVAVRVHVRV05 integer_arrayref_hashref_to_string([ 2 ]) throws correct exception}
  876     );
  877 
  878     throws_ok(    # TIVAVRVHVRV10
  879         sub {
  880             integer_arrayref_hashref_to_string({
  881                 key_0 => [  0,  1,  2 ],
  882                 key_1 => undef,
  883                 key_2 => [  0, -1, -2 ]
  884             });
  885         },
  886         "/EIVAVRVHVRV02.*$mode_tagline/",
  887         q{TIVAVRVHVRV10 integer_arrayref_hashref_to_string({ key_0 => [ 0, 1, 2 ], key_1 => undef, key_2 => [ 0, -1, -2 ] }) throws correct exception}
  888     );
  889     throws_ok(    # TIVAVRVHVRV11
  890         sub {
  891             integer_arrayref_hashref_to_string({
  892                 key_0 => [  0,  1,  2 ],
  893                 key_1 => 23,
  894                 key_2 => [  0, -1, -2 ]
  895             });
  896         },
  897         "/EIVAVRVHVRV03.*$mode_tagline/",
  898         q{TIVAVRVHVRV11 integer_arrayref_hashref_to_string({ key_0 => [ 0, 1, 2 ], key_1 => 23, key_2 => [ 0, -1, -2 ] }) throws correct exception}
  899     );
  900     throws_ok(    # TIVAVRVHVRV12
  901         sub {
  902             integer_arrayref_hashref_to_string({
  903                 key_0 => [  0,  1,  2 ],
  904                 key_1 => 23.42,
  905                 key_2 => [  0, -1, -2 ]
  906             });
  907         },
  908         "/EIVAVRVHVRV03.*$mode_tagline/",
  909         q{TIVAVRVHVRV12 integer_arrayref_hashref_to_string({ key_0 => [ 0, 1, 2 ], key_1 => 23.42, key_2 => [ 0, -1, -2 ] }) throws correct exception}
  910     );
  911     throws_ok(    # TIVAVRVHVRV13
  912         sub {
  913             integer_arrayref_hashref_to_string({
  914                 key_0 => [  0,  1,  2 ],
  915                 key_1 => 'howdy',
  916                 key_2 => [  0, -1, -2 ]
  917             });
  918         },
  919         "/EIVAVRVHVRV03.*$mode_tagline/",
  920         q{TIVAVRVHVRV13 integer_arrayref_hashref_to_string({ key_0 => [ 0, 1, 2 ], key_1 => 'howdy', key_2 => [ 0, -1, -2 ] }) throws correct exception}
  921     );
  922     throws_ok(    # TIVAVRVHVRV14
  923         sub {
  924             integer_arrayref_hashref_to_string({
  925                 key_0 => [  0,  1,  2 ],
  926                 key_1 => { subkey_10 => 23 },
  927                 key_2 => [  0, -1, -2 ]
  928             });
  929         },
  930         "/EIVAVRVHVRV03.*$mode_tagline/",
  931         q{TIVAVRVHVRV14 integer_arrayref_hashref_to_string({ key_0 => [ 0, 1, 2 ], key_1 => { subkey_10 => 23 }, key_2 => [ 0, -1, -2 ] }) throws correct exception}
  932     );
  933 
  934     throws_ok(    # TIVAVRVHVRV20
  935         sub {
  936             integer_arrayref_hashref_to_string({
  937                 key_0 => [  0,  1,  undef ],
  938                 key_1 => [  5,  6,  7 ],
  939                 key_2 => [  0, -1, -2 ]
  940             });
  941         },
  942         "/EIVAVRVHVRV04.*$mode_tagline/",
  943         q{TIVAVRVHVRV20 integer_arrayref_hashref_to_string({ key_0 => [ 0, 1, undef ], key_1 => [ 5, 6, 7 ], key_2 => [ 0, -1, -2 ] }) throws correct exception}
  944     );
  945     throws_ok(    # TIVAVRVHVRV21
  946         sub {
  947             integer_arrayref_hashref_to_string({
  948                 key_0 => [  0,  1,  2 ],
  949                 key_1 => [  5,  undef,  7 ],
  950                 key_2 => [  0, -1, -2 ]
  951             });
  952         },
  953         "/EIVAVRVHVRV04.*$mode_tagline/",
  954         q{TIVAVRVHVRV21 integer_arrayref_hashref_to_string({ key_0 => [ 0, 1, 2 ], key_1 => [ 5, undef, 7 ], key_2 => [ 0, -1, -2 ] }) throws correct exception}
  955     );
  956     throws_ok(    # TIVAVRVHVRV22
  957         sub {
  958             integer_arrayref_hashref_to_string({
  959                 key_0 => [  0,  1,  2 ],
  960                 key_1 => [  5,  6,  7 ],
  961                 key_2 => [  undef, -1, -2 ]
  962             });
  963         },
  964         "/EIVAVRVHVRV04.*$mode_tagline/",
  965         q{TIVAVRVHVRV22 integer_arrayref_hashref_to_string({ key_0 => [ 0, 1, 2 ], key_1 => [ 5, 6, 7 ], key_2 => [  undef, -1, -2 ] }) throws correct exception}
  966     );
  967     
  968 
  969     throws_ok(    # TIVAVRVHVRV30
  970         sub {
  971             integer_arrayref_hashref_to_string({
  972                 key_0 => [  0.1,  1,  2 ],
  973                 key_1 => [  5,  6,  7 ],
  974                 key_2 => [  0, -1, -2 ]
  975             });
  976         },
  977         "/EIVAVRVHVRV05.*$mode_tagline/",
  978         q{TIVAVRVHVRV30 integer_arrayref_hashref_to_string({ key_0 => [ 0.1, 1, 2 ], key_1 => [ 5, 6, 7 ], key_2 => [ 0, -1, -2 ] }) throws correct exception}
  979     );
  980     throws_ok(    # TIVAVRVHVRV31
  981         sub {
  982             integer_arrayref_hashref_to_string({
  983                 key_0 => [  0,  1,  2 ],
  984                 key_1 => [  5,  '6',  7 ],
  985                 key_2 => [  0, -1, -2 ]
  986             });
  987         },
  988         "/EIVAVRVHVRV05.*$mode_tagline/",
  989         q{TIVAVRVHVRV31 integer_arrayref_hashref_to_string({ key_0 => [ 0, 1, 2 ], key_1 => [ 5, '6', 7 ], key_2 => [ 0, -1, -2 ] }) throws correct exception}
  990     );
  991     throws_ok(    # TIVAVRVHVRV32
  992         sub {
  993             integer_arrayref_hashref_to_string({
  994                 key_0 => [  0,  1,  2 ],
  995                 key_1 => [  5,  6,  7 ],
  996                 key_2 => [  0, -1, [ -2 ] ]
  997             });
  998         },
  999         "/EIVAVRVHVRV05.*$mode_tagline/",
 1000         q{TIVAVRVHVRV32 integer_arrayref_hashref_to_string({ key_0 => [ 0, 1, 2 ], key_1 => [ 5, 6, 7 ], key_2 => [ 0, -1, [ -2 ] ] }) throws correct exception}
 1001     );
 1002     throws_ok(    # TIVAVRVHVRV33
 1003         sub {
 1004             integer_arrayref_hashref_to_string({
 1005                 key_0 => [  0,  1,  2 ],
 1006                 key_1 => [  5,  { subkey_11 => 6 },  7 ],
 1007                 key_2 => [  0, -1, -2 ]
 1008             });
 1009         },
 1010         "/EIVAVRVHVRV05.*$mode_tagline/",
 1011         q{TIVAVRVHVRV33 integer_arrayref_hashref_to_string({ key_0 => [ 0, 1, 2 ], key_1 => [ 5, { subkey_11 => 6 }, 7 ], key_2 => [ 0, -1, -2 ] }) throws correct exception}
 1012     );
 1013 
 1014     lives_and(    # TIVAVRVHVRV40
 1015         sub {
 1016             is( integer_arrayref_hashref_to_string( { key_0 => [ 0, 1, 2 ] } ), q{{ 'key_0' => [ 0, 1, 2 ] }}, q{TIVAVRVHVRV40 integer_arrayref_hashref_to_string({ key_0 => [ 0, 1, 2 ] }) returns correct value} );
 1017         },
 1018         q{TIVAVRVHVRV40 integer_arrayref_hashref_to_string({ key_0 => [ 0, 1, 2 ] }) lives}
 1019     );
 1020     lives_and(    # TIVAVRVHVRV51
 1021         sub { like(
 1022             integer_arrayref_hashref_to_string({
 1023                 key_0 => [  0,  1,  2 ],
 1024                 key_1 => [  5,  6,  7 ],
 1025                 key_2 => [  0, -1, -2 ]
 1026             }),
 1027 
 1028              # NEED FIX: replace ".*" near end of this & following regexes with syntax to match exactly 6 occurrences of ", "; (,\s)* and variations don't work?
 1029             q{/^\\\{\s(?=.*'key_0' => \[ 0, 1, 2 \])(?=.*'key_1' => \[ 5, 6, 7 \])(?=.*'key_2' => \[ 0, -1, -2 \]).*\s\}$/m},
 1030             q{TIVAVRVHVRV51 integer_arrayref_hashref_to_string({ key_0 => [ 0, 1, 2 ], key_1 => [ 5, 6, 7 ], key_2 => [ 0, -1, -2 ] }) returns correct value}
 1031         ); },
 1032         q{TIVAVRVHVRV51 integer_arrayref_hashref_to_string({ key_0 => [ 0, 1, 2 ], key_1 => [ 5, 6, 7 ], key_2 => [ 0, -1, -2 ] }) lives}
 1033     );
 1034     lives_and(    # TIVAVRVHVRV52
 1035         sub { like(
 1036             integer_arrayref_hashref_to_string_compact({
 1037                 key_0 => [  0,  1,  2 ],
 1038                 key_1 => [  5,  6,  7 ],
 1039                 key_2 => [  0, -1, -2 ]
 1040             }),
 1041 
 1042              # NEED FIX: replace ".*" near end of this & following regexes with syntax to match exactly 6 occurrences of ", "; (,\s)* and variations don't work?
 1043             q{/^\\\{(?=.*'key_0'=>\[0,1,2\])(?=.*'key_1'=>\[5,6,7\])(?=.*'key_2'=>\[0,-1,-2\]).*\}$/m},
 1044             q{TIVAVRVHVRV52 integer_arrayref_hashref_to_string_compact({ key_0 => [ 0, 1, 2 ], key_1 => [ 5, 6, 7 ], key_2 => [ 0, -1, -2 ] }) returns correct value}
 1045         ); },
 1046         q{TIVAVRVHVRV52 integer_arrayref_hashref_to_string_compact({ key_0 => [ 0, 1, 2 ], key_1 => [ 5, 6, 7 ], key_2 => [ 0, -1, -2 ] }) lives}
 1047     );
 1048     lives_and(    # TIVAVRVHVRV53
 1049         sub { like(
 1050             integer_arrayref_hashref_to_string_pretty({
 1051                 key_0 => [  0,  1,  2 ],
 1052                 key_1 => [  5,  6,  7 ],
 1053                 key_2 => [  0, -1, -2 ]
 1054             }),
 1055 
 1056             # NEED FIX: replace ".*" near end of this & following regexes with syntax to match exactly 6 occurrences of ", "; (,\s)* and variations don't work?
 1057             # DEV NOTE: must have 's' regex modifier to treat multi-line string as single line
 1058             q{/^\{(?=.*\n    'key_0' => \[ 0, 1, 2 \])(?=.*\n    'key_1' => \[ 5, 6, 7 \])(?=.*\n    'key_2' => \[ 0, -1, -2 \]).*\}$/ms},
 1059             q{TIVAVRVHVRV53 integer_arrayref_hashref_to_string_pretty({ key_0 => [ 0, 1, 2 ], key_1 => [ 5, 6, 7 ], key_2 => [ 0, -1, -2 ] }) returns correct value}
 1060         ); },
 1061         q{TIVAVRVHVRV53 integer_arrayref_hashref_to_string_pretty({ key_0 => [ 0, 1, 2 ], key_1 => [ 5, 6, 7 ], key_2 => [ 0, -1, -2 ] }) lives}
 1062     );
 1063 
 1064     throws_ok(    # TIVAVRVHVRV60
 1065         sub { integer_arrayref_hashref_typetest0() },
 1066         "/(EIVAVRVHVRV00.*$mode_tagline)|(Usage.*integer_arrayref_hashref_typetest0)/",    # DEV NOTE: 2 different error messages, RPerl & C
 1067         q{TIVAVRVHVRV60 integer_arrayref_hashref_typetest0() throws correct exception}
 1068     );
 1069     throws_ok(    # TIVAVRVHVRV61
 1070         sub { integer_arrayref_hashref_typetest0(2) },
 1071         "/EIVAVRVHVRV01.*$mode_tagline/",
 1072         q{TIVAVRVHVRV61 integer_arrayref_hashref_typetest0(2) throws correct exception}
 1073     );
 1074     throws_ok(    # TIVAVRVHVRV62
 1075         sub {
 1076             integer_arrayref_hashref_typetest0({
 1077                 key_0 => [  0,  1,  2 ],
 1078                 key_1 => undef,
 1079                 key_2 => [  0, -1, -2 ]
 1080             });
 1081         },
 1082         "/EIVAVRVHVRV02.*$mode_tagline/",
 1083         q{TIVAVRVHVRV62 integer_arrayref_hashref_typetest0({ key_0 => [ 0, 1, 2 ], key_1 => undef, key_2 => [ 0, -1, -2 ] }) throws correct exception}
 1084     );
 1085     throws_ok(    # TIVAVRVHVRV63
 1086         sub {
 1087             integer_arrayref_hashref_typetest0({
 1088                 key_0 => [  0,  1,  2 ],
 1089                 key_1 => 5,
 1090                 key_2 => [  0, -1, -2 ]
 1091             });
 1092         },
 1093         "/EIVAVRVHVRV03.*$mode_tagline/",
 1094         q{TIVAVRVHVRV63 integer_arrayref_hashref_typetest0({ key_0 => [ 0, 1, 2 ], key_1 => 5, key_2 => [ 0, -1, -2 ] }) throws correct exception}
 1095     );
 1096     lives_and(    # TIVAVRVHVRV64
 1097         sub {
 1098             like( integer_arrayref_hashref_typetest0({
 1099                 key_0 => [  0,  1,  2 ],
 1100                 key_1 => [  5,  6,  7 ],
 1101                 key_2 => [  0, -1, -2 ]
 1102             } ),
 1103                 q{/^\{(?=.*'key_0' => \[ 0, 1, 2 \])(?=.*'key_1' => \[ 5, 6, 7 \])(?=.*'key_2' => \[ 0, -1, -2 \]).*\}} . $mode_tagline . q{$/ms},
 1104                 q{TIVAVRVHVRV64 integer_arrayref_hashref_typetest0({ key_0 => [ 0, 1, 2 ], key_1 => [ 5,  6,  7 ], key_2 => [ 0, -1, -2 ] }) returns correct value}
 1105             );
 1106         },
 1107         q{TIVAVRVHVRV64 integer_arrayref_hashref_typetest0({ key_0 => [ 0, 1, 2 ], key_1 => [ 5,  6,  7 ], key_2 => [ 0, -1, -2 ] }) lives}
 1108     );
 1109 
 1110     lives_and(    # TIVAVRVHVRV70
 1111         sub {
 1112             is_deeply(
 1113                 integer_arrayref_hashref_typetest1(5),
 1114                 {   
 1115                     "$mode_tagline\_funkey0" => [0, 0, 0, 0, 0],
 1116                     "$mode_tagline\_funkey1" => [0, 1, 2, 3, 4],
 1117                     "$mode_tagline\_funkey2" => [0, 2, 4, 6, 8],
 1118                     "$mode_tagline\_funkey3" => [0, 3, 6, 9, 12],
 1119                     "$mode_tagline\_funkey4" => [0, 4, 8, 12, 16]
 1120                 },
 1121                 q{TIVAVRVHVRV70 integer_arrayref_hashref_typetest1(5) returns correct value}
 1122             );
 1123         },
 1124         q{TIVAVRVHVRV70 integer_arrayref_hashref_typetest1(5) lives}
 1125     );
 1126 
 1127     # [[[ NUMBER ARRAY REF HASH REF TESTS ]]]
 1128     # [[[ NUMBER ARRAY REF HASH REF TESTS ]]]
 1129     # [[[ NUMBER ARRAY REF HASH REF TESTS ]]]
 1130 
 1131 # DEV NOTE: must include at least one normal integer ('1') in our floating-point test data, in order to trigger *SvIOKp() in number_arrayref_hashref_CHECK*()
 1132 =DISABLE_TEST_DATA
 1133 { key_0 => [ 0.1, 1, 2.3 ], key_1 => [ 5.67, 6.78, 7.89 ], key_2 => [ 0.123, -1.234, -2.345 ] }
 1134 {
 1135     key_0 => [ 0.1,    1,      2.3   ],
 1136     key_1 => [ 5.67,   6.78,   7.89  ],
 1137     key_2 => [ 0.123, -1.234, -2.345 ]
 1138 }
 1139 =cut
 1140 
 1141     throws_ok(    # TNVAVRVHVRV00
 1142         sub { number_arrayref_hashref_to_string() },
 1143         "/(ENVAVRVHVRV00.*$mode_tagline)|(Usage.*number_arrayref_hashref_to_string)/",    # DEV NOTE: 2 different error messages, RPerl & C
 1144         q{TNVAVRVHVRV00 number_arrayref_hashref_to_string() throws correct exception}
 1145     );
 1146     throws_ok(                                                                # TNVAVRVHVRV01
 1147         sub { number_arrayref_hashref_to_string(undef) },
 1148         "/ENVAVRVHVRV00.*$mode_tagline/",
 1149         q{TNVAVRVHVRV01 number_arrayref_hashref_to_string(undef) throws correct exception}
 1150     );
 1151     throws_ok(                                                                # TNVAVRVHVRV02
 1152         sub { number_arrayref_hashref_to_string(2) },
 1153         "/ENVAVRVHVRV01.*$mode_tagline/",
 1154         q{TNVAVRVHVRV02 number_arrayref_hashref_to_string(2) throws correct exception}
 1155     );
 1156     throws_ok(                                                                # TNVAVRVHVRV03
 1157         sub { number_arrayref_hashref_to_string(2.3) },
 1158         "/ENVAVRVHVRV01.*$mode_tagline/",
 1159         q{TNVAVRVHVRV03 number_arrayref_hashref_to_string(2.3) throws correct exception}
 1160     );
 1161     throws_ok(                                                                # TNVAVRVHVRV04
 1162         sub { number_arrayref_hashref_to_string('2') },
 1163         "/ENVAVRVHVRV01.*$mode_tagline/",
 1164         q{TNVAVRVHVRV04 number_arrayref_hashref_to_string('2') throws correct exception}
 1165     );
 1166     throws_ok(                                                                # TNVAVRVHVRV05
 1167         sub { number_arrayref_hashref_to_string([ 2 ]) },
 1168         "/ENVAVRVHVRV01.*$mode_tagline/",
 1169         q{TNVAVRVHVRV05 number_arrayref_hashref_to_string([ 2 ]) throws correct exception}
 1170     );
 1171 
 1172     throws_ok(    # TNVAVRVHVRV10
 1173         sub {
 1174             number_arrayref_hashref_to_string({
 1175                 key_0 => [ 0.1,    1,      2.3   ],
 1176                 key_1 => undef,
 1177                 key_2 => [ 0.123, -1.234, -2.345 ]
 1178             });
 1179         },
 1180         "/ENVAVRVHVRV02.*$mode_tagline/",
 1181         q{TNVAVRVHVRV10 number_arrayref_hashref_to_string({ key_0 => [ 0.1, 1, 2.3 ], key_1 => undef, key_2 => [ 0.123, -1.234, -2.345 ] }) throws correct exception}
 1182     );
 1183     throws_ok(    # TNVAVRVHVRV11
 1184         sub {
 1185             number_arrayref_hashref_to_string({
 1186                 key_0 => [ 0.1,    1,      2.3   ],
 1187                 key_1 => 23,
 1188                 key_2 => [ 0.123, -1.234, -2.345 ]
 1189             });
 1190         },
 1191         "/ENVAVRVHVRV03.*$mode_tagline/",
 1192         q{TNVAVRVHVRV11 number_arrayref_hashref_to_string({ key_0 => [ 0.1, 1, 2.3 ], key_1 => 23, key_2 => [ 0.123, -1.234, -2.345 ] }) throws correct exception}
 1193     );
 1194     throws_ok(    # TNVAVRVHVRV12
 1195         sub {
 1196             number_arrayref_hashref_to_string({
 1197                 key_0 => [ 0.1,    1,      2.3   ],
 1198                 key_1 => 23.42,
 1199                 key_2 => [ 0.123, -1.234, -2.345 ]
 1200             });
 1201         },
 1202         "/ENVAVRVHVRV03.*$mode_tagline/",
 1203         q{TNVAVRVHVRV12 number_arrayref_hashref_to_string({ key_0 => [ 0.1, 1, 2.3 ], key_1 => 23.42, key_2 => [ 0.123, -1.234, -2.345 ] }) throws correct exception}
 1204     );
 1205     throws_ok(    # TNVAVRVHVRV13
 1206         sub {
 1207             number_arrayref_hashref_to_string({
 1208                 key_0 => [ 0.1,    1,      2.3   ],
 1209                 key_1 => 'howdy',
 1210                 key_2 => [ 0.123, -1.234, -2.345 ]
 1211             });
 1212         },
 1213         "/ENVAVRVHVRV03.*$mode_tagline/",
 1214         q{TNVAVRVHVRV13 number_arrayref_hashref_to_string({ key_0 => [ 0.1, 1, 2.3 ], key_1 => 'howdy', key_2 => [ 0.123, -1.234, -2.345 ] }) throws correct exception}
 1215     );
 1216     throws_ok(    # TNVAVRVHVRV14
 1217         sub {
 1218             number_arrayref_hashref_to_string({
 1219                 key_0 => [ 0.1,    1,      2.3   ],
 1220                 key_1 => { subkey_10 => 23.42 },
 1221                 key_2 => [ 0.123, -1.234, -2.345 ]
 1222             });
 1223         },
 1224         "/ENVAVRVHVRV03.*$mode_tagline/",
 1225         q{TNVAVRVHVRV14 number_arrayref_hashref_to_string({ key_0 => [ 0.1, 1, 2.3 ], key_1 => { subkey_10 => 23.42 }, key_2 => [ 0.123, -1.234, -2.345 ] }) throws correct exception}
 1226     );
 1227 
 1228     throws_ok(    # TNVAVRVHVRV20
 1229         sub {
 1230             number_arrayref_hashref_to_string({
 1231                 key_0 => [ 0.1,    1,      undef ],
 1232                 key_1 => [ 5.67,   6.78,   7.89  ],
 1233                 key_2 => [ 0.123, -1.234, -2.345 ]
 1234             });
 1235         },
 1236         "/ENVAVRVHVRV04.*$mode_tagline/",
 1237         q{TNVAVRVHVRV20 number_arrayref_hashref_to_string({ key_0 => [ 0.1, 1, undef ], key_1 => [ 5.67, 6.78, 7.89 ], key_2 => [ 0.123, -1.234, -2.345 ] }) throws correct exception}
 1238     );
 1239     throws_ok(    # TNVAVRVHVRV21
 1240         sub {
 1241             number_arrayref_hashref_to_string({
 1242                 key_0 => [ 0.1,    1,      2.3   ],
 1243                 key_1 => [ 5.67,   undef,  7.89  ],
 1244                 key_2 => [ 0.123, -1.234, -2.345 ]
 1245             });
 1246         },
 1247         "/ENVAVRVHVRV04.*$mode_tagline/",
 1248         q{TNVAVRVHVRV21 number_arrayref_hashref_to_string({ key_0 => [ 0.1, 1, 2.3 ], key_1 => [ 5.67, undef, 7.89 ], key_2 => [ 0.123, -1.234, -2.345 ] }) throws correct exception}
 1249     );
 1250     throws_ok(    # TNVAVRVHVRV22
 1251         sub {
 1252             number_arrayref_hashref_to_string({
 1253                 key_0 => [ 0.1,    1,      2.3   ],
 1254                 key_1 => [ 5.67,   6.78,   7.89  ],
 1255                 key_2 => [ undef, -1.234, -2.345 ]
 1256             });
 1257         },
 1258         "/ENVAVRVHVRV04.*$mode_tagline/",
 1259         q{TNVAVRVHVRV22 number_arrayref_hashref_to_string({ key_0 => [ 0.1, 1, 2.3 ], key_1 => [ 5.67, 6.78, 7.89 ], key_2 => [  undef, -1.234, -2.345 ] }) throws correct exception}
 1260     );
 1261 
 1262     throws_ok(    # TNVAVRVHVRV30
 1263         sub {
 1264             number_arrayref_hashref_to_string({
 1265                 key_0 => [ 0.1,    1,      2.3   ],
 1266                 key_1 => [ 5.67,  '6.78',  7.89  ],
 1267                 key_2 => [ 0.123, -1.234, -2.345 ]
 1268             });
 1269         },
 1270         "/ENVAVRVHVRV05.*$mode_tagline/",
 1271         q{TNVAVRVHVRV30 number_arrayref_hashref_to_string({ key_0 => [ 0.1, 1, 2.3 ], key_1 => [ 5.67,  '6.78',  7.89 ], key_2 => [ 0.123, -1.234, -2.345 ] }) throws correct exception}
 1272     );
 1273     throws_ok(    # TNVAVRVHVRV31
 1274         sub {
 1275             number_arrayref_hashref_to_string({
 1276                 key_0 => [ 0.1,    1,      2.3   ],
 1277                 key_1 => [ 5.67,   6.78,   7.89  ],
 1278                 key_2 => [ 0.123, -1.234, [ -2.345 ] ]
 1279             });
 1280         },
 1281         "/ENVAVRVHVRV05.*$mode_tagline/",
 1282         q{TNVAVRVHVRV31 number_arrayref_hashref_to_string({ key_0 => [ 0.1, 1, 2.3 ], key_1 => [ 5.67, 6.78, 7.89 ], key_2 => [ 0.123, -1.234, [ -2.345 ] ] }) throws correct exception}
 1283     );
 1284     throws_ok(    # TNVAVRVHVRV32
 1285         sub {
 1286             number_arrayref_hashref_to_string({
 1287                 key_0 => [ 0.1,    1,      2.3   ],
 1288                 key_1 => [ 5.67,   { subkey_11 => 6.78 },   7.89  ],
 1289                 key_2 => [ 0.123, -1.234, -2.345 ]
 1290             });
 1291         },
 1292         "/ENVAVRVHVRV05.*$mode_tagline/",
 1293         q{TNVAVRVHVRV32 number_arrayref_hashref_to_string({ key_0 => [ 0.1, 1, 2.3 ], key_1 => [ 5.67, { subkey_11 => 6.78 }, 7.89 ], key_2 => [ 0.123, -1.234, -2.345 ] }) throws correct exception}
 1294     );
 1295 
 1296     lives_and(    # TNVAVRVHVRV40
 1297         sub {
 1298             is( number_arrayref_hashref_to_string( { key_0 => [ 0.1, 1, 2.3 ] } ), q{{ 'key_0' => [ 0.1, 1, 2.3 ] }}, q{TNVAVRVHVRV40 number_arrayref_hashref_to_string({ key_0 => [ 0.1, 1,   2.3 ] }) returns correct value} );
 1299         },
 1300         q{TNVAVRVHVRV40 number_arrayref_hashref_to_string({ key_0 => [ 0.1, 1, 2.3 ] }) lives}
 1301     );
 1302     lives_and(    # TNVAVRVHVRV51
 1303         sub { like(
 1304             number_arrayref_hashref_to_string({
 1305                 key_0 => [ 0.1,    1,      2.3   ],
 1306                 key_1 => [ 5.67,   6.78,   7.89  ],
 1307                 key_2 => [ 0.123, -1.234, -2.345 ]
 1308             }),
 1309 
 1310              # NEED FIX: replace ".*" near end of this & following regexes with syntax to match exactly 6 occurrences of ", "; (,\s)* and variations don't work?
 1311             q{/^\\\{\s(?=.*'key_0' => \[ 0.1, 1, 2.3 \])(?=.*'key_1' => \[ 5.67, 6.78, 7.89 \])(?=.*'key_2' => \[ 0.123, -1.234, -2.345 \]).*\s\}$/m},
 1312             q{TNVAVRVHVRV51 number_arrayref_hashref_to_string({ key_0 => [ 0.1, 1, 2.3 ], key_1 => [ 5.67, 6.78, 7.89 ], key_2 => [ 0.123, -1.234, -2.345 ] }) returns correct value}
 1313         ); },
 1314         q{TNVAVRVHVRV51 number_arrayref_hashref_to_string({ key_0 => [ 0.1, 1, 2.3 ], key_1 => [ 5.67, 6.78, 7.89 ], key_2 => [ 0.123, -1.234, -2.345 ] }) lives}
 1315     );
 1316     lives_and(    # TNVAVRVHVRV52
 1317         sub { like(
 1318             number_arrayref_hashref_to_string_compact({
 1319                 key_0 => [ 0.1,    1,      2.3   ],
 1320                 key_1 => [ 5.67,   6.78,   7.89  ],
 1321                 key_2 => [ 0.123, -1.234, -2.345 ]
 1322             }),
 1323 
 1324              # NEED FIX: replace ".*" near end of this & following regexes with syntax to match exactly 6 occurrences of ", "; (,\s)* and variations don't work?
 1325             q{/^\\\{(?=.*'key_0'=>\[0.1,1,2.3\])(?=.*'key_1'=>\[5.67,6.78,7.89\])(?=.*'key_2'=>\[0.123,-1.234,-2.345\]).*\}$/m},
 1326             q{TNVAVRVHVRV52 number_arrayref_hashref_to_string_compact({ key_0 => [ 0.1, 1, 2.3 ], key_1 => [ 5.67, 6.78, 7.89 ], key_2 => [ 0.123, -1.234, -2.345 ] }) returns correct value}
 1327         ); },
 1328         q{TNVAVRVHVRV52 number_arrayref_hashref_to_string_compact({ key_0 => [ 0.1, 1, 2.3 ], key_1 => [ 5.67, 6.78, 7.89 ], key_2 => [ 0.123, -1.234, -2.345 ] }) lives}
 1329     );
 1330     lives_and(    # TNVAVRVHVRV53
 1331         sub { like(
 1332             number_arrayref_hashref_to_string_pretty({
 1333                 key_0 => [ 0.1,    1,      2.3   ],
 1334                 key_1 => [ 5.67,   6.78,   7.89  ],
 1335                 key_2 => [ 0.123, -1.234, -2.345 ]
 1336             }),
 1337 
 1338             # NEED FIX: replace ".*" near end of this & following regexes with syntax to match exactly 6 occurrences of ", "; (,\s)* and variations don't work?
 1339             # DEV NOTE: must have 's' regex modifier to treat multi-line string as single line
 1340             q{/^\{(?=.*\n    'key_0' => \[ 0.1, 1, 2.3 \])(?=.*\n    'key_1' => \[ 5.67, 6.78, 7.89 \])(?=.*\n    'key_2' => \[ 0.123, -1.234, -2.345 \]).*\}$/ms},
 1341             q{TNVAVRVHVRV53 number_arrayref_hashref_to_string_pretty({ key_0 => [ 0.1, 1, 2.3 ], key_1 => [ 5.67, 6.78, 7.89 ], key_2 => [ 0.123, -1.234, -2.345 ] }) returns correct value}
 1342         ); },
 1343         q{TNVAVRVHVRV53 number_arrayref_hashref_to_string_pretty({ key_0 => [ 0.1, 1, 2.3 ], key_1 => [ 5.67, 6.78, 7.89 ], key_2 => [ 0.123, -1.234, -2.345 ] }) lives}
 1344     );
 1345 
 1346     throws_ok(    # TNVAVRVHVRV60
 1347         sub { number_arrayref_hashref_typetest0() },
 1348         "/(ENVAVRVHVRV00.*$mode_tagline)|(Usage.*number_arrayref_hashref_typetest0)/",    # DEV NOTE: 2 different error messages, RPerl & C
 1349         q{TNVAVRVHVRV60 number_arrayref_hashref_typetest0() throws correct exception}
 1350     );
 1351     throws_ok(    # TNVAVRVHVRV61
 1352         sub { number_arrayref_hashref_typetest0(2) },
 1353         "/ENVAVRVHVRV01.*$mode_tagline/",
 1354         q{TNVAVRVHVRV61 number_arrayref_hashref_typetest0(2) throws correct exception}
 1355     );
 1356     throws_ok(    # TNVAVRVHVRV62
 1357         sub {
 1358             number_arrayref_hashref_typetest0({
 1359                 key_0 => [ 0.1,    1,      2.3   ],
 1360                 key_1 => undef,
 1361                 key_2 => [ 0.123, -1.234, -2.345 ]
 1362             });
 1363         },
 1364         "/ENVAVRVHVRV02.*$mode_tagline/",
 1365         q{TNVAVRVHVRV62 number_arrayref_hashref_typetest0({ key_0 => [ 0.1, 1, 2.3 ], key_1 => undef, key_2 => [ 0.123, -1.234, -2.345 ] }) throws correct exception}
 1366     );
 1367     throws_ok(    # TNVAVRVHVRV63
 1368         sub {
 1369             number_arrayref_hashref_typetest0({
 1370                 key_0 => [ 0.1,    1,      2.3   ],
 1371                 key_1 => 5.67,
 1372                 key_2 => [ 0.123, -1.234, -2.345 ]
 1373             });
 1374         },
 1375         "/ENVAVRVHVRV03.*$mode_tagline/",
 1376         q{TNVAVRVHVRV63 number_arrayref_hashref_typetest0({ key_0 => [ 0.1, 1, 2.3 ], key_1 => 5.67, key_2 => [ 0.123, -1.234, -2.345 ] }) throws correct exception}
 1377     );
 1378     lives_and(    # TNVAVRVHVRV64
 1379         sub {
 1380             like( number_arrayref_hashref_typetest0({
 1381                 key_0 => [ 0.1,    1,      2.3   ],
 1382                 key_1 => [ 5.67,   6.78,   7.89  ],
 1383                 key_2 => [ 0.123, -1.234, -2.345 ]
 1384             }),
 1385                 q{/^\{(?=.*'key_0' => \[ 0.1, 1, 2.3 \])(?=.*'key_1' => \[ 5.67, 6.78, 7.89 \])(?=.*'key_2' => \[ 0.123, -1.234, -2.345 \]).*\}} . $mode_tagline . q{$/ms},
 1386                 q{TNVAVRVHVRV64 number_arrayref_hashref_typetest0({ key_0 => [ 0.1, 1, 2.3 ], key_1 => [ 5.67, 6.78, 7.89  ], key_2 => [ 0.123, -1.234, -2.345 ] }) returns correct value}
 1387             );
 1388         },
 1389         q{TNVAVRVHVRV64 number_arrayref_hashref_typetest0({ key_0 => [ 0.1, 1, 2.3 ], key_1 => [ 5.67, 6.78, 7.89 ], key_2 => [ 0.123, -1.234, -2.345 ] }) lives}
 1390     );
 1391 
 1392     # perl -e 'use RPerl; use RPerl::DataStructure::Hash::SubTypes2D qw(number_arrayref_hashref_typetest1); print number_arrayref_hashref_to_string_pretty(number_arrayref_hashref_typetest1(5)), "\n";'
 1393     lives_and(    # TNVAVRVHVRV70
 1394         sub {
 1395             is_deeply(
 1396                 number_arrayref_hashref_typetest1(5),
 1397                 {   
 1398                     "$mode_tagline\_funkey0" => [ 0, 0, 0, 0, 0 ],
 1399                     "$mode_tagline\_funkey1" => [ 0,  5.123_456_789, 10.246_913_578, 15.370_370_367, 20.493_827_156 ],
 1400                     "$mode_tagline\_funkey2" => [ 0, 10.246_913_578, 20.493_827_156, 30.740_740_734, 40.987_654_312 ],
 1401                     "$mode_tagline\_funkey3" => [ 0, 15.370_370_367, 30.740_740_734, 46.111_111_101, 61.481_481_468 ],
 1402                     "$mode_tagline\_funkey4" => [ 0, 20.493_827_156, 40.987_654_312, 61.481_481_468, 81.975_308_624 ]
 1403                 },
 1404                 q{TNVAVRVHVRV70 number_arrayref_hashref_typetest1(5) returns correct value}
 1405             );
 1406         },
 1407         q{TNVAVRVHVRV70 number_arrayref_hashref_typetest1(5) lives}
 1408     );
 1409 
 1410     # [[[ STRING ARRAY REF HASH REF TESTS ]]]
 1411     # [[[ STRING ARRAY REF HASH REF TESTS ]]]
 1412     # [[[ STRING ARRAY REF HASH REF TESTS ]]]
 1413 
 1414 =DISABLE_TEST_DATA
 1415 { key_0 => [ '0', '1', '2' ], key_1 => [ 'a', 'b', 'c' ], key_2 => [ 'h i', '', "\n" ] }
 1416 {
 1417     key_0 => [ '0', '1', '2'  ],
 1418     key_1 => [ 'a', 'b', 'c'  ],
 1419     key_2 => [ 'h i', '', "\n" ]
 1420 }
 1421             {
 1422                 key_0 => [ '0', '1', '2'  ],
 1423                 key_1 => [ 'a', 'b', 'c'  ],
 1424                 key_2 => [ 'h i', '', "\n" ]
 1425             }
 1426 =cut
 1427 
 1428     throws_ok(    # TPVAVRVHVRV00
 1429         sub { string_arrayref_hashref_to_string() },
 1430         "/(EPVAVRVHVRV00.*$mode_tagline)|(Usage.*string_arrayref_hashref_to_string)/",    # DEV NOTE: 2 different error messages, RPerl & C
 1431         q{TPVAVRVHVRV00 string_arrayref_hashref_to_string() throws correct exception}
 1432     );
 1433     throws_ok(                                                                # TPVAVRVHVRV01
 1434         sub { string_arrayref_hashref_to_string(undef) },
 1435         "/EPVAVRVHVRV00.*$mode_tagline/",
 1436         q{TPVAVRVHVRV01 string_arrayref_hashref_to_string(undef) throws correct exception}
 1437     );
 1438     throws_ok(                                                                # TPVAVRVHVRV02
 1439         sub { string_arrayref_hashref_to_string(2) },
 1440         "/EPVAVRVHVRV01.*$mode_tagline/",
 1441         q{TPVAVRVHVRV02 string_arrayref_hashref_to_string(2) throws correct exception}
 1442     );
 1443     throws_ok(                                                                # TPVAVRVHVRV03
 1444         sub { string_arrayref_hashref_to_string(2.3) },
 1445         "/EPVAVRVHVRV01.*$mode_tagline/",
 1446         q{TPVAVRVHVRV03 string_arrayref_hashref_to_string(2.3) throws correct exception}
 1447     );
 1448     throws_ok(                                                                # TPVAVRVHVRV04
 1449         sub { string_arrayref_hashref_to_string('2') },
 1450         "/EPVAVRVHVRV01.*$mode_tagline/",
 1451         q{TPVAVRVHVRV04 string_arrayref_hashref_to_string('2') throws correct exception}
 1452     );
 1453     throws_ok(                                                                # TPVAVRVHVRV05
 1454         sub { string_arrayref_hashref_to_string([ 2 ]) },
 1455         "/EPVAVRVHVRV01.*$mode_tagline/",
 1456         q{TPVAVRVHVRV05 string_arrayref_hashref_to_string([ 2 ]) throws correct exception}
 1457     );
 1458 
 1459     throws_ok(    # TPVAVRVHVRV10
 1460         sub {
 1461             string_arrayref_hashref_to_string({
 1462                 key_0 => [ '0', '1', '2'  ],
 1463                 key_1 => undef,
 1464                 key_2 => [ 'h i', '', "\n" ]
 1465             });
 1466         },
 1467         "/EPVAVRVHVRV02.*$mode_tagline/",
 1468         q{TPVAVRVHVRV10 string_arrayref_hashref_to_string({ key_0 => [ '0', '1', '2' ], key_1 => undef, key_2 => [ 'h i', '', "\n" ] }) throws correct exception}
 1469     );
 1470     throws_ok(    # TPVAVRVHVRV11
 1471         sub {
 1472             string_arrayref_hashref_to_string({
 1473                 key_0 => [ '0', '1', '2'  ],
 1474                 key_1 => 23,
 1475                 key_2 => [ 'h i', '', "\n" ]
 1476             });
 1477         },
 1478         "/EPVAVRVHVRV03.*$mode_tagline/",
 1479         q{TPVAVRVHVRV11 string_arrayref_hashref_to_string({ key_0 => [ '0', '1', '2' ], key_1 => 23, key_2 => [ 'h i', '', "\n" ] }) throws correct exception}
 1480     );
 1481     throws_ok(    # TPVAVRVHVRV12
 1482         sub {
 1483             string_arrayref_hashref_to_string({
 1484                 key_0 => [ '0', '1', '2'  ],
 1485                 key_1 => 23.42,
 1486                 key_2 => [ 'h i', '', "\n" ]
 1487             });
 1488         },
 1489         "/EPVAVRVHVRV03.*$mode_tagline/",
 1490         q{TPVAVRVHVRV12 string_arrayref_hashref_to_string({ key_0 => [ '0', '1', '2' ], key_1 => 23.42, key_2 => [ 'h i', '', "\n" ] }) throws correct exception}
 1491     );
 1492     throws_ok(    # TPVAVRVHVRV13
 1493         sub {
 1494             string_arrayref_hashref_to_string({
 1495                 key_0 => [ '0', '1', '2'  ],
 1496                 key_1 => 'h i',
 1497                 key_2 => [ 'h i', '', "\n" ]
 1498             });
 1499         },
 1500         "/EPVAVRVHVRV03.*$mode_tagline/",
 1501         q{TPVAVRVHVRV13 string_arrayref_hashref_to_string({ key_0 => [ '0', '1', '2' ], key_1 => 'h i', key_2 => [ 'h i', '', "\n" ] }) throws correct exception}
 1502     );
 1503     throws_ok(    # TPVAVRVHVRV14
 1504         sub {
 1505             string_arrayref_hashref_to_string({
 1506                 key_0 => [ '0', '1', '2'  ],
 1507                 key_1 => { subkey_10 => 'h i' },
 1508                 key_2 => [ 'h i', '', "\n" ]
 1509             });
 1510         },
 1511         "/EPVAVRVHVRV03.*$mode_tagline/",
 1512         q{TPVAVRVHVRV14 string_arrayref_hashref_to_string({ key_0 => [ '0', '1', '2' ], key_1 => { subkey_10 => 'h i' }, key_2 => [ 'h i', '', "\n" ] }) throws correct exception}
 1513     );
 1514 
 1515     throws_ok(    # TPVAVRVHVRV20
 1516         sub {
 1517             string_arrayref_hashref_to_string({
 1518                 key_0 => [ '0', '1', undef  ],
 1519                 key_1 => [ 'a', 'b', 'c'  ],
 1520                 key_2 => [ 'h i', '', "\n" ]
 1521             });
 1522         },
 1523         "/EPVAVRVHVRV04.*$mode_tagline/",
 1524         q{TPVAVRVHVRV20 string_arrayref_hashref_to_string({ key_0 => [ '0', '1', undef ], key_1 => [ 'a', 'b', 'c' ], key_2 => [ 'h i', '', "\n" ] }) throws correct exception}
 1525     );
 1526     throws_ok(    # TPVAVRVHVRV21
 1527         sub {
 1528             string_arrayref_hashref_to_string({
 1529                 key_0 => [ '0', '1', '2'  ],
 1530                 key_1 => [ 'a', undef, 'c' ],
 1531                 key_2 => [ 'h i', '', "\n" ]
 1532             });
 1533         },
 1534         "/EPVAVRVHVRV04.*$mode_tagline/",
 1535         q{TPVAVRVHVRV21 string_arrayref_hashref_to_string({ key_0 => [ '0', '1', '2' ], key_1 => [ 'a', undef, 'c' ], key_2 => [ 'h i', '', "\n" ] }) throws correct exception}
 1536     );
 1537     throws_ok(    # TPVAVRVHVRV22
 1538         sub {
 1539             string_arrayref_hashref_to_string({
 1540                 key_0 => [ '0', '1', '2'  ],
 1541                 key_1 => [ 'a', 'b', 'c'  ],
 1542                 key_2 => [ undef, '', "\n" ]
 1543             });
 1544         },
 1545         "/EPVAVRVHVRV04.*$mode_tagline/",
 1546         q{TPVAVRVHVRV22 string_arrayref_hashref_to_string({ key_0 => [ '0', '1', '2' ], key_1 => [ 'a', 'b', 'c' ], key_2 => [  undef, '', "\n" ] }) throws correct exception}
 1547     );
 1548     
 1549 
 1550     throws_ok(    # TPVAVRVHVRV30
 1551         sub {
 1552             string_arrayref_hashref_to_string({
 1553                 key_0 => [ 0, '1', '2'  ],
 1554                 key_1 => [ 'a', 'b', 'c'  ],
 1555                 key_2 => [ 'h i', '', "\n" ]
 1556             });
 1557         },
 1558         "/EPVAVRVHVRV05.*$mode_tagline/",
 1559         q{TPVAVRVHVRV30 string_arrayref_hashref_to_string({ key_0 => [ 0, '1', '2' ], key_1 => [ 'a', 'b', 'c' ], key_2 => [ 'h i', '', "\n" ] }) throws correct exception}
 1560     );
 1561     throws_ok(    # TPVAVRVHVRV31
 1562         sub {
 1563             string_arrayref_hashref_to_string({
 1564                 key_0 => [ '0',  '1', '2' ],
 1565                 key_1 => [ 'a', 6.78, 'c' ],
 1566                 key_2 => [ 'h i', '', "\n" ]
 1567             });
 1568         },
 1569         "/EPVAVRVHVRV05.*$mode_tagline/",
 1570         q{TPVAVRVHVRV31 string_arrayref_hashref_to_string({ key_0 => [ '0', '1', '2' ], key_1 => [ 'a', 6.78, 'c' ], key_2 => [ 'h i', '', "\n" ] }) throws correct exception}
 1571     );
 1572     throws_ok(    # TPVAVRVHVRV32
 1573         sub {
 1574             string_arrayref_hashref_to_string({
 1575                 key_0 => [ '0', '1', '2'  ],
 1576                 key_1 => [ 'a', 'b', 'c'  ],
 1577                 key_2 => [ 'h i', '', [ "\n" ] ]
 1578             });
 1579         },
 1580         "/EPVAVRVHVRV05.*$mode_tagline/",
 1581         q{TPVAVRVHVRV32 string_arrayref_hashref_to_string({ key_0 => [ '0', '1', '2' ], key_1 => [ 'a', 'b', 'c' ], key_2 => [ 'h i', '', [ "\n" ] ] }) throws correct exception}
 1582     );
 1583     throws_ok(    # TPVAVRVHVRV33
 1584         sub {
 1585             string_arrayref_hashref_to_string({
 1586                 key_0 => [ '0', '1', '2'  ],
 1587                 key_1 => [ 'a', { subkey_11 => 'b' }, 'c'  ],
 1588                 key_2 => [ 'h i', '', "\n" ]
 1589             });
 1590         },
 1591         "/EPVAVRVHVRV05.*$mode_tagline/",
 1592         q{TPVAVRVHVRV33 string_arrayref_hashref_to_string({ key_0 => [ '0', '1', '2' ], key_1 => [ 'a', { subkey_11 => 'b' }, 'c' ], key_2 => [ 'h i', '', "\n" ] }) throws correct exception}
 1593     );
 1594 
 1595     lives_and(    # TPVAVRVHVRV40
 1596         sub {
 1597             is( string_arrayref_hashref_to_string( { key_0 => [ '0', '1', '2' ] } ), q{{ 'key_0' => [ '0', '1', '2' ] }}, q{TPVAVRVHVRV40 string_arrayref_hashref_to_string({ key_0 => [ '0', '1', '2' ] }) returns correct value} );
 1598         },
 1599         q{TPVAVRVHVRV40 string_arrayref_hashref_to_string({ key_0 => [ '0', '1', '2' ] }) lives}
 1600     );
 1601     lives_and(    # TPVAVRVHVRV51
 1602         sub { like(
 1603             string_arrayref_hashref_to_string({
 1604                 key_0 => [ '0', '1', '2'  ],
 1605                 key_1 => [ 'a', 'b', 'c'  ],
 1606                 key_2 => [ 'h i', '', "\n" ]
 1607             }),
 1608 
 1609             # NEED FIX: replace ".*" near end of this & following regexes with syntax to match exactly 6 occurrences of ", "; (,\s)* and variations don't work?
 1610             # DEV NOTE: must have 's' regex modifier to treat multi-line string as single line, and must replace double-quotes w/ single-quotes per RPerl's string output default
 1611             q{/^\\\{\s(?=.*'key_0' => \[ '0', '1', '2' \])(?=.*'key_1' => \[ 'a', 'b', 'c' \])(?=.*'key_2' => \[ 'h i', '', '\n' \]).*\s\}$/ms},
 1612             q{TPVAVRVHVRV51 string_arrayref_hashref_to_string({ key_0 => [ '0', '1', '2' ], key_1 => [ 'a', 'b', 'c' ], key_2 => [ 'h i', '', "\n" ] }) returns correct value}
 1613         ); },
 1614         q{TPVAVRVHVRV51 string_arrayref_hashref_to_string({ key_0 => [ '0', '1', '2' ], key_1 => [ 'a', 'b', 'c' ], key_2 => [ 'h i', '', "\n" ] }) lives}
 1615     );
 1616     lives_and(    # TPVAVRVHVRV52
 1617         sub { like(
 1618             string_arrayref_hashref_to_string_compact({
 1619                 key_0 => [ '0', '1', '2'  ],
 1620                 key_1 => [ 'a', 'b', 'c'  ],
 1621                 key_2 => [ 'h i', '', "\n" ]
 1622             }),
 1623 
 1624             # NEED FIX: replace ".*" near end of this & following regexes with syntax to match exactly 6 occurrences of ", "; (,\s)* and variations don't work?
 1625             # DEV NOTE: must have 's' regex modifier to treat multi-line string as single line, and must replace double-quotes w/ single-quotes per RPerl's string output default
 1626             q{/^\\\{(?=.*'key_0'=>\['0','1','2'\])(?=.*'key_1'=>\['a','b','c'\])(?=.*'key_2'=>\['h i','','\n'\]).*\}$/ms},
 1627             q{TPVAVRVHVRV52 string_arrayref_hashref_to_string_compact({ key_0 => [ '0', '1', '2' ], key_1 => [ 'a', 'b', 'c' ], key_2 => [ 'h i', '', "\n" ] }) returns correct value}
 1628         ); },
 1629         q{TPVAVRVHVRV52 string_arrayref_hashref_to_string_compact({ key_0 => [ '0', '1', '2' ], key_1 => [ 'a', 'b', 'c' ], key_2 => [ 'h i', '', "\n" ] }) lives}
 1630     );
 1631     lives_and(    # TPVAVRVHVRV53
 1632         sub { like(
 1633             string_arrayref_hashref_to_string_pretty({
 1634                 key_0 => [ '0', '1', '2'  ],
 1635                 key_1 => [ 'a', 'b', 'c'  ],
 1636                 key_2 => [ 'h i', '', "\n" ]
 1637             }),
 1638 
 1639             # NEED FIX: replace ".*" near end of this & following regexes with syntax to match exactly 6 occurrences of ", "; (,\s)* and variations don't work?
 1640             # DEV NOTE: must have 's' regex modifier to treat multi-line string as single line, and must replace double-quotes w/ single-quotes per RPerl's string output default
 1641             q{/^\{(?=.*\n    'key_0' => \[ '0', '1', '2' \])(?=.*\n    'key_1' => \[ 'a', 'b', 'c' \])(?=.*\n    'key_2' => \[ 'h i', '', '\n' \]).*\}$/ms},
 1642             q{TPVAVRVHVRV53 string_arrayref_hashref_to_string_pretty({ key_0 => [ '0', '1', '2' ], key_1 => [ 'a', 'b', 'c' ], key_2 => [ 'h i', '', "\n" ] }) returns correct value}
 1643         ); },
 1644         q{TPVAVRVHVRV53 string_arrayref_hashref_to_string_pretty({ key_0 => [ '0', '1', '2' ], key_1 => [ 'a', 'b', 'c' ], key_2 => [ 'h i', '', "\n" ] }) lives}
 1645     );
 1646 
 1647     throws_ok(    # TPVAVRVHVRV60
 1648         sub { string_arrayref_hashref_typetest0() },
 1649         "/(EPVAVRVHVRV00.*$mode_tagline)|(Usage.*string_arrayref_hashref_typetest0)/",    # DEV NOTE: 2 different error messages, RPerl & C
 1650         q{TPVAVRVHVRV60 string_arrayref_hashref_typetest0() throws correct exception}
 1651     );
 1652     throws_ok(    # TPVAVRVHVRV61
 1653         sub { string_arrayref_hashref_typetest0(2) },
 1654         "/EPVAVRVHVRV01.*$mode_tagline/",
 1655         q{TPVAVRVHVRV61 string_arrayref_hashref_typetest0(2) throws correct exception}
 1656     );
 1657     throws_ok(    # TPVAVRVHVRV62
 1658         sub {
 1659             string_arrayref_hashref_typetest0({
 1660                 key_0 => [ '0', '1', '2'  ],
 1661                 key_1 => undef,
 1662                 key_2 => [ 'h i', '', "\n" ]
 1663             });
 1664         },
 1665         "/EPVAVRVHVRV02.*$mode_tagline/",
 1666         q{TPVAVRVHVRV62 string_arrayref_hashref_typetest0({ key_0 => [ '0', '1', '2' ], key_1 => undef, key_2 => [ 'h i', '', "\n" ] }) throws correct exception}
 1667     );
 1668     throws_ok(    # TPVAVRVHVRV63
 1669         sub {
 1670             string_arrayref_hashref_typetest0({
 1671                 key_0 => [ '0', '1', '2'  ],
 1672                 key_1 => 'b',
 1673                 key_2 => [ 'h i', '', "\n" ]
 1674             });
 1675         },
 1676         "/EPVAVRVHVRV03.*$mode_tagline/",
 1677         q{TPVAVRVHVRV63 string_arrayref_hashref_typetest0({ key_0 => [ '0', '1', '2' ], key_1 => 'b', key_2 => [ 'h i', '', "\n" ] }) throws correct exception}
 1678     );
 1679     lives_and(    # TPVAVRVHVRV64
 1680         sub {
 1681             like( string_arrayref_hashref_typetest0({
 1682                 key_0 => [ '0', '1', '2'  ],
 1683                 key_1 => [ 'a', 'b', 'c'  ],
 1684                 key_2 => [ 'h i', '', "\n" ]
 1685             } ),
 1686                 # DEV NOTE: must have 's' regex modifier to treat multi-line string as single line, and must replace double-quotes w/ single-quotes per RPerl's string output default
 1687                 q{/^\{(?=.*'key_0' => \[ '0', '1', '2' \])(?=.*'key_1' => \[ 'a', 'b', 'c' \])(?=.*'key_2' => \[ 'h i', '', '\n' \]).*\}} . $mode_tagline . q{$/ms},
 1688                 q{TPVAVRVHVRV64 string_arrayref_hashref_typetest0({ key_0 => [ '0', '1', '2' ], key_1 => [ 'a', 'b', 'c' ], key_2 => [ 'h i', '', "\n" ] }) returns correct value}
 1689             );
 1690         },
 1691         q{TPVAVRVHVRV64 string_arrayref_hashref_typetest0({ key_0 => [ '0', '1', '2' ], key_1 => [ 'a', 'b', 'c' ], key_2 => [ 'h i', '', "\n" ] }) lives}
 1692     );
 1693 
 1694     # perl -e 'use RPerl; use RPerl::DataStructure::Hash::SubTypes2D qw(string_arrayref_hashref_typetest1); print string_arrayref_hashref_to_string_pretty(string_arrayref_hashref_typetest1(5)), "\n";'
 1695     lives_and(    # TPVAVRVHVRV70
 1696         sub {
 1697             is_deeply(
 1698                 string_arrayref_hashref_typetest1(5),
 1699                 {   
 1700                     "$mode_tagline\_funkey0" => [ 'Jeffy Ten! (0, 0)/4', 'Jeffy Ten! (0, 1)/4', 'Jeffy Ten! (0, 2)/4', 'Jeffy Ten! (0, 3)/4', 'Jeffy Ten! (0, 4)/4' ],
 1701                     "$mode_tagline\_funkey1" => [ 'Jeffy Ten! (1, 0)/4', 'Jeffy Ten! (1, 1)/4', 'Jeffy Ten! (1, 2)/4', 'Jeffy Ten! (1, 3)/4', 'Jeffy Ten! (1, 4)/4' ],
 1702                     "$mode_tagline\_funkey2" => [ 'Jeffy Ten! (2, 0)/4', 'Jeffy Ten! (2, 1)/4', 'Jeffy Ten! (2, 2)/4', 'Jeffy Ten! (2, 3)/4', 'Jeffy Ten! (2, 4)/4' ],
 1703                     "$mode_tagline\_funkey3" => [ 'Jeffy Ten! (3, 0)/4', 'Jeffy Ten! (3, 1)/4', 'Jeffy Ten! (3, 2)/4', 'Jeffy Ten! (3, 3)/4', 'Jeffy Ten! (3, 4)/4' ],
 1704                     "$mode_tagline\_funkey4" => [ 'Jeffy Ten! (4, 0)/4', 'Jeffy Ten! (4, 1)/4', 'Jeffy Ten! (4, 2)/4', 'Jeffy Ten! (4, 3)/4', 'Jeffy Ten! (4, 4)/4' ]
 1705                 },
 1706                 q{TPVAVRVHVRV70 string_arrayref_hashref_typetest1(5) returns correct value}
 1707             );
 1708         },
 1709         q{TPVAVRVHVRV70 string_arrayref_hashref_typetest1(5) lives}
 1710     );
 1711 }
 1712 
 1713 done_testing();