Files
wp-agentic-writer/vendor/parsica-php/parsica/tests/Issues/GH26_Test.php
Dwindi Ramadhana 690991c526 refactor: Cleanup git state - commit all staged changes
Major refactoring cleanup:
- Add new controller architecture (class-controller-*.php)
- Add new settings-v2 UI (views/settings-v2/)
- Add new CSS architecture (agentic-sidebar.css, tokens)
- Add esbuild build pipeline (scripts/build.js, package.json)
- Add composer dependencies (vendor/)
- Add frontend src directory (assets/js/src/index.jsx)
- Add documentation files
- Remove old/obsolete files (class-settings.php, old CSS)

This commits all pending changes from previous refactoring efforts.
2026-06-17 05:27:58 +07:00

162 lines
4.4 KiB
PHP

<?php declare(strict_types=1);
/**
* This file is part of the Parsica library.
*
* Copyright (c) 2020 Mathias Verraes <mathias@verraes.net>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Tests\Parsica\Parsica\Issues;
use PHPUnit\Framework\TestCase;
use Parsica\Parsica\Parser;
use Parsica\Parsica\PHPUnit\ParserAssertions;
use function Parsica\Parsica\alphaNumChar;
use function Parsica\Parsica\any;
use function Parsica\Parsica\atLeastOne;
use function Parsica\Parsica\between;
use function Parsica\Parsica\char;
use function Parsica\Parsica\either;
use function Parsica\Parsica\emit;
use function Parsica\Parsica\eof;
use function Parsica\Parsica\fail;
use function Parsica\Parsica\many;
use function Parsica\Parsica\succeed;
/**
* https://github.com/mathiasverraes/parsica/issues/6
*/
final class GH26_Test extends TestCase
{
use ParserAssertions;
private static function pathParser(): Parser
{
$sep = char('/')
->label('directory separator');
// unix supports other characters, such as space, so adapt if needed
$name = atLeastOne(char('.')->or(char('_'))->or(alphaNumChar()))
->label("directory or filename");
$parser = many($sep->followedBy($name));
return $parser;
}
/** @test */
public function parsing_a_simple_path()
{
$parser = self::pathParser();
$input = "/a/b/c/file1";
$expected = ["a", "b", "c", "file1"];
$this->assertParses($input, $parser, $expected);
}
/**
* https://github.com/mathiasverraes/parsica/issues/6#issuecomment-653772920
*
* @test
*/
public function only_the_first_successful_parser_in_an_either_should_call_emit()
{
$x = new class {
public bool $first = false;
public bool $second = false;
};
$parser = either(
emit(
succeed(),
function ($output) use ($x) {
$x->first = true; // is called
}
),
emit(
succeed(),
function ($output) use ($x) {
$x->second = true; // is not called
}
)
);
$result = $parser->tryString('test');
$this->assertEquals(true, $x->first);
$this->assertEquals(false, $x->second, "Either should only call emit on the first successful parser");
}
/**
* @TODO Set $repeatParser at 500 and fix the performance issues.
*
* https://github.com/mathiasverraes/parsica/issues/6#issuecomment-653772920
*
* @test
*/
public function it_should_parse_500_times_in_under_100_ms()
{
// Number of times we run the parser
$repeatParser = 1;//500;
$propertyName = atLeastOne(alphaNumChar());
$type = emit(
either(
eof(),
char('@')
->followedBy($propertyName)
->thenIgnore(eof()),
),
function () {}
);
$map = emit(
char('.')->followedBy($propertyName),
function () {}
);
$list = emit(
between(
char('['),
char(']'),
either(
char('@')
->followedBy($propertyName)
->map(fn($value) => [
'discriminatorName' => $value,
'keepKeys' => true
]),
$propertyName
->map(fn($value) => [
'discriminatorName' => $value,
'keepKeys' => false
]),
)
),
function () {}
);
$root = emit(
char('$'),
function () {}
);
$rest = many(any($map, $list))->followedBy($type);
$parser = either(
fail("message"), // $context->preflightCacheParser(),
$root
)->followedBy($rest);
$start = microtime(true);
for ($i = 0; $i < $repeatParser; $i++) {
$parser->tryString('$.q.w[@1].e[2]@int');
}
$end = microtime(true);
$this->assertLessThan(0.1, $end - $start);
}
}