CollisionTest.php 10.7 KB
Newer Older
<?php

namespace Tests\Collision;

use PHPUnit\Framework\TestCase;
use App\Collision\Collision;

class CollisionTest extends TestCase
{
    /**
     * @dataProvider circleRectangleData
     */
    public function testCircleRectangle(int $c_radius, int $c_x, int $c_y, int $r_w, int $r_h, int $r_x, int $r_y, bool $expected)
    {
        $result = Collision::circleRectangle($c_radius, $c_x, $c_y, $r_w, $r_h, $r_x, $r_y);

        $this->assertEquals($expected, $result);
    }

    public function circleRectangleData()
    {
        return [
            [
                1, // circle radius
                0, // circle x
                0, // circle y
                1, // rectangle width
                1, // rectangle height
                100, // rectangle x
                100, // rectangle y,
                false // expected collison
            ],
            [
                10, // circle radius
                250, // circle x
                250, // circle y
                200, // rectangle width
                200, // rectangle height
                0, // rectangle x
                0, // rectangle y,
                false // expected collison
            ],
            [
                10, // circle radius
                10, // circle x
                10, // circle y
                10, // rectangle width
                10, // rectangle height
                0, // rectangle x
                0, // rectangle y,
                true // expected collison
            ],
            [
                10, // circle radius
                200, // circle x
                50, // circle y
                200, // rectangle width
                200, // rectangle height
                0, // rectangle x
                0, // rectangle y,
                true // expected collison
            ],
        ];
    }

     /**
     * @dataProvider circleWorldData
     */
    public function testCircleWorld(int $c_radius, int $c_x, int $c_y, int $w_w, int $w_h, int $w_x, int $w_y, bool $expected)
    {
        $result = Collision::circleWorld($c_radius, $c_x, $c_y, $w_w, $w_h, $w_x, $w_y);

        $this->assertEquals($expected, $result);
    }

    public function circleWorldData()
    {
        return [
            [ // inside
                1, // circle radius
                50, // circle x
                50, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                false // expected collison
            ],
            [ // outside to left
                1, // circle radius
                -100, // circle x
                50, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                true // expected collison
            ],
            [ // clipping left
                1, // circle radius
                0, // circle x
                50, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                true // expected collison
            ],
            [ // outside to right
                1, // circle radius
                200, // circle x
                50, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                true // expected collison
            ],
            [ // clipping right
                1, // circle radius
                100, // circle x
                50, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                true // expected collison
            ],
            [ // outside to top
                1, // circle radius
                50, // circle x
                -100, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                true // expected collison
            ],
            [ // clipping top
                1, // circle radius
                50, // circle x
                0, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                true // expected collison
            ],
            [ // outside to bottom
                1, // circle radius
                50, // circle x
                200, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                true // expected collison
            ],
            [ // clipping bottom
                1, // circle radius
                50, // circle x
                100, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                true // expected collison
            ],
        ];
    }

     /**
     * @dataProvider circleOutsideRectangleData
     */
    public function testCircleOutsideRectangle(int $c_radius, int $c_x, int $c_y, int $w_w, int $w_h, int $w_x, int $w_y, bool $expected)
    {
        $result = Collision::circleOutsideRectangle($c_radius, $c_x, $c_y, $w_w, $w_h, $w_x, $w_y);

        $this->assertEquals($expected, $result);
    }

    public function circleOutsideRectangleData()
    {
        return [
            [ // inside
                1, // circle radius
                50, // circle x
                50, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                false // expected collison
            ],
            [ // outside to left
                1, // circle radius
                -100, // circle x
                50, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                true // expected collison
            ],
            [ // clipping left
                1, // circle radius
                0, // circle x
                50, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                false // expected collison
            ],
            [ // outside to right
                1, // circle radius
                200, // circle x
                50, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                true // expected collison
            ],
            [ // clipping right
                1, // circle radius
                100, // circle x
                50, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                false // expected collison
            ],
            [ // outside to top
                1, // circle radius
                50, // circle x
                -100, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                true // expected collison
            ],
            [ // clipping top
                1, // circle radius
                50, // circle x
                0, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                false // expected collison
            ],
            [ // outside to bottom
                1, // circle radius
                50, // circle x
                200, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                true // expected collison
            ],
            [ // clipping bottom
                1, // circle radius
                50, // circle x
                100, // circle y
                100, // world width
                100, // world height
                0, // world x
                0, // world y,
                false // expected collison
            ],

        ];
    }

    /**
     * @dataProvider lineCircleData
     */
    public function testLineCircle(int $x_1, int $x_2, int $y_1, int $y_2, int $c_x, int $c_y, int $c_radius, bool $expected)
    {
        $result = Collision::lineCircle($x_1, $x_2, $y_1, $y_2, $c_x, $c_y, $c_radius);

        $this->assertEquals($expected, $result);
    }

    public function lineCircleData()
    {
        return [
            [0, 0, 0, 10, 0, 0, 1, true],
            [0, 0, 0, 10, 0, 4, 1, true],
            [0, 0, 0, 10, 4, 0, 1, false],
            [0, 10, 0, 10, 0, 0, 1, true],
            [0, 10, 0, 10, 5, 5, 1, true],
            [0, 10, 0, 10, 11, 11, 1, false],
            [0, 10, 0, 10, 12, 12, 1, false],
        ];
    }

    /**
     * @dataProvider linePointData
     */
    public function testLinePoint(int $x_1, int $x_2, int $y_1, int $y_2, int $p_x, int $p_y, bool $expected)
    {
        $result = Collision::linePoint($x_1, $x_2, $y_1, $y_2, $p_x, $p_y);

        $this->assertEquals($expected, $result);
    }

    public function linePointData()
    {
        return [
            [0, 0, 0, 10, 0, 0, true],
            [0, 0, 0, 10, 0, 4, true],
            [0, 0, 0, 10, 4, 0, false],
            [0, 10, 0, 10, 0, 0, true],
            [0, 10, 0, 10, 5, 5, true],
            [0, 10, 0, 10, 11, 11, false],
        ];
    }

    /**
     * @dataProvider pointCircleData
     */
    public function testPointCirlce(int $p_x, int $p_y, int $c_x, int $c_y, int $c_radius, bool $expected)
    {
        $result = Collision::pointCircle($p_x, $p_y, $c_x, $c_y, $c_radius);

        $this->assertEquals($expected, $result);
    }

    public function pointCircleData()
    {
        return [
            [0, 0, 0, 0, 1, true],
            [0, 0, 10, 10, 1, false],
            [0, 0, 5, 5, 11, true],
            [0, 0, 4, 0, 1, false],
            [0, 10, 4, 0, 1, false],
        ];
    }

    /**
     * @dataProvider distanceData
     */
    public function testDistance(int $x_1, int $x_2, int $y_1, int $y_2, float $expected)
    {
        $distance = Collision::distance($x_1, $x_2, $y_1, $y_2);

        $this->assertEquals($expected, $distance);
    }

    public function distanceData()
    {
        return [
            [1, 1, 1, 1, 0],
            [0, 1, 0, 1, 1.41],
            [0, 2, 1, 3, 2.83],
            [0, 13, 0, 3, 13.34],
        ];
    }
}