File: arrayify.t

package info (click to toggle)
liblist-moreutils-perl 0.430-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid
  • size: 1,228 kB
  • sloc: perl: 13,167; makefile: 17
file content (125 lines) | stat: -rw-r--r-- 3,406 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!perl

use strict ("subs", "vars", "refs");
use warnings ("all");
BEGIN { $ENV{LIST_MOREUTILS_PP} = 1; }
END { delete $ENV{LIST_MOREUTILS_PP} } # for VMS
use lib ("t/lib");
use List::MoreUtils (":all");


use Test::More;
use Test::LMU;
use Tie::Array ();

SCOPE:
{
    my @in  = (1 .. 4, [5 .. 7], 8 .. 11, [[12 .. 17]], 18);
    my @out = arrayify @in;
    is_deeply(\@out, [1 .. 18], "linear flattened int mix i");
}

SCOPE:
{
    my @in  = (1 .. 4, [[5 .. 11]], 12, [[13 .. 17]]);
    my @out = arrayify @in;
    is_deeply(\@out, [1 .. 17], "linear flattened int mix ii");
}

SCOPE:
{
    # typical structure when parsing XML using XML::Hash::XS
    my %src = (
        root => {
            foo_list => {foo_elem => {attr => 42}},
            bar_list => {bar_elem => [{hummel => 2}, {hummel => 3}, {hummel => 5}]}
        }
    );
    my @foo_elems = arrayify $src{root}->{foo_list}->{foo_elem};
    is_deeply(\@foo_elems, [{attr => 42}], "arrayified struct with one element");
    my @bar_elems = arrayify $src{root}->{bar_list}->{bar_elem};
    is_deeply(\@bar_elems, [{hummel => 2}, {hummel => 3}, {hummel => 5}], "arrayified struct with three elements");
}

SCOPE:
{
    my @in;
    tie @in, "Tie::StdArray";
    @in = (1 .. 4, [5 .. 7], 8 .. 11, [[12 .. 17]]);
    my @out = arrayify @in;
    is_deeply(\@out, [1 .. 17], "linear flattened magic int mix");
}

SCOPE:
{
    my (@in, @inner, @innest);
    tie @in,     "Tie::StdArray";
    tie @inner,  "Tie::StdArray";
    tie @innest, "Tie::StdArray";
    @inner  = (5 .. 7);
    @innest = ([12 .. 17]);
    @in     = (1 .. 4, \@inner, 8 .. 11, [@innest]);
    my @out = arrayify @in;
    is_deeply(\@out, [1 .. 17], "linear flattened magic int mixture");
}

SCOPE:
{
    my @in  = (qw(av_make av_undef av_clear), [qw(av_push av_pop)], qw(av_fetch av_store), [['av_shift'], ['av_unshift']]);
    my @out = arrayify @in;
    is_deeply(
        \@out,
        [qw(av_make av_undef av_clear av_push av_pop av_fetch av_store av_shift av_unshift)],
        "linear flattened string mix i"
    );
}

leak_free_ok(
    arrayify => sub {
        my @in  = (1 .. 4, [5 .. 7], 8 .. 11, [[12 .. 17]]);
        my @out = arrayify @in;
    },
    'arrayify magic' => sub {
        my (@in, @inner, @innest);
        tie @in,     "Tie::StdArray";
        tie @inner,  "Tie::StdArray";
        tie @innest, "Tie::StdArray";
        @inner  = (5 .. 7);
        @innest = ([12 .. 17]);
        @in     = (1 .. 4, \@inner, 8 .. 11, [@innest]);
        my @out = arrayify @in;
    }
);

SKIP:
{
    leak_free_ok(
        'arrayify with exception in overloading stringify at begin' => sub {
            my @in = (
                DieOnStringify->new, qw(av_make av_undef av_clear),
                [qw(av_push av_pop)],
                qw(av_fetch av_store),
                [['av_shift'], ['av_unshift']]
            );
            eval { my @out = arrayify @in; };
            diag($@) if ($@);
        },
    );
    leak_free_ok(
        'arrayify with exception in overloading stringify at end' => sub {
            my @in = (
                qw(av_make av_undef av_clear),
                [qw(av_push av_pop)],
                qw(av_fetch av_store),
                [['av_shift'], ['av_unshift']],
                DieOnStringify->new
            );
            eval { my @out = arrayify @in; };
            diag($@) if ($@);
        }
    );
}

done_testing;