/usr/share/perl5/CGI/Test/Form/Group.pm is in libcgi-test-perl 1.111-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 | package CGI::Test::Form::Group;
use strict;
use warnings;
################################################################
# $Id: Group.pm 411 2011-09-26 11:19:30Z nohuhu@nohuhu.org $
# $Name: cgi-test_0-104_t1 $
################################################################
# Copyright (c) 2001, Raphael Manfredi
#
# You may redistribute only under the terms of the Artistic License,
# as specified in the README file that comes with the distribution.
#
# This class records names of grouped objects (radio buttons, checkboxes),
# and which buttons belong to some named group.
#
#
# ->new
#
# Creation routine
#
# From a listref of box widgets, build a hash table indexed by group name
# and listing all the buttons belonging to the named group. Each box is
# also made aware of this object.
#
sub new
{
my $this = bless {}, shift; # The object is the hash table we use
my ($rlist) = @_;
#
# Create map: "group name" => [list of buttons in group]
#
foreach my $b (@$rlist)
{
my $gname = $b->name;
$this->{$gname} = [] unless exists $this->{$gname};
push @{$this->{$gname}}, $b;
$b->set_group($this);
}
$this->_validate_radios() if $rlist->[ 0 ]->is_radio();
return $this;
}
#
# Attribute access
#
sub names
{
my $this = shift;
return keys %{$this};
}
#
# ->widgets_in
#
# Returns list of widgets held within named group, empty if none.
#
sub widgets_in
{
my $this = shift;
my ($gname) = @_;
my $list = $this->{$gname} || [];
return @$list;
}
#
# ->widget_count
#
# Returns amount of widgets held within named group, 0 if none.
#
sub widget_count
{
my $this = shift;
my ($gname) = @_;
my $list = $this->{$gname};
return ref $list ? scalar(@$list) : 0;
}
#
# ->is_groupname
#
# Check whether name is that of a known widget group.
#
sub is_groupname
{
my $this = shift;
my ($gname) = @_;
return exists $this->{$gname};
}
#
# ->_validate_radios
#
# When groupping radio buttons, make sure there is at least one such
# button selected, otherwise mark the first as selected. Also ensure
# exactly one radio is selected, or unselect all extra.
#
sub _validate_radios
{
my $this = shift;
foreach my $gname ($this->names)
{
my @checked = grep {$_->is_checked} $this->widgets_in($gname);
my $checked = @checked;
if ($checked > 1)
{
my $first = shift @checked;
#
# NB: we're not calling uncheck() nor set_is_checked() to fix
# incorrectly configured radio buttons, since it is normally an
# invalid operation. We're resettting the attribute directly.
#
warn
"found %d checked %ss for '%s', keeping first (tag \"%s\")",
$checked, $first->gui_type, $gname, ($first->value || "");
foreach my $b (@checked)
{
$b->{is_checked} = 0; # Direct access
}
}
elsif ($checked == 0)
{
my $first = $this->{$gname}->[ 0 ];
warn "no checked %ss for '%s', checking first (tag \"%s\")",
$first->gui_type, $gname, ($first->value || "");
$first->{is_checked} = 1; # Direct access
}
}
return;
}
1;
=head1 NAME
CGI::Test::Form::Group - Records groups of box-type widgets
=head1 SYNOPSIS
# $form is a CGI::Test::Form object
use CGI::Test;
my $rgroup = $form->radio_groups;
ok 1, defined $rgroup;
my @title = $rgroup->widgets_in("title");
my ($mister) = grep { $_->value eq "Mr" } @title;
ok 2, $mister->is_checked;
=head1 DESCRIPTION
This class is a container for box-type widgets, i.e. radio buttons and
checkboxes, which may be groupped by name.
It can be queried to easily retrieve widgets belonging to a group, or to
get all the group names.
It is also used internally by C<CGI::Test> to keep track of associated
radio buttons, so that checking one automatically unchecks the others in the
same group.
=head1 INTERFACE
The following features are available:
=over 4
=item C<is_groupname> I<name>
Checks whether I<name> is the name of a group.
=item C<names>
Returns a list of group names, in random order.
=item C<widget_count> I<groupname>
Returns amount of widgets held in I<groupname>, 0 if none.
=item C<widgets_in> I<groupname>
Returns a list of all the widgets in the given I<groupname>. If the
name is not a valid group name, the list will be empty.
=back
=head1 AUTHORS
The original author is Raphael Manfredi.
Steven Hilton was long time maintainer of this module.
Current maintainer is Alexander Tokarev F<E<lt>tokarev@cpan.orgE<gt>>.
=head1 SEE ALSO
CGI::Test::Form(3), CGI::Test::Form::Widget::Box(3).
=cut
|