Completed
Push — renovate/css-loader-5.x ( b1ade2...04695b )
by
unknown
23:16 queued 14:14
created

JetpackStandardTest::provide_files()   B

Complexity

Conditions 8
Paths 8

Size

Total Lines 34

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
nc 8
nop 0
dl 0
loc 34
rs 8.1315
c 0
b 0
f 0
1
<?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
/**
3
 * Tests for the Jetpack phpcs standard.
4
 *
5
 * @package automattic/jetpack-codesniffer
6
 */
7
8
namespace Automattic\Jetpack\Sniffs\Tests;
9
10
use PHP_CodeSniffer\Config;
11
use PHP_CodeSniffer\Files\DummyFile;
12
use PHP_CodeSniffer\Reporter;
13
use PHP_CodeSniffer\Ruleset;
14
use PHPUnit\Framework\TestCase;
15
use RecursiveDirectoryIterator;
16
use RecursiveIteratorIterator;
17
use RegexIterator;
18
19
/**
20
 * Tests for the Jetpack phpcs standard.
21
 */
22
class JetpackStandardTest extends TestCase {
23
24
	/**
25
	 * Run phpcs on a file.
26
	 *
27
	 * @param string $file File to process. Actual data will be read from "$file.tolint".
28
	 * @param bool   $fix Run in fix mode, returning the fixed file.
29
	 * @return string If `$fix` is false, the phpcs report. If `$fix` is true,
30
	 *   the fixed file.
31
	 */
32
	private function run_phpcs( $file, $fix ) {
33
		// phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
34
		$contents = file_get_contents( "{$file}.tolint" );
35
		$this->assertInternalType( 'string', $contents );
36
37
		$config = new Config();
38
39
		$config->standards   = array( __DIR__ . '/../../../Jetpack/ruleset.xml' );
40
		$config->files       = array( $file );
41
		$config->encoding    = 'utf-8';
42
		$config->reports     = array( 'full' => null );
43
		$config->colors      = false;
44
		$config->reportWidth = PHP_INT_MAX; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
45
		$config->showSources = true; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
46
		$config->tabWidth    = 4; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
47
48
		$ruleset = new Ruleset( $config );
49
		$dummy   = new DummyFile( $contents, $ruleset, $config );
50
		$dummy->process();
51
52
		if ( ! $fix ) {
53
			$reporter = new Reporter( $config );
54
			$reporter->cacheFileReport( $dummy );
55
			ob_start();
56
			$reporter->printReport( 'full' );
57
			$result = ob_get_clean();
58
59
			// Clean up output.
60
			$lines = preg_split( '/[\r\n]+/', $result, -1, PREG_SPLIT_NO_EMPTY );
61
			$lines = preg_grep( '/^-*$|^(?:Time:|FILE:|FOUND|PHPCBF) /', $lines, PREG_GREP_INVERT );
62
			return implode( "\n", $lines ) . "\n";
63
		} elseif ( $dummy->getFixableCount() ) {
64
			$dummy->fixer->fixFile();
65
			return $dummy->fixer->getContents();
66
		} else {
67
			return $contents;
68
		}
69
	}
70
71
	/**
72
	 * Test the sniffs by running phpcs or phpcbf against a file.
73
	 *
74
	 * @dataProvider provide_files
75
	 * @param string $file Base filename, without the ".tolint", ".report", or ".fixed" extension.
76
	 * @param bool   $fix Run as phpcbf rather than phpcs.
77
	 */
78
	public function test_phpcs( $file, $fix ) {
79
		// phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
80
		$expect = file_get_contents( $fix ? "$file.fixed" : "$file.report" );
81
		$this->assertInternalType( 'string', $expect );
82
		$this->assertEquals( $expect, $this->run_phpcs( $file, $fix ) );
83
	}
84
85
	/**
86
	 * Provide arguments for `test_phpcs()`.
87
	 *
88
	 * @return array
89
	 */
90
	public function provide_files() {
91
		$dir_iterator = new RecursiveDirectoryIterator( __DIR__ . '/files', RecursiveDirectoryIterator::CURRENT_AS_PATHNAME );
92
		$iterator     = new RegexIterator(
93
			new RecursiveIteratorIterator( $dir_iterator ),
94
			'/\.(?:tolint|report|fixed)$/'
95
		);
96
		$files        = iterator_to_array( $iterator );
97
98
		$ret = array();
99
		foreach ( $files as $file => $dummy ) {
100
			$i    = strrpos( $file, '.' );
101
			$ext  = substr( $file, $i );
102
			$file = substr( $file, 0, $i );
103
104
			switch ( $ext ) {
105
				case '.tolint':
106
					if ( ! isset( $files[ "$file.report" ] ) && ! isset( $files[ "$file.fixed" ] ) ) {
107
						fprintf( STDERR, "%s: %s.tolint exists, but both %s.report and %s.fixed are missing.\n", __METHOD__, $file, $file, $file );
108
					}
109
					break;
110
111
				case '.report':
112
				case '.fixed':
113
					if ( isset( $files[ "$file.tolint" ] ) ) {
114
						$ret[ "$file$ext" ] = array( $file, '.fixed' === $ext );
115
					} else {
116
						fprintf( STDERR, "%s: %s exists, but %s.tolint is missing.\n", __METHOD__, $file . $ext, $file );
117
					}
118
					break;
119
			}
120
		}
121
122
		return $ret;
123
	}
124
125
}
126