-<?php
+<?php declare(strict_types=1);
namespace PhpParser;
-abstract class CodeTestAbstract extends \PHPUnit_Framework_TestCase
-{
- protected function getTests($directory, $fileExtension) {
- $directory = realpath($directory);
- $it = new \RecursiveDirectoryIterator($directory);
- $it = new \RecursiveIteratorIterator($it, \RecursiveIteratorIterator::LEAVES_ONLY);
- $it = new \RegexIterator($it, '(\.' . preg_quote($fileExtension) . '$)');
-
- $tests = array();
- foreach ($it as $file) {
- $fileName = $file->getPathname();
- $fileContents = file_get_contents($fileName);
- $fileContents = canonicalize($fileContents);
+use PHPUnit\Framework\TestCase;
- // evaluate @@{expr}@@ expressions
- $fileContents = preg_replace_callback(
- '/@@\{(.*?)\}@@/',
- function($matches) {
- return eval('return ' . $matches[1] . ';');
- },
- $fileContents
- );
+require_once __DIR__ . '/CodeTestParser.php';
- // parse sections
- $parts = preg_split("/\n-----(?:\n|$)/", $fileContents);
+abstract class CodeTestAbstract extends TestCase
+{
+ protected function getTests($directory, $fileExtension, $chunksPerTest = 2) {
+ $parser = new CodeTestParser;
+ $allTests = [];
+ foreach (filesInDir($directory, $fileExtension) as $fileName => $fileContents) {
+ list($name, $tests) = $parser->parseTest($fileContents, $chunksPerTest);
// first part is the name
- $name = array_shift($parts) . ' (' . $fileName . ')';
+ $name .= ' (' . $fileName . ')';
$shortName = ltrim(str_replace($directory, '', $fileName), '/\\');
// multiple sections possible with always two forming a pair
- $chunks = array_chunk($parts, 2);
- foreach ($chunks as $i => $chunk) {
- $dataSetName = $shortName . (count($chunks) > 1 ? '#' . $i : '');
- list($expected, $mode) = $this->extractMode($chunk[1]);
- $tests[$dataSetName] = array($name, $chunk[0], $expected, $mode);
+ foreach ($tests as $i => list($mode, $parts)) {
+ $dataSetName = $shortName . (count($parts) > 1 ? '#' . $i : '');
+ $allTests[$dataSetName] = array_merge([$name], $parts, [$mode]);
}
}
- return $tests;
- }
-
- private function extractMode($expected) {
- $firstNewLine = strpos($expected, "\n");
- if (false === $firstNewLine) {
- $firstNewLine = strlen($expected);
- }
-
- $firstLine = substr($expected, 0, $firstNewLine);
- if (0 !== strpos($firstLine, '!!')) {
- return [$expected, null];
- }
-
- $expected = (string) substr($expected, $firstNewLine + 1);
- return [$expected, substr($firstLine, 2)];
+ return $allTests;
}
}