First unit test

This commit is contained in:
Timothy Warren 2019-11-14 11:12:32 -05:00
parent 99799e1d5a
commit de0b6bda43
5 changed files with 81 additions and 38 deletions

View File

@ -17,8 +17,8 @@
"phpunit/phpunit": "^8" "phpunit/phpunit": "^8"
}, },
"scripts": { "scripts": {
"coverage": "phpdbg -qrr -- vendor/bin/phpunit", "coverage": "phpdbg -qrr -- vendor/bin/phpunit tests",
"test": "vendor/bin/phpunit" "test": "vendor/bin/phpunit tests"
}, },
"require": { "require": {
"ext-ffi": "*" "ext-ffi": "*"

View File

@ -159,6 +159,7 @@ class Row {
"'" => Highlight::DELIMITER, "'" => Highlight::DELIMITER,
// Single character operators // Single character operators
'?' => Highlight::OPERATOR,
',' => Highlight::OPERATOR, ',' => Highlight::OPERATOR,
';' => Highlight::OPERATOR, ';' => Highlight::OPERATOR,
':' => Highlight::OPERATOR, ':' => Highlight::OPERATOR,
@ -445,10 +446,14 @@ class Row {
{ {
$rowNum = $this->idx + 1; $rowNum = $this->idx + 1;
if ( $hasTokens = isset($this->parent->syntax->tokens);
( ! isset($this->parent->syntax->tokens)) $hasRow = array_key_exists($rowNum, $this->parent->syntax->tokens);
|| ( ! array_key_exists($rowNum, $this->parent->syntax->tokens))
|| $this->idx > $this->parent->numRows) if ( ! (
isset($this->parent->syntax->tokens) &&
array_key_exists($rowNum, $this->parent->syntax->tokens) &&
$this->idx < $this->parent->numRows
))
{ {
return; return;
} }
@ -461,28 +466,6 @@ class Row {
// multiples of the same tokens can be effectively matched // multiples of the same tokens can be effectively matched
$offset = 0; $offset = 0;
// There will be no tokens if a line is empty, or if in a multi-line comment
if (empty($tokens))
{
if ($inComment && $this->rsize > 0)
{
while ($offset < $this->rsize)
{
if (substr($this->render, $offset, 2) === '*/')
{
array_replace_range($this->hl, $offset, 2, Highlight::ML_COMMENT);
break;
}
$this->hl[$offset] = Highlight::ML_COMMENT;
$offset++;
continue;
}
}
return;
}
foreach ($tokens as $token) foreach ($tokens as $token)
{ {
if ($offset >= $this->rsize) if ($offset >= $this->rsize)
@ -535,17 +518,23 @@ class Row {
// Start of multi-line comment // Start of multi-line comment
$start = strpos($this->render, '/*', $offset); $start = strpos($this->render, '/*', $offset);
$end = strpos($this->render, '*/', $offset); $end = strpos($this->render, '*/', $offset);
if ($start !== FALSE && $end !== FALSE) $hasStart = $start !== FALSE;
$hasEnd = $end !== FALSE;
if ($hasStart)
{ {
$len = $end - $start + 2; if ($hasEnd)
array_replace_range($this->hl, $start, $len, Highlight::ML_COMMENT); {
$inComment = FALSE; $len = $end - $start + 2;
} array_replace_range($this->hl, $start, $len, Highlight::ML_COMMENT);
if ($start !== FALSE && $end === FALSE) $inComment = FALSE;
{ }
$inComment = TRUE; else
array_replace_range($this->hl, $start, $charLen - $offset, Highlight::ML_COMMENT); {
$offset = $start + $charLen - $offset; $inComment = TRUE;
array_replace_range($this->hl, $start, $charLen - $offset, Highlight::ML_COMMENT);
$offset = $start + $charLen - $offset;
}
} }
if ($inComment) if ($inComment)

View File

@ -240,6 +240,13 @@ function array_replace_range(array &$array, int $offset, int $length, $value):vo
} */ } */
} }
function str_contains(string $haystack, string $str, ?int $offset = NULL): bool
{
return ($offset !== NULL)
? strpos($haystack, $str, $offset) !== FALSE
: strpos($haystack, $str) !== FALSE;
}
/** /**
* Get the ASCII color escape number for the specified syntax type * Get the ASCII color escape number for the specified syntax type
* *

View File

@ -46,6 +46,8 @@ class FooBar extends Foo implements Ifoo {
*/ */
$foobar = new FooBar(); $foobar = new FooBar();
$baz = ['a' => 'b'];
// C++ style comment // C++ style comment
$x = 3; $x = 3;
@ -56,6 +58,11 @@ $y = [
3 3
]; ];
// Multi-line ternary statement
$q = ($x !== 2)
? 'yes'
: 'no';
/* /*
Heredoc Heredoc
*/$z = $x + $y; */$z = $x + $y;

View File

@ -2,8 +2,48 @@
namespace Aviat\Kilo\Tests; namespace Aviat\Kilo\Tests;
use function Aviat\Kilo\get_php_tokens;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class FunctionTest extends TestCase { class FunctionTest extends TestCase {
public function testGetPhpTokensLineAlignment(): void
{
$file = file_get_contents(realpath(__DIR__ . '/../test.php'));
$tokens = get_php_tokens($file);
$this->assertNotEmpty($file);
$lines = explode("\n", $file);
array_unshift($lines, '');
$misplacedTokens = [];
foreach ($tokens as $index => $lineTokens)
{
if (empty($lineTokens))
{
$this->assertNotEmpty(trim($lines[$index]), 'Token is empty for non-empty line');
}
foreach ($lineTokens as $token)
{
// don't compare whitespace-only tokens
if (empty(trim($token['char'])))
{
continue;
}
$this->assertIsArray($token, 'All outputted tokens should be arrays');
// Make sure the matched string for the token is on the correct line
if (strpos($lines[$index], trim($token['char'])) === FALSE)
{
$token['misplaced_line'] = $index;
$misplacedTokens[] = $token;
}
}
}
$this->assertEmpty($misplacedTokens, 'Not all tokens are on the correct lines: ' . print_r($misplacedTokens, TRUE));
}
} }