This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
8fae7e4ba2b0b1cb09c4e3ea5f466795a69e2b4a
[perl5.git] / cpan / CPAN-Meta-YAML / t / 03_regression.t
1 #!/usr/bin/perl
2
3 # Testing of common META.yml examples
4
5 use strict;
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 );