Files
wp-agentic-writer/vendor/parsica-php/parsica/tests/Curry/CurryTest.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

291 lines
7.9 KiB
PHP

<?php declare(strict_types=1);
/**
* This code is forked from https://github.com/matteosister/php-curry, which is abandoned. It could be integrated into
* the rest of Parsica.
*/
namespace Tests\Parsica\Parsica\Curry;
use PHPUnit\Framework\TestCase;
use function Parsica\Parsica\Curry\__;
use function Parsica\Parsica\Curry\_is_fullfilled;
use function Parsica\Parsica\Curry\_rest;
use function Parsica\Parsica\Curry\curry;
use function Parsica\Parsica\Curry\curry_args;
use function Parsica\Parsica\Curry\curry_right;
use function Parsica\Parsica\Curry\curry_right_args;
final class CurryTest extends TestCase
{
/**
* @test
*/
public function curry_without_params()
{
$simpleFunction = curry(function () {
return 1;
});
$this->assertEquals(1, $simpleFunction());
}
/**
* @test
*/
public function curry_identity()
{
$identity = curry([new TestSubject(), 'identity'], 1);
$this->assertEquals(1, $identity(1));
}
/**
* @test
*/
public function curry_identity_function()
{
$func = curry(function ($v) {
return $v;
}, 'test string');
$this->assertEquals('test string', $func());
}
/**
* @test
*/
public function curry_with_one_later_param()
{
$curriedOne = curry([new TestSubject(), 'add2'], 1);
$this->assertInstanceOf('Closure', $curriedOne);
$this->assertEquals(2, $curriedOne(1));
}
/**
* @test
*/
public function curry_with_two_later_param()
{
$curriedTwo = curry([new TestSubject(), 'add4'], 1, 1);
$this->assertInstanceOf('Closure', $curriedTwo);
$this->assertEquals(4, $curriedTwo(1, 1));
}
/**
* @test
*/
public function curry_with_successive_calls()
{
$curriedTwo = curry([new TestSubject(), 'add4'], 1, 1);
$curriedThree = $curriedTwo(1);
$this->assertEquals(4, $curriedThree(1));
}
/**
* @test
*/
public function curry_right()
{
$divideBy10 = curry_right([new TestSubject(), 'divide2'], 10);
$this->assertInstanceOf('Closure', $divideBy10);
$this->assertEquals(10, $divideBy10(100));
}
/**
* @test
*/
public function curry_right_immediate()
{
$divide3 = curry_right([new TestSubject(), 'divide3'], 5, 2, 20);
$this->assertEquals(2, $divide3());
}
/**
* @test
*/
public function curry_left_immediate()
{
$divide3 = curry([new TestSubject(), 'divide3'], 20, 2, 4);
$this->assertEquals(2.5, $divide3());
}
/**
* @test
*/
public function curry_three_times()
{
$divideBy5 = curry([new TestSubject(), 'divide3'], 100);
$divideBy10And5 = $divideBy5(10);
$this->assertEquals(2, $divideBy10And5(5));
}
/**
* @test
*/
public function curry_right_three_times()
{
$divideBy5 = curry_right([new TestSubject(), 'divide3'], 5);
$divideBy10And5 = $divideBy5(10);
$this->assertEquals(2, $divideBy10And5(100));
}
/**
* @test
*/
public function curry_using_func_get_args()
{
$fnNoArgs = function () {
return func_get_args();
};
$curried = curry($fnNoArgs);
$curriedRight = curry_right($fnNoArgs);
$this->assertEquals([], $fnNoArgs());
$this->assertEquals([], $curried());
$this->assertEquals([], $curriedRight());
$this->assertEquals([1], $fnNoArgs(1));
$this->assertEquals([1], $curried(1));
$this->assertEquals([1], $curriedRight(1));
$this->assertEquals([1, 2, 'three'], $fnNoArgs(1, 2, 'three'));
$this->assertEquals([1, 2, 'three'], $curried(1, 2, 'three'));
$this->assertEquals([1, 2, 'three'], $curriedRight(1, 2, 'three'));
$fnOneArg = function ($x) {
return func_get_args();
};
$curried = curry($fnOneArg);
$curriedRight = curry_right($fnOneArg);
$this->assertEquals([1], $fnOneArg(1));
$this->assertEquals([1], $curried(1));
$this->assertEquals([1], $curriedRight(1));
$this->assertEquals([1, 2, 'three'], $fnOneArg(1, 2, 'three'));
$this->assertEquals([1, 2, 'three'], $curried(1, 2, 'three'));
$this->assertEquals([1, 2, 'three'], $curriedRight(1, 2, 'three'));
$fnTwoArgs = function ($x, $y) {
return func_get_args();
};
$curried = curry($fnTwoArgs);
$curriedRight = curry_right($fnTwoArgs);
$curriedOne = $curried(1);
$curriedRightOne = $curriedRight(2);
$curriedRightTwo = $curriedRight('three');
$this->assertEquals([1, 2], $fnTwoArgs(1, 2));
$this->assertEquals([1, 2], $curried(1, 2));
$this->assertEquals([1, 2], $curriedRight(2, 1));
$this->assertEquals([1, 2, 'three'], $fnTwoArgs(1, 2, 'three'));
$this->assertEquals([1, 2, 'three'], $curried(1, 2, 'three'));
$this->assertEquals([1, 2, 'three'], $curriedRight('three', 2, 1));
$this->assertEquals([1, 2], $curriedOne(2));
$this->assertEquals([1, 2], $curriedRightOne(1));
$this->assertEquals([1, 2, 'three'], $curriedOne(2, 'three'));
$this->assertEquals([1, 2, 'three'], $curriedRightTwo(2, 1));
}
/**
* @test
*/
public function curry_with_placeholders()
{
$minus = curry(function ($x, $y) {
return $x - $y;
});
$decrement = $minus(__(), 1);
$this->assertEquals(9, $decrement(10));
$introduce = curry(function ($name, $age, $job, $details = '') {
return "{$name}, {$age} years old, is a {$job} {$details}";
});
$introduceDeveloper = $introduce(__(), __(), 'Developer');
$this->assertEquals("Foo, 20 years old, is a Developer ", $introduceDeveloper('Foo', 20));
$introduceOld = $introduce(__(), 99, __());
$this->assertEquals("Foo, 99 years old, is a Developer and Cooker as well", $introduceOld('Foo', 'Developer', 'and Cooker as well'));
$introduceSkipName = $introduce(__());
$introduceSkipJob = $introduceSkipName(99, __());
$this->assertEquals("Foo, 99 years old, is a Cooker ", $introduceSkipJob('Foo', 'Cooker'));
$this->assertEquals("Foo, 99 years old, is a Cooker yumm !", $introduceSkipJob('Foo', 'Cooker', 'yumm !'));
$reduce = curry('array_reduce');
$add = function ($x, $y) {
return $x + $y;
};
$sum = $reduce(__(), $add);
$this->assertEquals(10, $sum([1, 2, 3, 4], 0));
}
/**
* @test
*/
public function rest()
{
$this->assertEquals([1], _rest([1, 1]));
$this->assertEquals(['a', 'b'], _rest([1, 'a', 'b']));
$this->assertEquals([], _rest([1]));
$this->assertEquals([], _rest([]));
}
/**
* @test
* @dataProvider provider_is_fullfilled
*/
public function is_fullfilled($isFullfilled, $args, $callable)
{
$this->assertSame($isFullfilled, _is_fullfilled($callable, $args));
}
public function provider_is_fullfilled()
{
return [[false, [], function ($a) {
}], [true, [], function () {
}], [true, [1], function ($a) {
}], [false, [1], function ($a, $b) {
}], [false, [1], [new TestSubject(), 'add2']], [true, [1, 2], [new TestSubject(), 'add2']], [true, ['aaa', 'a'], 'strpos'],];
}
}
final class TestSubject
{
public function identity($a)
{
return $a;
}
public function add2($a, $b)
{
return $a + $b;
}
public function divide2($a, $b)
{
return $a / $b;
}
public function divide3($a, $b, $c)
{
return $a / $b / $c;
}
public function add3($a, $b, $c)
{
return $a + $b + $c;
}
public function add4($a, $b, $c, $d)
{
return $a + $b + $c + $d;
}
}