public function testMemberValidatorWithExtensions()
 {
     // clear custom requirements for this test
     Config::inst()->update('SilverStripe\\Security\\Member_Validator', 'customRequired', null);
     // create a blank form
     $form = new MemberTest_ValidatorForm();
     // Test extensions
     Member_Validator::add_extension('MemberTest_MemberValidator_SurnameMustMatchFirstNameExtension');
     $validator = new Member_Validator();
     $validator->setForm($form);
     // This test should fail, since the extension enforces FirstName == Surname
     $fail = $validator->php(array('FirstName' => 'Test', 'Surname' => 'User', 'Email' => '*****@*****.**'));
     $pass = $validator->php(array('FirstName' => 'Test', 'Surname' => 'Test', 'Email' => '*****@*****.**'));
     $this->assertFalse($fail, 'Member_Validator must fail because of added extension.');
     $this->assertTrue($pass, 'Member_Validator must succeed, since it meets all requirements.');
     // Add another extension that always fails. This ensures that all extensions are considered in the validation
     Member_Validator::add_extension('MemberTest_MemberValidator_AlwaysFailsExtension');
     $validator = new Member_Validator();
     $validator->setForm($form);
     // Even though the data is valid, This test should still fail, since one extension always returns false
     $fail = $validator->php(array('FirstName' => 'Test', 'Surname' => 'Test', 'Email' => '*****@*****.**'));
     $this->assertFalse($fail, 'Member_Validator must fail because of added extensions.');
     // Remove added extensions
     Member_Validator::remove_extension('MemberTest_MemberValidator_AlwaysFailsExtension');
     Member_Validator::remove_extension('MemberTest_MemberValidator_SurnameMustMatchFirstNameExtension');
 }