/**
  * Test basic methods.
  * @covers Rentalhost\VanillaValidation\ValidationField::__construct
  * @covers Rentalhost\VanillaValidation\ValidationField::__call
  */
 public function testBasic()
 {
     static::assertClassHasAttribute('name', ValidationField::class);
     static::assertClassHasAttribute('value', ValidationField::class);
     static::assertClassHasAttribute('rules', ValidationField::class);
     $field = new ValidationField('name');
     static::assertSame('name', $field->name);
     static::assertNull($field->value);
     static::assertInstanceOf(ValidationFieldRuleList::class, $field->rules);
     $field = new ValidationField('name', 'value');
     static::assertSame('name', $field->name);
     static::assertSame('value', $field->value);
     $field->required();
     $fieldRules = new ValidationFieldRuleList();
     $fieldRules->add('required', null);
     static::assertEquals($fieldRules, $field->rules);
 }
 /**
  * Test validate method.
  * @covers Rentalhost\VanillaValidation\ValidationFieldRuleList::validate
  */
 public function testValidate()
 {
     $ruleList = new ValidationFieldRuleList();
     $ruleList->add('required', [false]);
     // Prepare.
     $ruleListResult = $ruleList->validate('value');
     $resultSuccess = new Success();
     $resultSuccess->value = 'value';
     $resultSuccess->ruleIndex = 0;
     $resultSuccess->rule = new ValidationFieldRule('required', [false]);
     // Success test.
     static::assertInstanceOf(ValidationResult::class, $ruleListResult);
     static::assertTrue($ruleListResult->isSuccess());
     static::assertSame('success', $ruleListResult->getMessage());
     static::assertEquals([$resultSuccess], $ruleListResult->getResults());
     static::assertEquals([$resultSuccess], $ruleListResult->getSuccesses());
     static::assertEquals([], $ruleListResult->getFails());
     // Prepare.
     $ruleListResult = $ruleList->validate(null);
     $resultFail = new Fail('fail:required');
     $resultFail->value = null;
     $resultFail->ruleIndex = 0;
     $resultFail->rule = new ValidationFieldRule('required', [false]);
     // Fail test.
     static::assertFalse($ruleListResult->isSuccess());
     static::assertSame('fail', $ruleListResult->getMessage());
     static::assertEquals([], $ruleListResult->getSuccesses());
     static::assertEquals([$resultFail], $ruleListResult->getResults());
     static::assertEquals([$resultFail], $ruleListResult->getFails());
     // Prepare.
     $ruleList->clear();
     $ruleList->add('trim');
     $ruleList->add('required');
     $ruleListResult = $ruleList->validate(' ');
     $resultFail = new FailBreakable('fail:required');
     $resultFail->value = '';
     $resultFail->ruleIndex = 1;
     $resultFail->rule = new ValidationFieldRule('required');
     // Fail test, after trim.
     static::assertFalse($ruleListResult->isSuccess());
     static::assertSame('fail', $ruleListResult->getMessage());
     static::assertEquals([], $ruleListResult->getSuccesses());
     static::assertEquals([$resultFail], $ruleListResult->getResults());
     static::assertEquals([$resultFail], $ruleListResult->getFails());
     // Prepare.
     $ruleList->clear();
     $ruleList->add('notEmpty');
     $ruleList->add('trim');
     $ruleListResult = $ruleList->validate(' ');
     $resultSuccess = new Success();
     $resultSuccess->value = ' ';
     $resultSuccess->ruleIndex = 0;
     $resultSuccess->rule = new ValidationFieldRule('notEmpty');
     // Success test, before trim (no side-effect).
     static::assertTrue($ruleListResult->isSuccess());
     static::assertSame('success', $ruleListResult->getMessage());
     static::assertEquals([$resultSuccess], $ruleListResult->getSuccesses());
     static::assertEquals([$resultSuccess], $ruleListResult->getResults());
     static::assertEquals([], $ruleListResult->getFails());
     // Prepare.
     $ruleList->clear();
     $ruleList->add('notEmpty');
     $ruleList->add('notEmpty');
     $ruleListResult = $ruleList->validate(' ');
     $resultSuccessFirst = new Success();
     $resultSuccessFirst->value = ' ';
     $resultSuccessFirst->ruleIndex = 0;
     $resultSuccessFirst->rule = new ValidationFieldRule('notEmpty');
     $resultSuccessSecond = new Success();
     $resultSuccessSecond->value = ' ';
     $resultSuccessSecond->ruleIndex = 1;
     $resultSuccessSecond->rule = new ValidationFieldRule('notEmpty');
     // Success test, double required, required will accept spaces string.
     static::assertTrue($ruleListResult->isSuccess());
     static::assertSame('success', $ruleListResult->getMessage());
     static::assertEquals([$resultSuccessFirst, $resultSuccessSecond], $ruleListResult->getSuccesses());
     static::assertEquals([$resultSuccessFirst, $resultSuccessSecond], $ruleListResult->getResults());
     static::assertEquals([], $ruleListResult->getFails());
     // Prepare.
     $ruleListResult = $ruleList->validate(null);
     $resultFailFirst = new Fail('fail:notEmpty');
     $resultFailFirst->value = null;
     $resultFailFirst->ruleIndex = 0;
     $resultFailFirst->rule = new ValidationFieldRule('notEmpty');
     $resultFailSecond = new Fail('fail:notEmpty');
     $resultFailSecond->value = null;
     $resultFailSecond->ruleIndex = 1;
     $resultFailSecond->rule = new ValidationFieldRule('notEmpty');
     // Fail test, double required in empty value, twice fails.
     static::assertFalse($ruleListResult->isSuccess());
     static::assertSame('fail', $ruleListResult->getMessage());
     static::assertEquals([], $ruleListResult->getSuccesses());
     static::assertEquals([$resultFailFirst, $resultFailSecond], $ruleListResult->getResults());
     static::assertEquals([$resultFailFirst, $resultFailSecond], $ruleListResult->getFails());
     // Prepare.
     $ruleList->clear();
     $ruleList->add('notEmpty');
     $ruleList->add('trim');
     $ruleList->add('notEmpty');
     $ruleListResult = $ruleList->validate(' ');
     $resultSuccess = new Success();
     $resultSuccess->value = ' ';
     $resultSuccess->ruleIndex = 0;
     $resultSuccess->rule = new ValidationFieldRule('notEmpty');
     $resultFail = new Fail('fail:notEmpty');
     $resultFail->value = '';
     $resultFail->ruleIndex = 2;
     $resultFail->rule = new ValidationFieldRule('notEmpty');
     // Fail test, first required will pass, but second will fail because of trim.
     static::assertFalse($ruleListResult->isSuccess());
     static::assertSame('fail', $ruleListResult->getMessage());
     static::assertEquals([$resultSuccess], $ruleListResult->getSuccesses());
     static::assertEquals([$resultSuccess, $resultFail], $ruleListResult->getResults());
     static::assertEquals([$resultFail], $ruleListResult->getFails());
 }