<?php

namespace Tests\PHP8;

use ExampleClass;
use Flight;
use flight\Engine;
use flight\net\Route;
use PHPUnit\Framework\TestCase;

class FlightTest extends TestCase
{
    protected function setUp(): void
    {
        $_SERVER = [];
        $_REQUEST = [];
        Flight::init();
        Flight::setEngine(new Engine());
    }

    protected function tearDown(): void
    {
        unset($_REQUEST);
        unset($_SERVER);
        Flight::clear();
    }

    //////////////////
    // CORE METHODS //
    //////////////////
    public function test_path(): void
    {
        Flight::path(path: __DIR__);

        $exampleObject = new ExampleClass();
        self::assertInstanceOf(ExampleClass::class, $exampleObject);
    }

    public function test_stop_with_code(): void
    {
        Flight::stop(code: 500);

        self::expectOutputString('');
        self::assertSame(500, Flight::response()->status());
    }

    public function test_halt(): void
    {
        Flight::halt(500, actuallyExit: false, message: 'Test');

        self::expectOutputString('Test');
        self::assertSame(500, Flight::response()->status());
    }

    /////////////////////
    // ROUTING METHODS //
    /////////////////////
    public function test_static_route(): void
    {
        Flight::request()->url = '/test';

        $route = Flight::route(
            pass_route: true,
            alias: 'testRoute',
            callback: function () {
                echo 'test';
            },
            pattern: '/test'
        );

        self::assertInstanceOf(Route::class, $route);
        self::expectOutputString('test');
        Flight::start();
    }
}