# # Copyright 2002 Patrik Stridvall # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # package tests; use strict; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; @ISA = qw(Exporter); @EXPORT = qw(); @EXPORT_OK = qw($tests); use vars qw($tests); use config qw($current_dir $wine_dir $winapi_dir); use options qw($options); use output qw($output); sub import(@) { $Exporter::ExportLevel++; Exporter::import(@_); $Exporter::ExportLevel--; $tests = 'tests'->new; } sub parse_tests_file($); sub new($) { my $proto = shift; my $class = ref($proto) || $proto; my $self = {}; bless ($self, $class); $self->parse_tests_file(); return $self; } sub parse_tests_file($) { my $self = shift; my $file = "tests.dat"; my $tests = \%{$self->{TESTS}}; $output->lazy_progress($file); my $test_dir; my $test; my $section; open(IN, "< $winapi_dir/$file") || die "$winapi_dir/$file: $!\n"; while() { s/^\s*?(.*?)\s*$/$1/; # remove whitespace at beginning and end of line s/^(.*?)\s*#.*$/$1/; # remove comments /^$/ && next; # skip empty lines if (/^%%%\s*(\S+)$/) { $test_dir = $1; } elsif (/^%%\s*(\w+)$/) { $test = $1; } elsif (/^%\s*(\w+)$/) { $section = $1; } elsif (!/^%/) { if (!exists($$tests{$test_dir}{$test}{$section})) { $$tests{$test_dir}{$test}{$section} = []; } push @{$$tests{$test_dir}{$test}{$section}}, $_; } else { $output->write("$file:$.: parse error: '$_'\n"); exit 1; } } close(IN); } sub get_tests($$) { my $self = shift; my $tests = \%{$self->{TESTS}}; my $test_dir = shift; my %tests = (); if (defined($test_dir)) { foreach my $test (sort(keys(%{$$tests{$test_dir}}))) { $tests{$test}++; } } else { foreach my $test_dir (sort(keys(%$tests))) { foreach my $test (sort(keys(%{$$tests{$test_dir}}))) { $tests{$test}++; } } } return sort(keys(%tests)); } sub get_test_dirs($$) { my $self = shift; my $tests = \%{$self->{TESTS}}; my $test = shift; my %test_dirs = (); if (defined($test)) { foreach my $test_dir (sort(keys(%$tests))) { if (exists($$tests{$test_dir}{$test})) { $test_dirs{$test_dir}++; } } } else { foreach my $test_dir (sort(keys(%$tests))) { $test_dirs{$test_dir}++; } } return sort(keys(%test_dirs)); } sub get_sections($$$) { my $self = shift; my $tests = \%{$self->{TESTS}}; my $test_dir = shift; my $test = shift; my %sections = (); if (defined($test_dir)) { if (defined($test)) { foreach my $section (sort(keys(%{$$tests{$test_dir}{$test}}))) { $sections{$section}++; } } else { foreach my $test (sort(keys(%{$$tests{$test_dir}}))) { foreach my $section (sort(keys(%{$$tests{$test_dir}{$test}}))) { $sections{$section}++; } } } } elsif (defined($test)) { foreach my $test_dir (sort(keys(%$tests))) { foreach my $section (sort(keys(%{$$tests{$test_dir}{$test}}))) { $sections{$section}++; } } } else { foreach my $test_dir (sort(keys(%$tests))) { foreach my $test (sort(keys(%{$$tests{$test_dir}}))) { foreach my $section (sort(keys(%{$$tests{$test_dir}{$test}}))) { $sections{$section}++; } } } } return sort(keys(%sections)); } sub get_section($$$$) { my $self = shift; my $tests = \%{$self->{TESTS}}; my $test_dir = shift; my $test = shift; my $section = shift; my $array = $$tests{$test_dir}{$test}{$section}; if (defined($array)) { return @$array; } else { return (); } } 1;