1<?php
2/*
3 * This file is part of the php-code-coverage package.
4 *
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
6 *
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
9 */
10
11namespace SebastianBergmann\CodeCoverage;
12
13class FilterTest extends \PHPUnit_Framework_TestCase
14{
15    /**
16     * @var Filter
17     */
18    private $filter;
19
20    /**
21     * @var array
22     */
23    private $files = [];
24
25    protected function setUp()
26    {
27        $this->filter = unserialize('O:37:"SebastianBergmann\CodeCoverage\Filter":0:{}');
28
29        $this->files = [
30            TEST_FILES_PATH . 'BankAccount.php',
31            TEST_FILES_PATH . 'BankAccountTest.php',
32            TEST_FILES_PATH . 'CoverageClassExtendedTest.php',
33            TEST_FILES_PATH . 'CoverageClassTest.php',
34            TEST_FILES_PATH . 'CoverageFunctionParenthesesTest.php',
35            TEST_FILES_PATH . 'CoverageFunctionParenthesesWhitespaceTest.php',
36            TEST_FILES_PATH . 'CoverageFunctionTest.php',
37            TEST_FILES_PATH . 'CoverageMethodOneLineAnnotationTest.php',
38            TEST_FILES_PATH . 'CoverageMethodParenthesesTest.php',
39            TEST_FILES_PATH . 'CoverageMethodParenthesesWhitespaceTest.php',
40            TEST_FILES_PATH . 'CoverageMethodTest.php',
41            TEST_FILES_PATH . 'CoverageNoneTest.php',
42            TEST_FILES_PATH . 'CoverageNotPrivateTest.php',
43            TEST_FILES_PATH . 'CoverageNotProtectedTest.php',
44            TEST_FILES_PATH . 'CoverageNotPublicTest.php',
45            TEST_FILES_PATH . 'CoverageNothingTest.php',
46            TEST_FILES_PATH . 'CoveragePrivateTest.php',
47            TEST_FILES_PATH . 'CoverageProtectedTest.php',
48            TEST_FILES_PATH . 'CoveragePublicTest.php',
49            TEST_FILES_PATH . 'CoverageTwoDefaultClassAnnotations.php',
50            TEST_FILES_PATH . 'CoveredClass.php',
51            TEST_FILES_PATH . 'CoveredFunction.php',
52            TEST_FILES_PATH . 'NamespaceCoverageClassExtendedTest.php',
53            TEST_FILES_PATH . 'NamespaceCoverageClassTest.php',
54            TEST_FILES_PATH . 'NamespaceCoverageCoversClassPublicTest.php',
55            TEST_FILES_PATH . 'NamespaceCoverageCoversClassTest.php',
56            TEST_FILES_PATH . 'NamespaceCoverageMethodTest.php',
57            TEST_FILES_PATH . 'NamespaceCoverageNotPrivateTest.php',
58            TEST_FILES_PATH . 'NamespaceCoverageNotProtectedTest.php',
59            TEST_FILES_PATH . 'NamespaceCoverageNotPublicTest.php',
60            TEST_FILES_PATH . 'NamespaceCoveragePrivateTest.php',
61            TEST_FILES_PATH . 'NamespaceCoverageProtectedTest.php',
62            TEST_FILES_PATH . 'NamespaceCoveragePublicTest.php',
63            TEST_FILES_PATH . 'NamespaceCoveredClass.php',
64            TEST_FILES_PATH . 'NotExistingCoveredElementTest.php',
65            TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php',
66            TEST_FILES_PATH . 'source_with_ignore.php',
67            TEST_FILES_PATH . 'source_with_namespace.php',
68            TEST_FILES_PATH . 'source_with_oneline_annotations.php',
69            TEST_FILES_PATH . 'source_without_ignore.php',
70            TEST_FILES_PATH . 'source_without_namespace.php'
71        ];
72    }
73
74    /**
75     * @covers SebastianBergmann\CodeCoverage\Filter::addFileToWhitelist
76     * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist
77     */
78    public function testAddingAFileToTheWhitelistWorks()
79    {
80        $this->filter->addFileToWhitelist($this->files[0]);
81
82        $this->assertEquals(
83            [$this->files[0]],
84            $this->filter->getWhitelist()
85        );
86    }
87
88    /**
89     * @covers SebastianBergmann\CodeCoverage\Filter::removeFileFromWhitelist
90     * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist
91     */
92    public function testRemovingAFileFromTheWhitelistWorks()
93    {
94        $this->filter->addFileToWhitelist($this->files[0]);
95        $this->filter->removeFileFromWhitelist($this->files[0]);
96
97        $this->assertEquals([], $this->filter->getWhitelist());
98    }
99
100    /**
101     * @covers  SebastianBergmann\CodeCoverage\Filter::addDirectoryToWhitelist
102     * @covers  SebastianBergmann\CodeCoverage\Filter::getWhitelist
103     * @depends testAddingAFileToTheWhitelistWorks
104     */
105    public function testAddingADirectoryToTheWhitelistWorks()
106    {
107        $this->filter->addDirectoryToWhitelist(TEST_FILES_PATH);
108
109        $whitelist = $this->filter->getWhitelist();
110        sort($whitelist);
111
112        $this->assertEquals($this->files, $whitelist);
113    }
114
115    /**
116     * @covers SebastianBergmann\CodeCoverage\Filter::addFilesToWhitelist
117     * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist
118     */
119    public function testAddingFilesToTheWhitelistWorks()
120    {
121        $facade = new \File_Iterator_Facade;
122
123        $files = $facade->getFilesAsArray(
124            TEST_FILES_PATH,
125            $suffixes = '.php'
126        );
127
128        $this->filter->addFilesToWhitelist($files);
129
130        $whitelist = $this->filter->getWhitelist();
131        sort($whitelist);
132
133        $this->assertEquals($this->files, $whitelist);
134    }
135
136    /**
137     * @covers  SebastianBergmann\CodeCoverage\Filter::removeDirectoryFromWhitelist
138     * @covers  SebastianBergmann\CodeCoverage\Filter::getWhitelist
139     * @depends testAddingADirectoryToTheWhitelistWorks
140     */
141    public function testRemovingADirectoryFromTheWhitelistWorks()
142    {
143        $this->filter->addDirectoryToWhitelist(TEST_FILES_PATH);
144        $this->filter->removeDirectoryFromWhitelist(TEST_FILES_PATH);
145
146        $this->assertEquals([], $this->filter->getWhitelist());
147    }
148
149    /**
150     * @covers SebastianBergmann\CodeCoverage\Filter::isFile
151     */
152    public function testIsFile()
153    {
154        $this->assertFalse($this->filter->isFile('vfs://root/a/path'));
155        $this->assertFalse($this->filter->isFile('xdebug://debug-eval'));
156        $this->assertFalse($this->filter->isFile('eval()\'d code'));
157        $this->assertFalse($this->filter->isFile('runtime-created function'));
158        $this->assertFalse($this->filter->isFile('assert code'));
159        $this->assertFalse($this->filter->isFile('regexp code'));
160        $this->assertTrue($this->filter->isFile(__FILE__));
161    }
162
163    /**
164     * @covers SebastianBergmann\CodeCoverage\Filter::isFiltered
165     */
166    public function testWhitelistedFileIsNotFiltered()
167    {
168        $this->filter->addFileToWhitelist($this->files[0]);
169        $this->assertFalse($this->filter->isFiltered($this->files[0]));
170    }
171
172    /**
173     * @covers SebastianBergmann\CodeCoverage\Filter::isFiltered
174     */
175    public function testNotWhitelistedFileIsFiltered()
176    {
177        $this->filter->addFileToWhitelist($this->files[0]);
178        $this->assertTrue($this->filter->isFiltered($this->files[1]));
179    }
180
181    /**
182     * @covers SebastianBergmann\CodeCoverage\Filter::isFiltered
183     * @covers SebastianBergmann\CodeCoverage\Filter::isFile
184     */
185    public function testNonFilesAreFiltered()
186    {
187        $this->assertTrue($this->filter->isFiltered('vfs://root/a/path'));
188        $this->assertTrue($this->filter->isFiltered('xdebug://debug-eval'));
189        $this->assertTrue($this->filter->isFiltered('eval()\'d code'));
190        $this->assertTrue($this->filter->isFiltered('runtime-created function'));
191        $this->assertTrue($this->filter->isFiltered('assert code'));
192        $this->assertTrue($this->filter->isFiltered('regexp code'));
193    }
194}
195