1#!/usr/bin/perl -w
2
3# This is a test of the fake YAML dumper implemented by EUMM:
4#   ExtUtils::MM_Any::metafile_file
5
6BEGIN {
7    unshift @INC, 't/lib';
8}
9
10use strict;
11use Test::More tests => 16;
12
13require ExtUtils::MM_Any;
14
15my $mm = bless {}, 'ExtUtils::MM_Any';
16
17{
18    my @meta = ( a => 1, b => 2 );
19    my $expected = <<YAML;
20--- #YAML:1.0
21a:  1
22b:  2
23YAML
24
25    is($mm->metafile_file(@meta), $expected, "dump for flat hashes works ok");
26}
27
28{
29    my @meta = ( k1 => 'some key and value', k2 => undef, k3 => 1 );
30    my $expected = <<YAML;
31--- #YAML:1.0
32k1:  some key and value
33k2:  ~
34k3:  1
35YAML
36
37    is($mm->metafile_file(@meta), $expected, "dumping strings and undefs is ok");
38}
39
40{
41    my @meta = ( a => 1, b => 2, h => { hh => 1 } );
42    my $expected = <<YAML;
43--- #YAML:1.0
44a:  1
45b:  2
46h:
47    hh:  1
48YAML
49
50    is($mm->metafile_file(@meta), $expected, "dump for nested hashes works ok");
51}
52
53{
54    my @meta = ( a => 1, b => 2, h => { h1 => 'x', h2 => 'z' } );
55    my $expected = <<YAML;
56--- #YAML:1.0
57a:  1
58b:  2
59h:
60    h1:  x
61    h2:  z
62YAML
63
64    is($mm->metafile_file(@meta), $expected, "nested hashes sort ascii-betically");
65    # to tell the truth, they sort case-insensitively
66    # that's hard to test for Perl with unstable sort's
67}
68
69{
70    my @meta = ( a => 1, b => 2, h => { hh => { hhh => 1 } } );
71    my $expected = <<YAML;
72--- #YAML:1.0
73a:  1
74b:  2
75h:
76    hh:
77        hhh:  1
78YAML
79
80    is($mm->metafile_file(@meta), $expected, "dump for hashes (with more nesting) works ok");
81}
82
83{
84    my @meta = ( a => 1, k => [ qw(w y z) ] );
85    my $expected = <<YAML;
86--- #YAML:1.0
87a:  1
88k:
89    - w
90    - y
91    - z
92YAML
93
94    is($mm->metafile_file(@meta), $expected, "array of strings are handled ok");
95}
96
97is($mm->metafile_file( a => {}, b => [], c => undef ), <<'YAML', 'empty hashes and arrays');
98--- #YAML:1.0
99a:  {}
100b:  []
101c:  ~
102YAML
103
104
105{
106    my @meta = (
107        name => 'My-Module',
108        version => '0.1',
109        version_from => 'lib/My/Module.pm',
110        installdirs => 'site',
111        abstract => 'A does-it-all module',
112        license => 'perl',
113        generated_by => 'myself',
114        author => 'John Doe <doe@doeland.org>',
115        distribution_type => 'module',
116        requires => {
117            'My::Module::Helper' => 0,
118            'Your::Module' => '1.5',
119        },
120        'meta-spec' => {
121            version => '1.1',
122            url => 'http://module-build.sourceforge.net/META-spec-new.html',
123        },
124    );
125    my $expected = <<'YAML';
126--- #YAML:1.0
127name:               My-Module
128version:            0.1
129version_from:       lib/My/Module.pm
130installdirs:        site
131abstract:           A does-it-all module
132license:            perl
133generated_by:       myself
134author:             John Doe <doe@doeland.org>
135distribution_type:  module
136requires:
137    My::Module::Helper:  0
138    Your::Module:        1.5
139meta-spec:
140    url:      http://module-build.sourceforge.net/META-spec-new.html
141    version:  1.1
142YAML
143
144    is($mm->metafile_file(@meta), $expected, "dump for something like META.yml works");
145}
146
147{
148    my @meta = (
149        name => 'My-Module',
150        version => '0.1',
151        version_from => 'lib/My/Module.pm',
152        installdirs => 'site',
153        abstract => 'A does-it-all module',
154        license => 'perl',
155        generated_by => 'myself',
156        author => 'John Doe <doe@doeland.org>',
157        distribution_type => 'module',
158        requires => {
159            'My::Module::Helper' => 0,
160            'Your::Module' => '1.5',
161        },
162        recommends => {
163            'Test::More' => 0,
164            'Test::Pod'  => 1.18,
165            'Test::Pod::Coverage' => 1
166        },
167        'meta-spec' => {
168            version => '1.1',
169            url => 'http://module-build.sourceforge.net/META-spec-new.html',
170        },
171    );
172    my $expected = <<'YAML';
173--- #YAML:1.0
174name:               My-Module
175version:            0.1
176version_from:       lib/My/Module.pm
177installdirs:        site
178abstract:           A does-it-all module
179license:            perl
180generated_by:       myself
181author:             John Doe <doe@doeland.org>
182distribution_type:  module
183requires:
184    My::Module::Helper:  0
185    Your::Module:        1.5
186recommends:
187    Test::More:           0
188    Test::Pod:            1.18
189    Test::Pod::Coverage:  1
190meta-spec:
191    url:      http://module-build.sourceforge.net/META-spec-new.html
192    version:  1.1
193YAML
194
195    is($mm->metafile_file(@meta), $expected, "META.yml with extra 'recommends' works");
196}
197
198{
199    my @meta = (
200        name => 'My-Module',
201        version => '0.1',
202        version_from => 'lib/My/Module.pm',
203        installdirs => 'site',
204        abstract => 'A does-it-all module',
205        license => 'perl',
206        generated_by => 'myself',
207        author => 'John Doe <doe@doeland.org>',
208        distribution_type => 'module',
209        requires => {
210            'My::Module::Helper' => 0,
211            'Your::Module' => '1.5',
212        },
213        recommends => {
214            'Test::More' => 0,
215            'Test::Pod'  => 1.18,
216            'Test::Pod::Coverage' => 1
217        },
218        no_index => {
219            dir => [ qw(inc) ],
220            file => [ qw(TODO NOTES) ],
221        },
222        'meta-spec' => {
223            version => '1.1',
224            url => 'http://module-build.sourceforge.net/META-spec-new.html',
225        },
226    );
227    my $expected = <<'YAML';
228--- #YAML:1.0
229name:               My-Module
230version:            0.1
231version_from:       lib/My/Module.pm
232installdirs:        site
233abstract:           A does-it-all module
234license:            perl
235generated_by:       myself
236author:             John Doe <doe@doeland.org>
237distribution_type:  module
238requires:
239    My::Module::Helper:  0
240    Your::Module:        1.5
241recommends:
242    Test::More:           0
243    Test::Pod:            1.18
244    Test::Pod::Coverage:  1
245no_index:
246    dir:
247        - inc
248    file:
249        - TODO
250        - NOTES
251meta-spec:
252    url:      http://module-build.sourceforge.net/META-spec-new.html
253    version:  1.1
254YAML
255
256    is($mm->metafile_file(@meta), $expected, "META.yml with extra 'no_index' works");
257
258
259    # Make sure YAML.pm can ready our output
260    SKIP: {
261        skip "Need YAML.pm to test if it can load META.yml", 1
262          unless eval { require YAML };
263
264        my $yaml_load = YAML::Load($mm->metafile_file(@meta));
265        is_deeply( $yaml_load, {@meta}, "META.yml can be read by YAML.pm" );
266    }
267
268
269    SKIP: {
270        # Load() behaves diffrently in versions prior to 1.06
271        skip "Need YAML::Tiny to test if it can load META.yml", 2
272          unless eval { require YAML::Tiny } and $YAML::Tiny::VERSION >= 1.06;
273
274        my @yaml_load = YAML::Tiny::Load($mm->metafile_file(@meta));
275        is @yaml_load, 1,               "YAML::Tiny saw one document in META.yml";
276        is_deeply( $yaml_load[0], {@meta}, "META.yml can be read by YAML::Tiny" );
277    }
278}
279
280
281{
282    my @meta = ( k => 'a : b', 'x : y' => 1 );
283    my $expected = <<YAML;
284--- #YAML:1.0
285k:      a : b
286x : y:  1
287YAML
288    # NOTE: the output is not YAML-equivalent to the input
289
290    is($mm->metafile_file(@meta), $expected, "no quoting is done");
291}
292
293{
294    my @meta = ( k => \*STDOUT );
295    eval { $mm->metafile_file(@meta) };
296
297    like($@, qr/^only nested hashes, arrays and objects are supported/,
298         "we don't like but hash/array refs");
299}
300
301{
302    my @meta = ( k => [ [] ] );
303    eval { $mm->metafile_file(@meta) };
304
305    like($@, qr/^only nested arrays of non-refs are supported/,
306         "we also don't like but array of strings");
307}
308
309# recursive data structures: don't even think about it - endless recursion
310