1# Created with: ./make_t.pl
2
3# Contents:
4#1 git54.def
5#2 git54.git54
6#3 fpva.def
7#4 fpva.fpva1
8#5 fpva.fpva2
9#6 lpxl.def
10#7 lpxl.lpxl1
11#8 lpxl.lpxl3
12#9 lpxl.lpxl4
13#10 lpxl.lpxl5
14#11 git63.def
15#12 align35.def
16#13 rt136417.def
17#14 rt136417.rt136417
18#15 numbers.def
19#16 code_skipping.def
20#17 git51.def
21#18 git51.git51
22#19 pretok.def
23
24# To locate test #13 you can search for its name or the string '#13'
25
26use strict;
27use Test::More;
28use Carp;
29use Perl::Tidy;
30my $rparams;
31my $rsources;
32my $rtests;
33
34BEGIN {
35
36    ###########################################
37    # BEGIN SECTION 1: Parameter combinations #
38    ###########################################
39    $rparams = {
40        'def'   => "",
41        'fpva1' => "-sfp",
42        'fpva2' => <<'----------',
43-sfp -wls='->' -wrs='->' -nfpva
44----------
45        'git51' => <<'----------',
46--maximum-line-length=120
47--converge
48--tabs
49--entab-leading-whitespace=4
50--continuation-indentation=4
51--extended-continuation-indentation
52--no-delete-old-newlines
53--no-outdent-long-lines
54--no-outdent-labels
55--novalign
56--no-logical-padding
57--opening-sub-brace-on-new-line
58--square-bracket-tightness=2
59--paren-tightness=2
60--brace-tightness=2
61--opening-token-right
62
63-sal='first any sum sum0 reduce'
64----------
65        'git54' => "-bbp=3 -bbpi=2 -ci=4 -lp",
66        'lpxl1' => "-lp",
67        'lpxl3' => <<'----------',
68-lp -lpxl='{ [ ('
69----------
70        'lpxl4' => <<'----------',
71-lp -lpxl='{ [ W(1'
72----------
73        'lpxl5' => <<'----------',
74-lp -lpxl='{ [ F(2'
75----------
76        'rt136417' => "-vtc=3",
77    };
78
79    ############################
80    # BEGIN SECTION 2: Sources #
81    ############################
82    $rsources = {
83
84        'align35' => <<'----------',
85# different module names, do not align commas (fixes rt136416)
86use File::Spec::Functions 'catfile', 'catdir';
87use Mojo::Base 'Mojolicious', '-signatures';
88
89# same module names, align fat commas
90use constant PI => 4 * atan2 1, 1;
91use constant TWOPI => 2 * PI;
92use constant FOURPI => 4 * PI;
93
94# same module names, align commas
95use TestCounter '3rd-party', 0, '3rd-party no longer visible';
96use TestCounter 'replace', 1, 'replacement now visible';
97use TestCounter 'root';
98
99# same module name, align fat commas but not commas
100use constant COUNTDOWN => scalar reverse 1, 2, 3, 4, 5;
101use constant COUNTUP => reverse 1, 2, 3, 4, 5;
102use constant COUNTDOWN => scalar reverse 1, 2, 3, 4, 5;
103----------
104
105        'code_skipping' => <<'----------',
106%Hdr=%U2E=%E2U=%Fallback=();
107$in_charmap=$nerror=$nwarning=0;
108$.=0;
109#<<V  code skipping: perltidy will pass this verbatim without error checking
110
111    }}} {{{
112
113#>>V
114my $self=shift;
115my $cloning=shift;
116----------
117
118        'fpva' => <<'----------',
119log_something_with_long_function( 'This is a log message.', 2 );
120Coro::AnyEvent::sleep( 3, 4 );
121use Carp ();
122use File::Spec ();
123use File::Path ();
124$self -> method ( 'parameter_0', 'parameter_1' );
125$self -> method_with_long_name ( 'parameter_0', 'parameter_1' );
126----------
127
128        'git51' => <<'----------',
129Type::Libraries->setup_class(
130	__PACKAGE__,
131	qw(
132		Types::Standard
133		Types::Common::Numeric
134		), # <--- brace here
135);
136----------
137
138        'git54' => <<'----------',
139# testing sensitivity to excess commas
140my $definition =>
141    (
142    {
143        key1 => value1
144    },
145    {
146        key2 => value2
147    },
148    );
149
150my $definition =>
151    (
152    {
153        key => value
154    }
155    );
156
157my $definition =>
158    (
159    {
160        key => value
161    },
162    );
163
164my $definition =>
165    (
166    {
167        key => value,
168    },
169    );
170
171my $list =
172    (
173      {
174        key => $value,
175        key => $value,
176        key => $value,
177        key => $value,
178        key => $value,
179      },
180    ) ;
181
182my $list =
183    (
184      {
185        key => $value,
186        key => $value,
187        key => $value,
188        key => $value,
189        key => $value,
190      }
191    ) ;
192----------
193
194        'git63' => <<'----------',
195my $fragment = $parser-> #parse_html_string
196  parse_balanced_chunk($I);
197----------
198
199        'lpxl' => <<'----------',
200# simple function call
201my $loanlength = getLoanLength(
202                                $borrower->{'categorycode'},    # sc1
203                                $iteminformation->{'itemtype'},
204                                $borrower->{'branchcode'}       # sc3
205);
206
207# function call, more than one level deep
208my $o = very::long::class::name->new(
209    {
210        propA => "a",
211        propB => "b",
212        propC => "c",
213    }
214);
215
216# function call with sublist
217debug(
218      "Connecting to DB.",
219      "Extra-Parameters: " . join("<->", $extra_parms),
220      "Config: " . join("<->", %config)
221     );
222
223# simple function call with code block
224$m->command(-label   => 'Save',
225            -command => sub { print "DOS\n"; save_dialog($win); });
226
227# function call, ternary in list
228return
229  OptArgs2::Result->usage(
230    $style == OptArgs2::STYLE_FULL ? 'FullUsage' : 'NormalUsage',
231    'usage: ' . $usage . "\n" );
232
233# not a function call
234%blastparam = (
235    -run            => \%runparam,
236    -file           => '',
237    -parse          => 1,
238    -signif         => 1e-5,
239);
240
241# 'local' is a keyword, not a user function
242    local (
243        $len,    $pts,      @colspec, $char, $cols,
244        $repeat, $celldata, $at_text, $after_text
245    );
246
247# square bracket with sublists
248$data = [
249         ListElem->new(id => 0, val => 100),
250         ListElem->new(id => 2, val => 50),
251         ListElem->new(id => 1, val => 10),
252        ];
253
254# curly brace with sublists
255$behaviour = {
256              cat   => {nap    => "lap",   eat  => "meat"},
257              dog   => {prowl  => "growl", pool => "drool"},
258              mouse => {nibble => "kibble"},
259             };
260----------
261
262        'numbers' => <<'----------',
263# valid numbers
264my @vals = (
265
266    12345,
267    12345.67,
268    .23E-10,
269    3.14_15_92,
270    4_294_967_296,
271    0xff,
272    0xdead_beef,
273    0377,
274    0b011011,
275    0x1.999ap-4,
276    1e34,
277    1e+34,
278    1e+034,
279    -1e+034,
280    0.00000000000000000000000000000000000000000000000000000000000000000001,
281    0Xabcdef,
282    0B1101,
283    0o12_345,  # optional 'o' and 'O' added in perl v5.33.5
284    0O12_345,
285);
286----------
287
288        'pretok' => <<'----------',
289# test sub split_pretoken
290my$s1=$^??"def":"not def";
291my$s2=$^ ?"def":"not def";
292my$s3=$^if($s2);
293my$s4=$^Oeq"linux";
294my$s5=$  ^One"linux";
295my$s6=$
296  ^One"linux";
297my$s7=%^O;
298my$s8='hi'.'s'x10if(1);
299my$s9='merci'x0.1e4.$s8;
300----------
301
302        'rt136417' => <<'----------',
303function(
304  #
305  a, b, c);
306
307%hash = (
308  a => b,
309  c => d,
310);
311----------
312    };
313
314    ####################################
315    # BEGIN SECTION 3: Expected output #
316    ####################################
317    $rtests = {
318
319        'git54.def' => {
320            source => "git54",
321            params => "def",
322            expect => <<'#1...........',
323# testing sensitivity to excess commas
324my $definition => (
325    {
326        key1 => value1
327    },
328    {
329        key2 => value2
330    },
331);
332
333my $definition => (
334    {
335        key => value
336    }
337);
338
339my $definition => (
340    {
341        key => value
342    },
343);
344
345my $definition => (
346    {
347        key => value,
348    },
349);
350
351my $list = (
352    {
353        key => $value,
354        key => $value,
355        key => $value,
356        key => $value,
357        key => $value,
358    },
359);
360
361my $list = (
362    {
363        key => $value,
364        key => $value,
365        key => $value,
366        key => $value,
367        key => $value,
368    }
369);
370#1...........
371        },
372
373        'git54.git54' => {
374            source => "git54",
375            params => "git54",
376            expect => <<'#2...........',
377# testing sensitivity to excess commas
378my $definition =>
379    (
380      {
381         key1 => value1
382      },
383      {
384         key2 => value2
385      },
386    );
387
388my $definition =>
389    (
390      {
391        key => value
392      }
393    );
394
395my $definition =>
396    (
397      {
398         key => value
399      },
400    );
401
402my $definition =>
403    (
404      {
405         key => value,
406      },
407    );
408
409my $list =
410    (
411      {
412         key => $value,
413         key => $value,
414         key => $value,
415         key => $value,
416         key => $value,
417      },
418    );
419
420my $list =
421    (
422      {
423        key => $value,
424        key => $value,
425        key => $value,
426        key => $value,
427        key => $value,
428      }
429    );
430#2...........
431        },
432
433        'fpva.def' => {
434            source => "fpva",
435            params => "def",
436            expect => <<'#3...........',
437log_something_with_long_function( 'This is a log message.', 2 );
438Coro::AnyEvent::sleep( 3, 4 );
439use Carp       ();
440use File::Spec ();
441use File::Path ();
442$self->method( 'parameter_0', 'parameter_1' );
443$self->method_with_long_name( 'parameter_0', 'parameter_1' );
444#3...........
445        },
446
447        'fpva.fpva1' => {
448            source => "fpva",
449            params => "fpva1",
450            expect => <<'#4...........',
451log_something_with_long_function ( 'This is a log message.', 2 );
452Coro::AnyEvent::sleep            ( 3, 4 );
453use Carp       ();
454use File::Spec ();
455use File::Path ();
456$self->method                ( 'parameter_0', 'parameter_1' );
457$self->method_with_long_name ( 'parameter_0', 'parameter_1' );
458#4...........
459        },
460
461        'fpva.fpva2' => {
462            source => "fpva",
463            params => "fpva2",
464            expect => <<'#5...........',
465log_something_with_long_function ( 'This is a log message.', 2 );
466Coro::AnyEvent::sleep ( 3, 4 );
467use Carp ();
468use File::Spec ();
469use File::Path ();
470$self -> method ( 'parameter_0', 'parameter_1' );
471$self -> method_with_long_name ( 'parameter_0', 'parameter_1' );
472#5...........
473        },
474
475        'lpxl.def' => {
476            source => "lpxl",
477            params => "def",
478            expect => <<'#6...........',
479# simple function call
480my $loanlength = getLoanLength(
481    $borrower->{'categorycode'},    # sc1
482    $iteminformation->{'itemtype'},
483    $borrower->{'branchcode'}       # sc3
484);
485
486# function call, more than one level deep
487my $o = very::long::class::name->new(
488    {
489        propA => "a",
490        propB => "b",
491        propC => "c",
492    }
493);
494
495# function call with sublist
496debug(
497    "Connecting to DB.",
498    "Extra-Parameters: " . join( "<->", $extra_parms ),
499    "Config: " . join( "<->", %config )
500);
501
502# simple function call with code block
503$m->command(
504    -label   => 'Save',
505    -command => sub { print "DOS\n"; save_dialog($win); }
506);
507
508# function call, ternary in list
509return OptArgs2::Result->usage(
510    $style == OptArgs2::STYLE_FULL ? 'FullUsage' : 'NormalUsage',
511    'usage: ' . $usage . "\n" );
512
513# not a function call
514%blastparam = (
515    -run    => \%runparam,
516    -file   => '',
517    -parse  => 1,
518    -signif => 1e-5,
519);
520
521# 'local' is a keyword, not a user function
522local (
523    $len,    $pts,      @colspec, $char, $cols,
524    $repeat, $celldata, $at_text, $after_text
525);
526
527# square bracket with sublists
528$data = [
529    ListElem->new( id => 0, val => 100 ),
530    ListElem->new( id => 2, val => 50 ),
531    ListElem->new( id => 1, val => 10 ),
532];
533
534# curly brace with sublists
535$behaviour = {
536    cat   => { nap    => "lap",   eat  => "meat" },
537    dog   => { prowl  => "growl", pool => "drool" },
538    mouse => { nibble => "kibble" },
539};
540#6...........
541        },
542
543        'lpxl.lpxl1' => {
544            source => "lpxl",
545            params => "lpxl1",
546            expect => <<'#7...........',
547# simple function call
548my $loanlength = getLoanLength(
549                                $borrower->{'categorycode'},    # sc1
550                                $iteminformation->{'itemtype'},
551                                $borrower->{'branchcode'}       # sc3
552);
553
554# function call, more than one level deep
555my $o = very::long::class::name->new(
556                                      {
557                                        propA => "a",
558                                        propB => "b",
559                                        propC => "c",
560                                      }
561);
562
563# function call with sublist
564debug(
565       "Connecting to DB.",
566       "Extra-Parameters: " . join( "<->", $extra_parms ),
567       "Config: " . join( "<->", %config )
568);
569
570# simple function call with code block
571$m->command( -label   => 'Save',
572             -command => sub { print "DOS\n"; save_dialog($win); } );
573
574# function call, ternary in list
575return
576  OptArgs2::Result->usage(
577                   $style == OptArgs2::STYLE_FULL ? 'FullUsage' : 'NormalUsage',
578                   'usage: ' . $usage . "\n" );
579
580# not a function call
581%blastparam = (
582                -run    => \%runparam,
583                -file   => '',
584                -parse  => 1,
585                -signif => 1e-5,
586);
587
588# 'local' is a keyword, not a user function
589local (
590        $len,    $pts,      @colspec, $char, $cols,
591        $repeat, $celldata, $at_text, $after_text
592);
593
594# square bracket with sublists
595$data = [
596          ListElem->new( id => 0, val => 100 ),
597          ListElem->new( id => 2, val => 50 ),
598          ListElem->new( id => 1, val => 10 ),
599];
600
601# curly brace with sublists
602$behaviour = {
603               cat   => { nap    => "lap",   eat  => "meat" },
604               dog   => { prowl  => "growl", pool => "drool" },
605               mouse => { nibble => "kibble" },
606};
607#7...........
608        },
609
610        'lpxl.lpxl3' => {
611            source => "lpxl",
612            params => "lpxl3",
613            expect => <<'#8...........',
614# simple function call
615my $loanlength = getLoanLength(
616    $borrower->{'categorycode'},    # sc1
617    $iteminformation->{'itemtype'},
618    $borrower->{'branchcode'}       # sc3
619);
620
621# function call, more than one level deep
622my $o = very::long::class::name->new(
623    {
624        propA => "a",
625        propB => "b",
626        propC => "c",
627    }
628);
629
630# function call with sublist
631debug(
632    "Connecting to DB.",
633    "Extra-Parameters: " . join( "<->", $extra_parms ),
634    "Config: " . join( "<->", %config )
635);
636
637# simple function call with code block
638$m->command(
639    -label   => 'Save',
640    -command => sub { print "DOS\n"; save_dialog($win); } );
641
642# function call, ternary in list
643return
644  OptArgs2::Result->usage(
645    $style == OptArgs2::STYLE_FULL ? 'FullUsage' : 'NormalUsage',
646    'usage: ' . $usage . "\n" );
647
648# not a function call
649%blastparam = (
650    -run    => \%runparam,
651    -file   => '',
652    -parse  => 1,
653    -signif => 1e-5,
654);
655
656# 'local' is a keyword, not a user function
657local (
658    $len,    $pts,      @colspec, $char, $cols,
659    $repeat, $celldata, $at_text, $after_text
660);
661
662# square bracket with sublists
663$data = [
664    ListElem->new( id => 0, val => 100 ),
665    ListElem->new( id => 2, val => 50 ),
666    ListElem->new( id => 1, val => 10 ),
667];
668
669# curly brace with sublists
670$behaviour = {
671    cat   => { nap    => "lap",   eat  => "meat" },
672    dog   => { prowl  => "growl", pool => "drool" },
673    mouse => { nibble => "kibble" },
674};
675#8...........
676        },
677
678        'lpxl.lpxl4' => {
679            source => "lpxl",
680            params => "lpxl4",
681            expect => <<'#9...........',
682# simple function call
683my $loanlength = getLoanLength(
684                                $borrower->{'categorycode'},    # sc1
685                                $iteminformation->{'itemtype'},
686                                $borrower->{'branchcode'}       # sc3
687);
688
689# function call, more than one level deep
690my $o = very::long::class::name->new(
691    {
692        propA => "a",
693        propB => "b",
694        propC => "c",
695    }
696);
697
698# function call with sublist
699debug(
700    "Connecting to DB.",
701    "Extra-Parameters: " . join( "<->", $extra_parms ),
702    "Config: " . join( "<->", %config )
703);
704
705# simple function call with code block
706$m->command( -label   => 'Save',
707             -command => sub { print "DOS\n"; save_dialog($win); } );
708
709# function call, ternary in list
710return
711  OptArgs2::Result->usage(
712                   $style == OptArgs2::STYLE_FULL ? 'FullUsage' : 'NormalUsage',
713                   'usage: ' . $usage . "\n" );
714
715# not a function call
716%blastparam = (
717    -run    => \%runparam,
718    -file   => '',
719    -parse  => 1,
720    -signif => 1e-5,
721);
722
723# 'local' is a keyword, not a user function
724local (
725        $len,    $pts,      @colspec, $char, $cols,
726        $repeat, $celldata, $at_text, $after_text
727);
728
729# square bracket with sublists
730$data = [
731    ListElem->new( id => 0, val => 100 ),
732    ListElem->new( id => 2, val => 50 ),
733    ListElem->new( id => 1, val => 10 ),
734];
735
736# curly brace with sublists
737$behaviour = {
738    cat   => { nap    => "lap",   eat  => "meat" },
739    dog   => { prowl  => "growl", pool => "drool" },
740    mouse => { nibble => "kibble" },
741};
742#9...........
743        },
744
745        'lpxl.lpxl5' => {
746            source => "lpxl",
747            params => "lpxl5",
748            expect => <<'#10...........',
749# simple function call
750my $loanlength = getLoanLength(
751                                $borrower->{'categorycode'},    # sc1
752                                $iteminformation->{'itemtype'},
753                                $borrower->{'branchcode'}       # sc3
754);
755
756# function call, more than one level deep
757my $o = very::long::class::name->new(
758    {
759        propA => "a",
760        propB => "b",
761        propC => "c",
762    }
763);
764
765# function call with sublist
766debug(
767    "Connecting to DB.",
768    "Extra-Parameters: " . join( "<->", $extra_parms ),
769    "Config: " . join( "<->", %config )
770);
771
772# simple function call with code block
773$m->command(
774    -label   => 'Save',
775    -command => sub { print "DOS\n"; save_dialog($win); } );
776
777# function call, ternary in list
778return
779  OptArgs2::Result->usage(
780    $style == OptArgs2::STYLE_FULL ? 'FullUsage' : 'NormalUsage',
781    'usage: ' . $usage . "\n" );
782
783# not a function call
784%blastparam = (
785    -run    => \%runparam,
786    -file   => '',
787    -parse  => 1,
788    -signif => 1e-5,
789);
790
791# 'local' is a keyword, not a user function
792local (
793    $len,    $pts,      @colspec, $char, $cols,
794    $repeat, $celldata, $at_text, $after_text
795);
796
797# square bracket with sublists
798$data = [
799    ListElem->new( id => 0, val => 100 ),
800    ListElem->new( id => 2, val => 50 ),
801    ListElem->new( id => 1, val => 10 ),
802];
803
804# curly brace with sublists
805$behaviour = {
806    cat   => { nap    => "lap",   eat  => "meat" },
807    dog   => { prowl  => "growl", pool => "drool" },
808    mouse => { nibble => "kibble" },
809};
810#10...........
811        },
812
813        'git63.def' => {
814            source => "git63",
815            params => "def",
816            expect => <<'#11...........',
817my $fragment = $parser->    #parse_html_string
818  parse_balanced_chunk($I);
819#11...........
820        },
821
822        'align35.def' => {
823            source => "align35",
824            params => "def",
825            expect => <<'#12...........',
826# different module names, do not align commas (fixes rt136416)
827use File::Spec::Functions 'catfile', 'catdir';
828use Mojo::Base 'Mojolicious', '-signatures';
829
830# same module names, align fat commas
831use constant PI     => 4 * atan2 1, 1;
832use constant TWOPI  => 2 * PI;
833use constant FOURPI => 4 * PI;
834
835# same module names, align commas
836use TestCounter '3rd-party', 0, '3rd-party no longer visible';
837use TestCounter 'replace',   1, 'replacement now visible';
838use TestCounter 'root';
839
840# same module name, align fat commas but not commas
841use constant COUNTDOWN => scalar reverse 1, 2, 3, 4, 5;
842use constant COUNTUP   => reverse 1, 2, 3, 4, 5;
843use constant COUNTDOWN => scalar reverse 1, 2, 3, 4, 5;
844#12...........
845        },
846
847        'rt136417.def' => {
848            source => "rt136417",
849            params => "def",
850            expect => <<'#13...........',
851function(
852    #
853    a, b, c
854);
855
856%hash = (
857    a => b,
858    c => d,
859);
860#13...........
861        },
862
863        'rt136417.rt136417' => {
864            source => "rt136417",
865            params => "rt136417",
866            expect => <<'#14...........',
867function(
868    #
869    a, b, c );
870
871%hash = (
872    a => b,
873    c => d,
874);
875#14...........
876        },
877
878        'numbers.def' => {
879            source => "numbers",
880            params => "def",
881            expect => <<'#15...........',
882# valid numbers
883my @vals = (
884
885    12345,
886    12345.67,
887    .23E-10,
888    3.14_15_92,
889    4_294_967_296,
890    0xff,
891    0xdead_beef,
892    0377,
893    0b011011,
894    0x1.999ap-4,
895    1e34,
896    1e+34,
897    1e+034,
898    -1e+034,
899    0.00000000000000000000000000000000000000000000000000000000000000000001,
900    0Xabcdef,
901    0B1101,
902    0o12_345,    # optional 'o' and 'O' added in perl v5.33.5
903    0O12_345,
904);
905#15...........
906        },
907
908        'code_skipping.def' => {
909            source => "code_skipping",
910            params => "def",
911            expect => <<'#16...........',
912%Hdr        = %U2E    = %E2U      = %Fallback = ();
913$in_charmap = $nerror = $nwarning = 0;
914$.          = 0;
915#<<V  code skipping: perltidy will pass this verbatim without error checking
916
917    }}} {{{
918
919#>>V
920my $self    = shift;
921my $cloning = shift;
922#16...........
923        },
924
925        'git51.def' => {
926            source => "git51",
927            params => "def",
928            expect => <<'#17...........',
929Type::Libraries->setup_class(
930    __PACKAGE__,
931    qw(
932      Types::Standard
933      Types::Common::Numeric
934    ),    # <--- brace here
935);
936#17...........
937        },
938
939        'git51.git51' => {
940            source => "git51",
941            params => "git51",
942            expect => <<'#18...........',
943Type::Libraries->setup_class(
944	__PACKAGE__,
945	qw(
946		Types::Standard
947		Types::Common::Numeric
948	),    # <--- brace here
949);
950#18...........
951        },
952
953        'pretok.def' => {
954            source => "pretok",
955            params => "def",
956            expect => <<'#19...........',
957# test sub split_pretoken
958my $s1 = $^? ? "def" : "not def";
959my $s2 = $^  ? "def" : "not def";
960my $s3 = $^ if ($s2);
961my $s4 = $^O eq "linux";
962my $s5 = $^O ne "linux";
963my $s6 = $^O ne "linux";
964my $s7 = %^O;
965my $s8 = 'hi' . 's' x 10 if (1);
966my $s9 = 'merci' x 0.1e4 . $s8;
967#19...........
968        },
969    };
970
971    my $ntests = 0 + keys %{$rtests};
972    plan tests => $ntests;
973}
974
975###############
976# EXECUTE TESTS
977###############
978
979foreach my $key ( sort keys %{$rtests} ) {
980    my $output;
981    my $sname  = $rtests->{$key}->{source};
982    my $expect = $rtests->{$key}->{expect};
983    my $pname  = $rtests->{$key}->{params};
984    my $source = $rsources->{$sname};
985    my $params = defined($pname) ? $rparams->{$pname} : "";
986    my $stderr_string;
987    my $errorfile_string;
988    my $err = Perl::Tidy::perltidy(
989        source      => \$source,
990        destination => \$output,
991        perltidyrc  => \$params,
992        argv        => '',             # for safety; hide any ARGV from perltidy
993        stderr      => \$stderr_string,
994        errorfile   => \$errorfile_string,    # not used when -se flag is set
995    );
996    if ( $err || $stderr_string || $errorfile_string ) {
997        print STDERR "Error output received for test '$key'\n";
998        if ($err) {
999            print STDERR "An error flag '$err' was returned\n";
1000            ok( !$err );
1001        }
1002        if ($stderr_string) {
1003            print STDERR "---------------------\n";
1004            print STDERR "<<STDERR>>\n$stderr_string\n";
1005            print STDERR "---------------------\n";
1006            ok( !$stderr_string );
1007        }
1008        if ($errorfile_string) {
1009            print STDERR "---------------------\n";
1010            print STDERR "<<.ERR file>>\n$errorfile_string\n";
1011            print STDERR "---------------------\n";
1012            ok( !$errorfile_string );
1013        }
1014    }
1015    else {
1016        if ( !is( $output, $expect, $key ) ) {
1017            my $leno = length($output);
1018            my $lene = length($expect);
1019            if ( $leno == $lene ) {
1020                print STDERR
1021"#> Test '$key' gave unexpected output.  Strings differ but both have length $leno\n";
1022            }
1023            else {
1024                print STDERR
1025"#> Test '$key' gave unexpected output.  String lengths differ: output=$leno, expected=$lene\n";
1026            }
1027        }
1028    }
1029}
1030