public function testMemberValidator()
 {
     // clear custom requirements for this test
     Config::inst()->update('SilverStripe\\Security\\Member_Validator', 'customRequired', null);
     $memberA = $this->objFromFixture('SilverStripe\\Security\\Member', 'admin');
     $memberB = $this->objFromFixture('SilverStripe\\Security\\Member', 'test');
     // create a blank form
     $form = new MemberTest_ValidatorForm();
     $validator = new Member_Validator();
     $validator->setForm($form);
     // Simulate creation of a new member via form, but use an existing member identifier
     $fail = $validator->php(array('FirstName' => 'Test', 'Email' => $memberA->Email));
     $this->assertFalse($fail, 'Member_Validator must fail when trying to create new Member with existing Email.');
     // populate the form with values from another member
     $form->loadDataFrom($memberB);
     // Assign the validator to an existing member
     // (this is basically the same as passing the member ID with the form data)
     $validator->setForMember($memberB);
     // Simulate update of a member via form and use an existing member Email
     $fail = $validator->php(array('FirstName' => 'Test', 'Email' => $memberA->Email));
     // Simulate update to a new Email address
     $pass1 = $validator->php(array('FirstName' => 'Test', 'Email' => '*****@*****.**'));
     // Pass in the same Email address that the member already has. Ensure that case is valid
     $pass2 = $validator->php(array('FirstName' => 'Test', 'Surname' => 'User', 'Email' => $memberB->Email));
     $this->assertFalse($fail, 'Member_Validator must fail when trying to update existing member with existing Email.');
     $this->assertTrue($pass1, 'Member_Validator must pass when Email is updated to a value that\'s not in use.');
     $this->assertTrue($pass2, 'Member_Validator must pass when Member updates his own Email to the already existing value.');
 }