From b65942a2c5cd20053bd5af064cddb8b60e4d04db Mon Sep 17 00:00:00 2001 From: "Edward Z. Yang" Date: Wed, 5 Mar 2008 05:38:28 +0000 Subject: [PATCH] Implement "Or" composite validator. git-svn-id: http://htmlpurifier.org/svnroot/htmlpurifier/trunk@1607 48356398-32a2-884e-a903-53898d9a118a --- library/HTMLPurifier.includes.php | 1 + .../ConfigSchema/Validator/Or.php | 39 +++++++++++++++++++ .../ConfigSchema/Validator/OrTest.php | 31 +++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 library/HTMLPurifier/ConfigSchema/Validator/Or.php create mode 100644 tests/HTMLPurifier/ConfigSchema/Validator/OrTest.php diff --git a/library/HTMLPurifier.includes.php b/library/HTMLPurifier.includes.php index e9916de0..97fcf27d 100644 --- a/library/HTMLPurifier.includes.php +++ b/library/HTMLPurifier.includes.php @@ -137,6 +137,7 @@ require 'HTMLPurifier/ConfigSchema/Validator/Alnum.php'; require 'HTMLPurifier/ConfigSchema/Validator/Composite.php'; require 'HTMLPurifier/ConfigSchema/Validator/Exists.php'; require 'HTMLPurifier/ConfigSchema/Validator/NamespaceExists.php'; +require 'HTMLPurifier/ConfigSchema/Validator/Or.php'; require 'HTMLPurifier/ConfigSchema/Validator/ParseId.php'; require 'HTMLPurifier/ConfigSchema/Validator/ParseType.php'; require 'HTMLPurifier/ConfigSchema/Validator/Unique.php'; diff --git a/library/HTMLPurifier/ConfigSchema/Validator/Or.php b/library/HTMLPurifier/ConfigSchema/Validator/Or.php new file mode 100644 index 00000000..fc818b64 --- /dev/null +++ b/library/HTMLPurifier/ConfigSchema/Validator/Or.php @@ -0,0 +1,39 @@ +validators[] = $validator; + } + + public function validate(&$arr, $interchange) { + $exceptions = array(); + $pass = false; + foreach ($this->validators as $validator) { + try { + $validator->validate($arr, $interchange); + } catch (HTMLPurifier_ConfigSchema_Exception $e) { + $exceptions[] = $e; + continue; + } + $exceptions = array(); + break; + } + if ($exceptions) { + // I wonder how we can make the exceptions "lossless" + throw new HTMLPurifier_ConfigSchema_Exception('All validators failed: ' . implode(";\n", $exceptions)); + } + } + +} diff --git a/tests/HTMLPurifier/ConfigSchema/Validator/OrTest.php b/tests/HTMLPurifier/ConfigSchema/Validator/OrTest.php new file mode 100644 index 00000000..d8718ff5 --- /dev/null +++ b/tests/HTMLPurifier/ConfigSchema/Validator/OrTest.php @@ -0,0 +1,31 @@ + 'RD'); + $this->validator->addValidator(new HTMLPurifier_ConfigSchema_Validator_Alnum('ID')); + // Never called: + $this->validator->addValidator(new HTMLPurifier_ConfigSchema_Validator_Exists('ALT-ID')); + $this->validator->validate($arr, $this->interchange); + } + + public function testValidatePassLater() { + $arr = array('ID' => 'RD'); + // This one fails: + $this->validator->addValidator(new HTMLPurifier_ConfigSchema_Validator_Exists('ALT-ID')); + // But this one passes: + $this->validator->addValidator(new HTMLPurifier_ConfigSchema_Validator_Alnum('ID')); + $this->validator->validate($arr, $this->interchange); + } + + public function testValidateFail() { + $arr = array('ID' => 'RD'); + $this->validator->addValidator(new HTMLPurifier_ConfigSchema_Validator_Exists('ALT-ID')); + $this->validator->addValidator(new HTMLPurifier_ConfigSchema_Validator_Exists('FOOBAR')); + $this->expectException('HTMLPurifier_ConfigSchema_Exception'); + $this->validator->validate($arr, $this->interchange); + } + +}