()
| 5225 | // Run: php examples/demo.php |
| 5226 | |
| 5227 | function runDemoAssertions(): void |
| 5228 | { |
| 5229 | // ── Body Return Type Inference ────────────────────────────────────── |
| 5230 | $factory = new ScaffoldingUntypedFactory(); |
| 5231 | $pen = $factory->createPen(); |
| 5232 | assert($pen instanceof Pen, 'createPen() must return Pen (inferred from body)'); |
| 5233 | $tool = $factory->createTool(true); |
| 5234 | assert($tool instanceof Pen || $tool instanceof Pencil, 'createTool() must return Pen|Pencil'); |
| 5235 | |
| 5236 | // ── Return Type: static ───────────────────────────────────────────── |
| 5237 | $pen = Pen::make(); |
| 5238 | assert($pen instanceof Pen, 'Pen::make() must return Pen'); |
| 5239 | |
| 5240 | $marker = Marker::make(); |
| 5241 | assert($marker instanceof Marker, 'Marker::make() must return Marker (not Pen)'); |
| 5242 | |
| 5243 | $fluent = $marker->rename('Bold'); |
| 5244 | assert($fluent instanceof Marker, 'Marker::rename() returns static, must stay Marker'); |
| 5245 | |
| 5246 | // ── Return Type: function ─────────────────────────────────────────── |
| 5247 | $created = makePen(); |
| 5248 | assert($created instanceof Pen, 'makePen() must return Pen'); |
| 5249 | |
| 5250 | $union = pickPenOrPencil(); |
| 5251 | assert($union instanceof Pen || $union instanceof Pencil, 'pickPenOrPencil() must return Pen|Pencil'); |
| 5252 | |
| 5253 | $rock = pickRockOrBanana(); |
| 5254 | assert($rock instanceof Rock || $rock instanceof Banana, 'pickRockOrBanana() must return Rock|Banana'); |
| 5255 | |
| 5256 | $user = createUser('Alice', 'alice@example.com'); |
| 5257 | assert($user instanceof User, 'createUser() must return User'); |
| 5258 | |
| 5259 | // ── Chaining ──────────────────────────────────────────────────────── |
| 5260 | $brush = new Brush(); |
| 5261 | $sized = $brush->setSize('large'); |
| 5262 | assert($sized instanceof Brush, 'Brush::setSize() returns static, must stay Brush'); |
| 5263 | $styled = $sized->setStyle('pointed'); |
| 5264 | assert($styled instanceof Brush, 'Brush::setStyle() returns static, must stay Brush'); |
| 5265 | |
| 5266 | $canvas = $brush->getCanvas(); |
| 5267 | assert($canvas instanceof Canvas, 'Brush::getCanvas() must return Canvas'); |
| 5268 | |
| 5269 | $backToBrush = $canvas->getBrush(); |
| 5270 | assert($backToBrush instanceof Brush, 'Canvas::getBrush() must return Brush'); |
| 5271 | |
| 5272 | $easel = $canvas->easel; |
| 5273 | assert($easel instanceof Easel, 'Canvas::$easel must be Easel'); |
| 5274 | |
| 5275 | // ── Fluent Model chains (static return) ───────────────────────────── |
| 5276 | $userObj = new User('Bob', 'bob@example.com'); |
| 5277 | $renamed = $userObj->setName('Robert'); |
| 5278 | assert($renamed instanceof User, 'User::setName() returns static, must stay User'); |
| 5279 | |
| 5280 | $timestamped = $userObj->setCreatedAt('2024-01-01'); |
| 5281 | assert($timestamped instanceof User, 'HasTimestamps::setCreatedAt() returns static, must stay User'); |
| 5282 | |
| 5283 | // ── User method return types ──────────────────────────────────────── |
| 5284 | $profile = $userObj->getProfile(); |
no test coverage detected