1<?php
2
3/*
4 * This file is part of Respect/Validation.
5 *
6 * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net>
7 *
8 * For the full copyright and license information, please view the "LICENSE.md"
9 * file that was distributed with this source code.
10 */
11
12namespace Respect\Validation\Exceptions;
13
14use DirectoryIterator;
15use ReflectionClass;
16
17class CheckExceptionsTest extends \PHPUnit_Framework_TestCase
18{
19    protected $deprecateds = ['Iterable'];
20
21    public function provideListOfRuleNames()
22    {
23        $rulesDirectory = 'library/Rules';
24        $rulesDirectoryIterator = new DirectoryIterator($rulesDirectory);
25        $ruleNames = [];
26        foreach ($rulesDirectoryIterator as $fileInfo) {
27            if ($fileInfo->isDir()) {
28                continue;
29            }
30
31            $ruleName = substr($fileInfo->getBasename(), 0, -4);
32            $ruleIsDeprecated = in_array($ruleName, $this->deprecateds);
33            $isRuleClassFile = (bool) ($fileInfo->getExtension() !== 'php');
34            if ($ruleIsDeprecated || $isRuleClassFile) {
35                continue;
36            }
37
38            $className = 'Respect\\Validation\\Rules\\'.$ruleName;
39            $reflectionClass = new ReflectionClass($className);
40            if ($reflectionClass->isAbstract() || $reflectionClass->isInterface()) {
41                continue;
42            }
43
44            $ruleNames[] = [$ruleName];
45        }
46
47        return $ruleNames;
48    }
49
50    /**
51     * @dataProvider provideListOfRuleNames
52     */
53    public function testRuleHasAnExceptionWhichHasValidApi($ruleName)
54    {
55        $exceptionClass = 'Respect\\Validation\\Exceptions\\'.$ruleName.'Exception';
56        $this->assertTrue(
57            class_exists($exceptionClass),
58            sprintf('Expected exception class to exist: %s.', $ruleName)
59        );
60
61        $expectedMessage = 'Test exception message.';
62        $exceptionObject = new $exceptionClass($expectedMessage);
63        $this->assertInstanceOf(
64            'Exception',
65            $exceptionObject,
66            'Every exception should extend an Exception class.'
67        );
68        $this->assertInstanceOf(
69            'Respect\Validation\Exceptions\ValidationException',
70            $exceptionObject,
71            'Every Respect/Validation exception must extend ValidationException.'
72        );
73    }
74}
75