Skip to content

Commit 4e9d84f

Browse files
committed
test: debug namespace tests
1 parent b521613 commit 4e9d84f

File tree

2 files changed

+113
-39
lines changed

2 files changed

+113
-39
lines changed
Lines changed: 66 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,77 @@
11
<?php
2-
namespace Gt\WebEngine\Test\Debug;
2+
namespace GT\WebEngine\Test\Debug;
33

4-
use Gt\WebEngine\Debug\OutputBuffer;
4+
use GT\WebEngine\Debug\OutputBuffer;
55
use PHPUnit\Framework\TestCase;
66

77
class OutputBufferTest extends TestCase {
8-
public function testEchoIsCaptured():void {
9-
$sut = new OutputBuffer();
8+
public function testStart_invokesObStartHandler(): void {
9+
$called = false;
10+
$obStart = function() use (&$called) { $called = true; };
11+
$sut = new OutputBuffer(debugToJavaScript: true, obStartHandler: $obStart);
1012
$sut->start();
11-
echo "Hello world";
12-
$buffer = $sut->cleanBuffer();
13-
self::assertSame("Hello world", $buffer);
13+
self::assertTrue($called, 'Expected injected ob_start handler to be invoked');
1414
}
1515

16-
public function testVarDumpIsCaptured():void {
17-
$sut = new OutputBuffer();
16+
public function testDebugOutput_emptyBuffer_returnsNull(): void {
17+
$obStart = function() { /* no-op */ };
18+
$obGetCleanValues = [""]; // empty string simulates no output
19+
$obGetClean = function() use (&$obGetCleanValues) { return array_shift($obGetCleanValues); };
20+
$sut = new OutputBuffer(true, $obStart, $obGetClean);
1821
$sut->start();
19-
$var = ["a" => 1, "b" => 2];
20-
var_dump($var);
21-
$buffer = $sut->cleanBuffer();
22-
// var_dump format can vary; assert key parts present rather than exact formatting
23-
self::assertNotSame("", $buffer);
24-
self::assertStringContainsString("array", $buffer);
25-
self::assertStringContainsString("int(1)", $buffer);
26-
self::assertStringContainsString("int(2)", $buffer);
22+
self::assertNull($sut->debugOutput());
23+
}
24+
25+
public function testDebugOutput_whenDebugToJavaScriptFalse_returnsNullDespiteBuffer(): void {
26+
$obStart = function() {};
27+
$obGetCleanValues = ["Some output"];
28+
$obGetClean = function() use (&$obGetCleanValues) { return array_shift($obGetCleanValues); };
29+
$sut = new OutputBuffer(false, $obStart, $obGetClean);
30+
$sut->start();
31+
self::assertNull($sut->debugOutput());
32+
}
33+
34+
public function testDebugOutput_returnsScriptWithEscapedBackticks_andTrimApplied(): void {
35+
$obStart = function() {};
36+
$raw = " Hello `there` \n"; // leading/trailing whitespace and a backtick
37+
$obGetCleanValues = [$raw];
38+
$obGetClean = function() use (&$obGetCleanValues) { return array_shift($obGetCleanValues); };
39+
$sut = new OutputBuffer(true, $obStart, $obGetClean);
40+
$sut->start();
41+
$html = $sut->debugOutput();
42+
self::assertNotNull($html);
43+
self::assertStringContainsString('<script>', $html);
44+
self::assertStringContainsString('console.group("PHP.GT/WebEngine")', $html);
45+
$expectedBuffer = str_replace('`', '\\`', trim($raw));
46+
self::assertStringContainsString($expectedBuffer, $html);
47+
}
48+
49+
public function testCleanBuffer_accumulatesAndNormalisesNull(): void {
50+
$obStart = function() {};
51+
$sequence = ["one", null, "two"]; // null should normalise to empty string
52+
$obGetClean = function() use (&$sequence) { return array_shift($sequence); };
53+
$sut = new OutputBuffer(true, $obStart, $obGetClean);
54+
$sut->start();
55+
// Manually accumulate twice, then let debugOutput() call a final clean
56+
$sut->cleanBuffer(); // "one"
57+
$sut->cleanBuffer(); // null -> ""
58+
$html = $sut->debugOutput(); // "two" + emit script
59+
self::assertNotNull($html);
60+
self::assertStringContainsString('onetwo', $html);
61+
}
62+
63+
public function testFillBuffer_privateMethod_appendsAndReturnsValue(): void {
64+
$sut = new OutputBuffer(true, function(){}, function(){ return ''; });
65+
$ref = new \ReflectionClass($sut);
66+
$m = $ref->getMethod('fillBuffer');
67+
$m->setAccessible(true);
68+
$ret1 = $m->invoke($sut, 'A');
69+
$ret2 = $m->invoke($sut, 'B');
70+
self::assertSame('A', $ret1);
71+
self::assertSame('B', $ret2);
72+
// Now force debugOutput() to flush accumulated buffer
73+
$html = $sut->debugOutput();
74+
self::assertNotNull($html);
75+
self::assertStringContainsString('AB', $html);
2776
}
2877
}

test/phpunit/Debug/TimerTest.php

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,66 @@
11
<?php
2-
namespace Gt\WebEngine\Test\Debug;
2+
namespace GT\WebEngine\Test\Debug;
33

4-
use Gt\WebEngine\Debug\Timer;
4+
use GT\WebEngine\Debug\Timer;
55
use PHPUnit\Framework\TestCase;
66

77
class TimerTest extends TestCase {
8-
public function testDeltaWithInjectedTimeGetter():void {
9-
$times = [100.0, 102.5];
10-
$index = 0;
11-
$timeGetter = function() use (&$times, &$index) {
12-
$value = $times[$index] ?? end($times);
13-
$index++;
14-
return $value;
15-
};
8+
public function testStart_stop_getDelta_usesInjectedTimeGetter(): void {
9+
$times = [100.0, 100.25];
10+
$timeGetter = function() use (&$times) { return array_shift($times); };
11+
$sut = new Timer(timeGetter: $timeGetter);
12+
$sut->start();
13+
$sut->stop();
14+
self::assertSame(0.25, $sut->getDelta());
15+
}
1616

17+
public function testLogDelta_noCallback_returnsEarly_withoutError(): void {
18+
$times = [1.0, 1.2];
19+
$timeGetter = function() use (&$times) { return array_shift($times); };
1720
$sut = new Timer(timeGetter: $timeGetter);
1821
$sut->start();
1922
$sut->stop();
20-
self::assertSame(2.5, $sut->getDelta());
23+
// No assertions besides not throwing — ensures early return path when no callback set.
24+
$sut->logDelta();
25+
self::assertTrue(true);
2126
}
2227

23-
public function testStopMultipleTimesUsesLatestEndTime():void {
24-
$times = [10.0, 20.0, 40.0, 80.0, 160.0];
25-
$index = 0;
26-
$timeGetter = function() use (&$times, &$index) {
27-
$value = $times[$index] ?? end($times);
28-
$index++;
29-
return $value;
30-
};
28+
public function testLogDelta_belowThreshold_doesNotCallCallback(): void {
29+
$called = false;
30+
$cb = function(string $msg) use (&$called) { $called = true; };
31+
$times = [10.0, 10.04]; // delta 0.04 — below default slow (0.1)
32+
$timeGetter = function() use (&$times) { return array_shift($times); };
33+
$sut = new Timer(deltaLogCallback: $cb, timeGetter: $timeGetter);
34+
$sut->start();
35+
$sut->stop();
36+
$sut->logDelta();
37+
self::assertFalse($called, 'Callback should not be invoked when delta is below slow threshold');
38+
}
3139

32-
$sut = new Timer(timeGetter: $timeGetter);
40+
public function testLogDelta_slowThreshold_callsCallbackWithSLOW(): void {
41+
$captured = null;
42+
$cb = function(string $msg) use (&$captured) { $captured = $msg; };
43+
$times = [0.0, 0.2]; // delta 0.2 > slow (0.1) but < very slow (0.5)
44+
$timeGetter = function() use (&$times) { return array_shift($times); };
45+
$sut = new Timer(slowDelta: 0.1, verySlowDelta: 0.5, deltaLogCallback: $cb, timeGetter: $timeGetter);
3346
$sut->start();
3447
$sut->stop();
35-
self::assertSame(10.0, $sut->getDelta());
48+
$sut->logDelta();
49+
self::assertNotNull($captured);
50+
self::assertStringContainsString('SLOW', $captured);
51+
self::assertStringContainsString('https://www.php.gt/webengine/slow-delta', $captured);
52+
}
3653

54+
public function testLogDelta_verySlowThreshold_callsCallbackWithVERY_SLOW(): void {
55+
$captured = null;
56+
$cb = function(string $msg) use (&$captured) { $captured = $msg; };
57+
$times = [5.0, 5.75]; // delta 0.75 > verySlow (0.5)
58+
$timeGetter = function() use (&$times) { return array_shift($times); };
59+
$sut = new Timer(slowDelta: 0.1, verySlowDelta: 0.5, deltaLogCallback: $cb, timeGetter: $timeGetter);
3760
$sut->start();
3861
$sut->stop();
39-
self::assertSame(40.0, $sut->getDelta());
62+
$sut->logDelta();
63+
self::assertNotNull($captured);
64+
self::assertStringContainsString('VERY SLOW', $captured);
4065
}
4166
}

0 commit comments

Comments
 (0)