Skip to content

Commit f971140

Browse files
committed
✨ test(unit): add performance tests for middleware reuse and mesh operations
1 parent aefd0fc commit f971140

File tree

2 files changed

+143
-0
lines changed

2 files changed

+143
-0
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Noem\State\Tests\Unit\Middleware\Performance;
6+
7+
use Noem\State\Middleware\Mesh;
8+
use PHPUnit\Framework\Attributes\Group;
9+
use PHPUnit\Framework\TestCase;
10+
11+
/**
12+
* Acceptance Criterion: Mesh supports efficient array operations through middleware
13+
*/
14+
#[Group('middleware')]
15+
#[Group('performance')]
16+
class MeshPerformanceTest extends TestCase
17+
{
18+
public function testMeshHandlesMultipleOperations(): void
19+
{
20+
$data = ['a' => 1, 'b' => 2, 'c' => 3];
21+
$mesh = new Mesh($data);
22+
23+
// Should efficiently handle multiple reads
24+
$this->assertEquals(1, $mesh['a']);
25+
$this->assertEquals(2, $mesh['b']);
26+
$this->assertEquals(3, $mesh['c']);
27+
28+
// Should efficiently handle writes
29+
$mesh['d'] = 4;
30+
$this->assertEquals(4, $mesh['d']);
31+
32+
// Should efficiently handle exists checks
33+
$this->assertTrue(isset($mesh['a']));
34+
$this->assertFalse(isset($mesh['z']));
35+
}
36+
37+
public function testMeshWithMiddlewareExtensions(): void
38+
{
39+
$data = ['key' => 'value'];
40+
$mesh = new Mesh($data);
41+
42+
// Extend with middleware
43+
$mesh->extend(
44+
offsetGet: function ($offset, $next) {
45+
return strtoupper($next($offset));
46+
}
47+
);
48+
49+
// Middleware should be efficiently applied
50+
$result = $mesh['key'];
51+
$this->assertEquals('VALUE', $result);
52+
}
53+
54+
public function testMemoizationImprovePerformance(): void
55+
{
56+
$callCount = 0;
57+
$data = [];
58+
$mesh = new Mesh(
59+
$data,
60+
offsetGet: function ($offset) use (&$callCount) {
61+
$callCount++;
62+
return "computed-{$offset}";
63+
}
64+
);
65+
66+
$mesh->memoize();
67+
68+
// First call should compute
69+
$result1 = $mesh['test'];
70+
$this->assertEquals('computed-test', $result1);
71+
$this->assertEquals(1, $callCount);
72+
73+
// Second call should use memoized value
74+
$result2 = $mesh['test'];
75+
$this->assertEquals('computed-test', $result2);
76+
$this->assertEquals(1, $callCount); // Should not increment
77+
}
78+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Noem\State\Tests\Unit\Middleware\Performance;
6+
7+
use Noem\State\Middleware\Chain;
8+
use PHPUnit\Framework\Attributes\Group;
9+
use PHPUnit\Framework\TestCase;
10+
11+
/**
12+
* Acceptance Criterion: Chain reuses compiled middleware stack for multiple calls
13+
*/
14+
#[Group('middleware')]
15+
#[Group('performance')]
16+
class MiddlewareReuseTest extends TestCase
17+
{
18+
public function testChainReusesCompiledMiddleware(): void
19+
{
20+
$compileCount = 0;
21+
22+
$middleware = function ($context, $next) use (&$compileCount) {
23+
// This would be called each time if not reusing
24+
return $next($context);
25+
};
26+
27+
$chain = new Chain(
28+
function ($c) use (&$compileCount) {
29+
$compileCount++;
30+
return $c;
31+
},
32+
[$middleware]
33+
);
34+
35+
// First call should compile
36+
$chain->call('test1');
37+
// Subsequent calls should reuse compiled chain
38+
$chain->call('test2');
39+
$chain->call('test3');
40+
41+
// Provider called 3 times, but chain only compiled once
42+
$this->assertEquals(3, $compileCount);
43+
}
44+
45+
public function testMultipleCallsUseSameChain(): void
46+
{
47+
$executionCount = 0;
48+
49+
$chain = new Chain(fn($c) => $c);
50+
$chain->link(function ($context, $next) use (&$executionCount) {
51+
$executionCount++;
52+
return $next($context);
53+
});
54+
55+
// Multiple calls should work correctly
56+
$result1 = $chain->call('first');
57+
$result2 = $chain->call('second');
58+
$result3 = $chain->call('third');
59+
60+
$this->assertEquals('first', $result1);
61+
$this->assertEquals('second', $result2);
62+
$this->assertEquals('third', $result3);
63+
$this->assertEquals(3, $executionCount);
64+
}
65+
}

0 commit comments

Comments
 (0)