# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # # This Source Code Form is "Incompatible With Secondary Licenses", as # defined by the Mozilla Public License, v. 2.0. # This module represents the tests that get run on a single operator # from the TESTS constant in Bugzilla::Search::Test::Constants. package Bugzilla::Test::Search::OperatorTest; use strict; use warnings; use Bugzilla::Test::Search::Constants; use Bugzilla::Test::Search::FieldTest; use Bugzilla::Test::Search::FieldTestNormal; use Bugzilla::Test::Search::InjectionTest; use Bugzilla::Test::Search::OrTest; use Bugzilla::Test::Search::AndTest; use Bugzilla::Test::Search::NotTest; ############### # Constructor # ############### sub new { my ($invocant, $operator, $search_test) = @_; $search_test ||= $invocant->search_test; my $class = ref($invocant) || $invocant; return bless { search_test => $search_test, operator => $operator }, $class; } ############# # Accessors # ############# # The Bugzilla::Test::Search object that this is a child of. sub search_test { return $_[0]->{search_test} } # The operator being tested sub operator { return $_[0]->{operator} } # The tests that we're going to run on this operator. sub tests { return @{ TESTS->{$_[0]->operator } } } # The fields we're going to test for this operator. sub test_fields { return $_[0]->search_test->all_fields } sub run { my ($self) = @_; foreach my $field ($self->test_fields) { foreach my $test ($self->tests) { my $field_test = new Bugzilla::Test::Search::FieldTest($self, $field, $test); $field_test->run(); my $normal_test = new Bugzilla::Test::Search::FieldTestNormal($field_test); $normal_test->run(); my $not_test = new Bugzilla::Test::Search::NotTest($field_test); $not_test->run(); next if !$self->search_test->option('long'); # Run the OR tests. This tests every other operator (including # this operator itself) in combination with every other field, # in an OR with this operator and field. foreach my $other_operator ($self->search_test->all_operators) { $self->run_join_tests($field_test, $other_operator); } } foreach my $test (INJECTION_TESTS) { my $injection_test = new Bugzilla::Test::Search::InjectionTest($self, $field, $test); $injection_test->run(); } } } sub run_join_tests { my ($self, $field_test, $other_operator) = @_; my $other_operator_test = $self->new($other_operator); foreach my $other_test ($other_operator_test->tests) { foreach my $other_field ($self->test_fields) { $self->_run_one_join_test($field_test, $other_operator_test, $other_field, $other_test); $self->search_test->clean_test_history(); } } } sub _run_one_join_test { my ($self, $field_test, $other_operator_test, $other_field, $other_test) = @_; my $other_field_test = new Bugzilla::Test::Search::FieldTest($other_operator_test, $other_field, $other_test); my $or_test = new Bugzilla::Test::Search::OrTest($field_test, $other_field_test); $or_test->run(); my $and_test = new Bugzilla::Test::Search::AndTest($field_test, $other_field_test); $and_test->run(); } 1;