It looks like the use of:
while( my ( $k, $v ) = each( %hash ) ) {
$thing->fields( $otherthing );
}
Causes issues, because "each" order is randomized as well as "keys", and the "fields" storage retains insertion order.
So attached is a patch that rewrites all use of "each" in the tests with more stable "sort keys" loops, which incidentally fixes the problem.
( Verify by replacing "sort keys" with "reverse sort keys" in 2d-template-fast.t which will produce consistent failure instead of consistent pass ).
diff -Naur CGI-FormBuilder-3.09/t/1c-validate.t CGI-FormBuilder-3.09b/t/1c-validate.t
--- CGI-FormBuilder-3.09/t/1c-validate.t 2013-11-30 00:10:36.000000000 +0000
+++ CGI-FormBuilder-3.09b/t/1c-validate.t 2016-05-11 13:10:45.680369595 +0000
@@ -174,11 +174,11 @@
for my $t (@test) {
my $form = CGI::FormBuilder->new( %{ $t->{opt} }, debug => $DEBUG );
- while(my($f,$o) = each %{$t->{mod} || {}}) {
- $o->{name} = $f;
- $form->field(%$o);
+ for my $field ( sort keys %{ $t->{mod} || {} } ) {
+ my $object = $t->{mod}->{$field};
+ $object->{name} = $field;
+ $form->field( %{ $object } );
}
-
# just try to validate
ok($form->validate, $t->{pass} || 0);
}
diff -Naur CGI-FormBuilder-3.09/t/1d-messages.t CGI-FormBuilder-3.09b/t/1d-messages.t
--- CGI-FormBuilder-3.09/t/1d-messages.t 2013-11-30 00:10:36.000000000 +0000
+++ CGI-FormBuilder-3.09b/t/1d-messages.t 2016-05-11 13:08:33.159540213 +0000
@@ -70,8 +70,9 @@
my $locale = "fb_FAKE";
my $messages = "messages.$locale";
open(M, ">$messages") || warn "Can't write $messages: $!";
-while (my($k,$v) = each %messages) {
- print M join(' ', $k, ref($v) ? @$v : $v), "\n";
+for my $k ( sort keys %messages ) {
+ my $v = $messages{$k};
+ print M join(' ', $k, ref($v) ? @$v : $v), "\n";
}
close(M);
@@ -123,7 +124,7 @@
# Final test set is to just make sure we have all the keys for all modules
require CGI::FormBuilder::Messages::default;
my %need = CGI::FormBuilder::Messages::default->messages;
-my @keys = keys %need;
+my @keys = sort keys %need;
for my $pm (@pm) {
my($lang) = $pm =~ /([a-z]+_[A-Z]+)/;
my $skip = $lang ? undef : "skip: Can't get language from $pm";
diff -Naur CGI-FormBuilder-3.09/t/2a-template-html.t CGI-FormBuilder-3.09b/t/2a-template-html.t
--- CGI-FormBuilder-3.09/t/2a-template-html.t 2013-11-30 00:10:36.000000000 +0000
+++ CGI-FormBuilder-3.09b/t/2a-template-html.t 2016-05-11 13:11:57.438740284 +0000
@@ -102,18 +102,19 @@
my $seq = $ARGV[0] || 1;
# Cycle thru and try it out
-for (@test) {
+for my $test_item (@test) {
my $form = CGI::FormBuilder->new(
debug => $DEBUG,
action => 'TEST',
title => 'TEST',
- %{ $_->{opt} },
+ %{ $test_item->{opt} },
);
# the ${mod} key twiddles fields
- while(my($f,$o) = each %{$_->{mod} || {}}) {
- $o->{name} = $f;
- $form->field(%$o);
+ for my $field ( sort keys %{ $test_item->{mod} || {} } ) {
+ my $object = $test_item->{mod}->{$field};
+ $object->{name} = $field;
+ $form->field( %{ $object } );
}
#
diff -Naur CGI-FormBuilder-3.09/t/2b-template-text.t CGI-FormBuilder-3.09b/t/2b-template-text.t
--- CGI-FormBuilder-3.09/t/2b-template-text.t 2013-11-30 00:10:36.000000000 +0000
+++ CGI-FormBuilder-3.09b/t/2b-template-text.t 2016-05-11 13:11:29.861982062 +0000
@@ -97,18 +97,19 @@
my $seq = $ARGV[0] || 1;
# Cycle thru and try it out
-for (@test) {
+for my $test_item (@test) {
my $form = CGI::FormBuilder->new(
debug => $DEBUG,
action => 'TEST',
title => 'TEST',
- %{ $_->{opt} },
+ %{ $test_item->{opt} },
);
# the ${mod} key twiddles fields
- while(my($f,$o) = each %{$_->{mod} || {}}) {
- $o->{name} = $f;
- $form->field(%$o);
+ for my $field ( sort keys %{ $test_item->{mod} || {} } ) {
+ my $object = $test_item->{mod}->{$field};
+ $object->{name} = $field;
+ $form->field( %{ $object } );
}
#
diff -Naur CGI-FormBuilder-3.09/t/2d-template-fast.t CGI-FormBuilder-3.09b/t/2d-template-fast.t
--- CGI-FormBuilder-3.09/t/2d-template-fast.t 2013-11-30 00:10:36.000000000 +0000
+++ CGI-FormBuilder-3.09b/t/2d-template-fast.t 2016-05-11 13:15:58.497630259 +0000
@@ -135,18 +135,19 @@
my $seq = $ARGV[0] || 1;
# Cycle thru and try it out
-for (@test) {
+for my $test_item (@test) {
my $form = CGI::FormBuilder->new(
debug => $DEBUG,
action => 'TEST',
title => 'TEST',
- %{ $_->{opt} },
+ %{ $test_item->{opt} },
);
# the ${mod} key twiddles fields
- while(my($f,$o) = each %{$_->{mod} || {}}) {
- $o->{name} = $f;
- $form->field(%$o);
+ for my $field ( sort keys %{ $test_item->{mod} || {} } ) {
+ my $object = $test_item->{mod}->{$field};
+ $object->{name} = $field;
+ $form->field( %{ $object } );
}
#
diff -Naur CGI-FormBuilder-3.09/t/2e-template-ssi.t CGI-FormBuilder-3.09b/t/2e-template-ssi.t
--- CGI-FormBuilder-3.09/t/2e-template-ssi.t 2013-11-30 00:10:36.000000000 +0000
+++ CGI-FormBuilder-3.09b/t/2e-template-ssi.t 2016-05-11 13:12:37.526388964 +0000
@@ -102,18 +102,19 @@
my $seq = $ARGV[0] || 1;
# Cycle thru and try it out
-for (@test) {
+for my $test_item (@test) {
my $form = CGI::FormBuilder->new(
debug => $DEBUG,
action => 'TEST',
title => 'TEST',
- %{ $_->{opt} },
+ %{ $test_item->{opt} },
);
# the ${mod} key twiddles fields
- while(my($f,$o) = each %{$_->{mod} || {}}) {
- $o->{name} = $f;
- $form->field(%$o);
+ for my $field ( sort keys %{ $test_item->{mod} || {} } ) {
+ my $object = $test_item->{mod}->{$field};
+ $object->{name} = $field;
+ $form->field( %{ $object } );
}
#