This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update CPAN-Meta-YAML to CPAN version 0.010
[perl5.git] / cpan / CPAN-Meta-YAML / t / 03_regression.t
1 # Testing of common META.yml examples
2
3 use strict;
4 use warnings;
5
6 BEGIN {
7     $|  = 1;
8     $^W = 1;
9 }
10
11 use File::Spec::Functions ':ALL';
12 use t::lib::Test;
13 use Test::More tests(37, 0, 13);
14 use CPAN::Meta::YAML qw{
15     Load     Dump
16     LoadFile DumpFile
17     freeze   thaw
18 };
19
20
21
22
23
24 #####################################################################
25 # Check Exports
26
27 ok( defined(&Load),     'Found exported Load function'     );
28 ok( defined(&Dump),     'Found exported Dump function'     );
29 ok( defined(&LoadFile), 'Found exported LoadFile function' );
30 ok( defined(&DumpFile), 'Found exported DumpFile function' );
31 ok( defined(&freeze),   'Found exported freeze function'   );
32 ok( defined(&thaw),     'Found exported thaw functiona'    );
33
34
35
36
37
38 #####################################################################
39 # In META.yml files, some hash keys contain module names
40
41 # Hash key legally containing a colon
42 yaml_ok(
43     "---\nFoo::Bar: 1\n",
44     [ { 'Foo::Bar' => 1 } ],
45     'module_hash_key',
46 );
47
48 # Hash indented
49 yaml_ok(
50       "---\n"
51     . "  foo: bar\n",
52     [ { foo => "bar" } ],
53     'hash_indented',
54 );
55
56
57
58
59
60 #####################################################################
61 # Support for literal multi-line scalars
62
63 # Declarative multi-line scalar
64 yaml_ok(
65       "---\n"
66     . "  foo: >\n"
67     . "     bar\n"
68     . "     baz\n",
69     [ { foo => "bar baz\n" } ],
70     'simple_multiline',
71 );
72
73 # Piped multi-line scalar
74 yaml_ok(
75     <<'END_YAML',
76 ---
77 - |
78   foo
79   bar
80 - 1
81 END_YAML
82     [ [ "foo\nbar\n", 1 ] ],
83     'indented',
84 );
85
86 # ... with a pointless hyphen
87 yaml_ok( <<'END_YAML',
88 ---
89 - |-
90   foo
91   bar
92 - 1
93 END_YAML
94     [ [ "foo\nbar", 1 ] ],
95     'indented',
96 );
97
98
99
100
101
102 #####################################################################
103 # Support for YAML version directives
104
105 # Simple inline case (comment variant)
106 yaml_ok(
107     <<'END_YAML',
108 --- #YAML:1.0
109 foo: bar
110 END_YAML
111     [ { foo => 'bar' } ],
112     'simple_doctype_comment',
113     nosyck   => 1,
114 );
115
116 # Simple inline case (percent variant)
117 yaml_ok(
118     <<'END_YAML',
119 --- %YAML:1.0
120 foo: bar
121 END_YAML
122     [ { foo => 'bar' } ],
123     'simple_doctype_percent',
124     noyamlpm   => 1,
125     noxs       => 1,
126     noyamlperl => 1,
127 );
128
129 # Simple header (comment variant)
130 yaml_ok(
131     <<'END_YAML',
132 %YAML:1.0
133 ---
134 foo: bar
135 END_YAML
136     [ { foo => 'bar' } ],
137     'predocument_1_0',
138     noyamlpm   => 1,
139     nosyck     => 1,
140     noxs       => 1,
141     noyamlperl => 1,
142 );
143
144 # Simple inline case (comment variant)
145 yaml_ok(
146     <<'END_YAML',
147 %YAML 1.1
148 ---
149 foo: bar
150 END_YAML
151     [ { foo => 'bar' } ],
152     'predocument_1_1',
153     noyamlpm   => 1,
154     nosyck     => 1,
155     noyamlperl => 1,
156 );
157
158 # Multiple inline documents (comment variant)
159 yaml_ok(
160     <<'END_YAML',
161 --- #YAML:1.0
162 foo: bar
163 --- #YAML:1.0
164 - 1
165 --- #YAML:1.0
166 foo: bar
167 END_YAML
168     [ { foo => 'bar' }, [ 1 ], { foo => 'bar' } ],
169     'multi_doctype_comment',
170 );
171
172 # Simple pre-document case (comment variant)
173 yaml_ok(
174     <<'END_YAML',
175 %YAML 1.1
176 ---
177 foo: bar
178 END_YAML
179     [ { foo => 'bar' } ],
180     'predocument_percent',
181     noyamlpm   => 1,
182     nosyck     => 1,
183     noyamlperl => 1,
184 );
185
186 # Simple pre-document case (comment variant)
187 yaml_ok(
188     <<'END_YAML',
189 #YAML 1.1
190 ---
191 foo: bar
192 END_YAML
193     [ { foo => 'bar' } ],
194     'predocument_comment',
195 );
196
197
198
199
200
201 #####################################################################
202 # Hitchhiker Scalar
203
204 yaml_ok(
205     <<'END_YAML',
206 --- 42
207 END_YAML
208     [ 42 ],
209     'hitchhiker scalar',
210     serializes => 1,
211 );
212
213
214
215
216
217 #####################################################################
218 # Null HASH/ARRAY
219
220 yaml_ok(
221     <<'END_YAML',
222 ---
223 - foo
224 - {}
225 - bar
226 END_YAML
227     [ [ 'foo', {}, 'bar' ] ],
228     'null hash in array',
229 );
230
231 yaml_ok(
232     <<'END_YAML',
233 ---
234 - foo
235 - []
236 - bar
237 END_YAML
238     [ [ 'foo', [], 'bar' ] ],
239     'null array in array',
240 );
241
242 yaml_ok(
243     <<'END_YAML',
244 ---
245 foo: {}
246 bar: 1
247 END_YAML
248     [  { foo => {}, bar => 1 } ],
249     'null hash in hash',
250 );
251
252 yaml_ok(
253     <<'END_YAML',
254 ---
255 foo: []
256 bar: 1
257 END_YAML
258     [  { foo => [], bar => 1 } ],
259     'null array in hash',
260 );
261
262
263
264
265 #####################################################################
266 # Trailing Whitespace
267
268 yaml_ok(
269     <<'END_YAML',
270 ---
271 abstract: Generate fractal curves
272 foo: ~
273 arr:
274   - foo
275   - ~
276   - 'bar'
277 END_YAML
278     [ {
279         abstract => 'Generate fractal curves',
280         foo      => undef,
281         arr      => [ 'foo', undef, 'bar' ],
282     } ],
283     'trailing whitespace',
284     noyamlperl => 1,
285 );
286
287
288
289
290
291 #####################################################################
292 # Quote vs Hash
293
294 yaml_ok(
295     <<'END_YAML',
296 ---
297 author:
298   - 'mst: Matt S. Trout <mst@shadowcatsystems.co.uk>'
299 END_YAML
300     [ { author => [ 'mst: Matt S. Trout <mst@shadowcatsystems.co.uk>' ] } ],
301     'hash-like quote',
302 );
303
304
305
306
307
308 #####################################################################
309 # Quote and Escaping Idiosyncracies
310
311 yaml_ok(
312     <<'END_YAML',
313 ---
314 name1: 'O''Reilly'
315 name2: 'O''Reilly O''Tool'
316 name3: 'Double '''' Quote'
317 END_YAML
318     [ {
319         name1 => "O'Reilly",
320         name2 => "O'Reilly O'Tool",
321         name3 => "Double '' Quote",
322     } ],
323     'single quote subtleties',
324 );
325
326 yaml_ok(
327     <<'END_YAML',
328 ---
329 slash1: '\\'
330 slash2: '\\foo'
331 slash3: '\\foo\\\\'
332 END_YAML
333     [ {
334         slash1 => "\\\\",
335         slash2 => "\\\\foo",
336         slash3 => "\\\\foo\\\\\\\\",
337     } ],
338     'single quote subtleties',
339 );
340
341
342
343
344
345 #####################################################################
346 # Empty Values and Premature EOF
347
348 yaml_ok(
349     <<'END_YAML',
350 ---
351 foo:    0
352 requires:
353 build_requires:
354 END_YAML
355     [ { foo => 0, requires => undef, build_requires => undef } ],
356     'empty hash keys',
357     noyamlpm   => 1,
358     noyamlperl => 1,
359 );
360
361 yaml_ok(
362     <<'END_YAML',
363 ---
364 - foo
365 -
366 -
367 END_YAML
368     [ [ 'foo', undef, undef ] ],
369     'empty array keys',
370     noyamlpm   => 1,
371     noyamlperl => 1,
372 );
373
374
375
376
377
378 #####################################################################
379 # Comment on the Document Line
380
381 yaml_ok(
382     <<'END_YAML',
383 --- # Comment
384 foo: bar
385 END_YAML
386     [ { foo => 'bar' } ],
387     'comment header',
388     noyamlpm   => 1,
389     noyamlperl => 1,
390 );
391
392
393
394
395
396
397 #####################################################################
398 # Newlines and tabs
399
400 yaml_ok(
401     <<'END_YAML',
402 foo: "foo\\\n\tbar"
403 END_YAML
404     [ { foo => "foo\\\n\tbar" } ],
405     'special characters',
406 );
407
408
409
410
411
412 #####################################################################
413 # Circular Reference Protection
414
415 SCOPE: {
416     my $foo = { a => 'b' };
417     my $bar = [ $foo, 2 ];
418     $foo->{c} = $bar;
419     my $circ = CPAN::Meta::YAML->new( [ $foo, $bar ] );
420     isa_ok( $circ, 'CPAN::Meta::YAML' );
421
422     # When we try to serialize, it should NOT infinite loop
423     my $string = undef;
424        $string = eval { $circ->write_string; };
425     is( $string, undef, '->write_string does not return a value' );
426     ok( $@, 'Error string is defined' );
427     ok(
428         $@ =~ /does not support circular references/,
429         'Got the expected error message',
430     );
431 }
432
433
434
435
436
437 #####################################################################
438 # Confirm we can read the synopsis
439
440 yaml_ok(
441     <<'END_YAML',
442 ---
443 rootproperty: blah
444 section:
445   one: two
446   three: four
447   Foo: Bar
448   empty: ~
449 END_YAML
450     [ {
451         rootproperty => 'blah',
452         section      => {
453             one   => 'two',
454             three => 'four',
455             Foo   => 'Bar',
456             empty => undef,
457         },
458     } ],
459     'synopsis',
460     noyamlperl => 1,
461 );
462
463
464
465
466
467 #####################################################################
468 # Unprintable Characters
469
470 yaml_ok(
471        "--- \"foo\\n\\x00\"\n",
472        [ "foo\n\0" ],
473        'unprintable',
474 );
475
476
477
478
479
480 #####################################################################
481 # Empty Quote Line
482
483 yaml_ok(
484     <<'END_YAML',
485 ---
486 - foo
487 #
488 - bar
489 END_YAML
490     [ [ "foo", "bar" ] ],
491 );
492
493
494
495
496
497 #####################################################################
498 # Indentation after empty hash value
499
500 yaml_ok(
501     <<'END_YAML',
502 ---
503 Test:
504   optmods:
505     Bad: 0
506     Foo: 1
507     Long: 0
508   version: 5
509 Test_IncludeA:
510   optmods:
511 Test_IncludeB:
512   optmods:
513 _meta:
514   name: 'test profile'
515   note: 'note this test profile'
516 END_YAML
517     [ {
518         Test => {
519             optmods => {
520                 Bad => 0,
521                 Foo => 1,
522                 Long => 0,
523             },
524             version => 5,
525         },
526         Test_IncludeA => {
527             optmods => undef,
528         },
529         Test_IncludeB => {
530             optmods => undef,
531         },
532         _meta => {
533             name => 'test profile',
534             note => 'note this test profile',
535         },
536     } ],
537     'Indentation after empty hash value',
538     noyamlperl => 1,
539 );
540
541
542
543
544
545 #####################################################################
546 # Spaces in the Key
547
548 yaml_ok(
549     <<'END_YAML',
550 ---
551 the key: the value
552 END_YAML
553     [ { 'the key' => 'the value' } ],
554 );
555
556
557
558
559
560 #####################################################################
561 # Ticker #32402
562
563 # Tests a particular pathological case
564
565 yaml_ok(
566     <<'END_YAML',
567 ---
568 - value
569 - '><'
570 END_YAML
571     [ [ 'value', '><' ] ],
572     'Pathological >< case',
573 );
574
575
576
577
578
579 #####################################################################
580 # Special Characters
581
582 #yaml_ok(
583 #    <<'END_YAML',
584 #---
585 #- "Ingy d\xC3\xB6t Net"
586 #END_YAML
587 #    [ [ "Ingy d\xC3\xB6t Net" ] ],
588 #);
589
590
591
592
593
594
595 ######################################################################
596 # Non-Indenting Sub-List
597
598 yaml_ok(
599     <<'END_YAML',
600 ---
601 foo:
602 - list
603 bar: value
604 END_YAML
605     [ { foo => [ 'list' ], bar => 'value' } ],
606     'Non-indenting sub-list',
607     noyamlpm   => 1,
608     noyamlperl => 1,
609 );
610
611
612
613
614
615
616 #####################################################################
617 # Check Multiple-Escaping
618
619 # RT #42119: write of two single quotes
620 yaml_ok(
621     "--- \"A'B'C\"\n",
622     [ "A'B'C" ],
623     'Multiple escaping of quote ok',
624 );
625
626 # Escapes without whitespace
627 yaml_ok(
628     "--- A\\B\\C\n",
629     [ "A\\B\\C" ],
630     'Multiple escaping of escape ok',
631 );
632
633 # Escapes with whitespace
634 yaml_ok(
635     "--- 'A\\B \\C'\n",
636     [ "A\\B \\C" ],
637     'Multiple escaping of escape with whitespace ok',
638 );
639
640
641
642
643
644 ######################################################################
645 # Check illegal characters that are in legal places
646
647 yaml_ok(
648     "--- 'Wow!'\n",
649     [ "Wow!" ],
650     'Bang in a quote',
651 );
652 yaml_ok(
653     "--- 'This&that'\n",
654     [ "This&that" ],
655     'Ampersand in a quote',
656 );
657
658
659
660
661
662 ######################################################################
663 # Check for unescaped boolean keywords
664
665 is_deeply(
666     CPAN::Meta::YAML->new( 'True' )->write_string,
667     "--- 'True'\n",
668     'Idiomatic trivial boolean string is escaped',
669 );
670
671 is_deeply( CPAN::Meta::YAML->new( [ qw{
672     null Null NULL
673     y Y yes Yes YES n N no No NO
674     true True TRUE false False FALSE
675     on On ON off Off OFF
676 } ] )->write_string, <<'END_YAML' );
677 ---
678 - 'null'
679 - 'Null'
680 - 'NULL'
681 - 'y'
682 - 'Y'
683 - 'yes'
684 - 'Yes'
685 - 'YES'
686 - 'n'
687 - 'N'
688 - 'no'
689 - 'No'
690 - 'NO'
691 - 'true'
692 - 'True'
693 - 'TRUE'
694 - 'false'
695 - 'False'
696 - 'FALSE'
697 - 'on'
698 - 'On'
699 - 'ON'
700 - 'off'
701 - 'Off'
702 - 'OFF'
703 END_YAML
704
705
706
707
708
709 ######################################################################
710 # Always quote for scalars ending with :
711
712 is_deeply(
713     CPAN::Meta::YAML->new( [ 'A:' ] )->write_string,
714     "---\n- 'A:'\n",
715     'Simple scalar ending in a colon is correctly quoted',
716 );