<?php

/* testSimpleAssignment */
$a = false;

/* testFunctionCall */
$a = doSomething();

/* testFunctionCallArgument */
$a = doSomething($a, $b);

/* testControlStructure */
while(true) {}
$a = 1;

/* testClosureAssignment */
$a = function($b=false){};

/* testHeredocFunctionArg */
myFunction(<<<END
Foo
END
, 'bar');

switch ($a) {
    case 1: {break;}
    case 2: $foo = true; break;
    default: {break;}
    /* testSwitch */
}

/* testStatementAsArrayValue */
$a = [new Datetime];
$a = array(new Datetime);
$a = ['a' => $foo + $bar, 'b' => true];

/* testUseGroup */
use Vendor\Package\{ClassA as A, ClassB, ClassC as C};

$a = [
    /* testArrowFunctionArrayValue */
    'a' => fn() => 1,
    'b' => fn() => 1,
];

/* testStaticArrowFunction */
static fn ($a) => $a;

/* testArrowFunctionReturnValue */
fn(): array => [a($a, $b)];

/* testArrowFunctionAsArgument */
$foo = foo(
    fn() => bar()
);

/* testArrowFunctionWithArrayAsArgument */
$foo = foo(
    fn() => [$row[0], $row[3]]
);

$match = match ($a) {
    /* testMatchCase */
    1 => 'foo',
    /* testMatchDefault */
    default => 'bar'
};

$match = match ($a) {
    /* testMatchMultipleCase */
    1, 2, => $a * $b,
    /* testMatchDefaultComma */
    default, => 'something'
};

match ($pressedKey) {
    /* testMatchFunctionCall */
    Key::RETURN_ => save($value, $user)
};

$result = match (true) {
    /* testMatchFunctionCallArm */
    str_contains($text, 'Welcome') || str_contains($text, 'Hello') => 'en',
    str_contains($text, 'Bienvenue') || str_contains($text, 'Bonjour') => 'fr',
    default => 'pl'
};

/* testMatchClosure */
$result = match ($key) {
    1 => function($a, $b) {},
    2 => function($b, $c) {},
};

/* testMatchArray */
$result = match ($key) {
    1 => [1,2,3],
    2 => [1 => one($a, $b), 2 => two($b, $c)],
    3 => [],
};

/* testNestedMatch */
$result = match ($key) {
    1 => match ($key) {
        1 => 'one',
        2 => 'two',
    },
    2 => match ($key) {
        1 => 'two',
        2 => 'one',
    },
};

return 0;

/* testOpenTag */
?>
<h1>Test</h1>
<?php echo '<h2>', foo(), '</h2>';

/* testOpenTagWithEcho */
?>
<h1>Test</h1>
<?= '<h2>', foo(), '</h2>';

$value = [
    /* testPrecededByArrowFunctionInArray - Expected */
    Url::make('View Song', fn($song) => $song->url())
        /* testPrecededByArrowFunctionInArray */
        ->onlyOnDetail(),

    new Panel('Information', [
        Text::make('Title')
    ]),
];

switch ($foo) {
    /* testCaseStatement */
    case 1:
        /* testInsideCaseStatement */
        $var = doSomething();
        /* testInsideCaseBreakStatement */
        break 1;

    case 2:
        /* testInsideCaseContinueStatement */
        continue 1;

    case 3:
        /* testInsideCaseReturnStatement */
        return false;

    case 4:
        /* testInsideCaseExitStatement */
        exit(1);

    case 5:
        /* testInsideCaseThrowStatement */
        throw new Exception();

    /* testDefaultStatement */
    default:
        /* testInsideDefaultContinueStatement */
        continue $var;
}

match ($var) {
    true =>
        /* test437ClosureDeclaration */
        function ($var) {
            /* test437EchoNestedWithinClosureWithinMatch */
            echo $var, 'text', PHP_EOL;
        },
    default => false
};

match ($var) {
    /* test437NestedLongArrayWithinMatch */
    'a' => array( 1, 2.5, $var),
    /* test437NestedFunctionCallWithinMatch */
    'b' => functionCall( 11, $var, 50.50),
    /* test437NestedArrowFunctionWithinMatch */
    'c' => fn($p1, /* test437FnSecondParamWithinMatch */ $p2) => $p1 + $p2,
    default => false
};

callMe($paramA, match ($var) {
    /* test437NestedLongArrayWithinNestedMatch */
    'a' => array( 1, 2.5, $var),
    /* test437NestedFunctionCallWithinNestedMatch */
    'b' => functionCall( 11, $var, 50.50),
    /* test437NestedArrowFunctionWithinNestedMatch */
    'c' => fn($p1, /* test437FnSecondParamWithinNestedMatch */ $p2) => $p1 + $p2,
    default => false
});

match ($var) {
    /* test437NestedShortArrayWithinMatch */
    'a' => [ 1, 2.5, $var],
    default => false
};
