.dev/tests/unit/class_core_events_test.Test.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

require_once __DIR__ . '/yf_unit_tests_setup.php';

class class_core_events_test extends yf\tests\wrapper
{
    public function test_basic()
    {
        $out = null;
        $this->assertFalse(events()->has_listeners('testme'));
        events()->listen('testme', function ($in) use (&$out) {
            $out = $in;
        });
        $this->assertTrue(events()->has_listeners('testme'));
        $this->assertNull($out);
        events()->fire('testme', ['Hello']);
        $this->assertEquals('Hello', $out);
        events()->fire('testme', [null]);
        $this->assertNull($out);
        $this->assertTrue(events()->has_listeners('testme'));

        events()->forget('testme');
        $this->assertFalse(events()->has_listeners('testme'));
    }
    public function test_nested()
    {
        $out = null;
        $this->assertFalse(events()->has_listeners('testme'));
        $this->assertFalse(events()->has_listeners('testme_nested1'));
        events()->listen('testme', function ($in) {
            events()->fire('testme_nested1', [$in]);
        });
        events()->fire('testme', ['Hello']);
        $this->assertNull($out);
        events()->listen('testme_nested1', function ($in2) use (&$out) {
            $out = $in2;
        });
        events()->fire('testme', ['Hello']);
        $this->assertEquals('Hello', $out);

        events()->forget('testme');
        $this->assertFalse(events()->has_listeners('testme'));
        events()->forget('testme_nested1');
        $this->assertFalse(events()->has_listeners('testme_nested1'));
    }
    public function test_nested2()
    {
        $out = null;
        $this->assertFalse(events()->has_listeners('testme'));
        $this->assertFalse(events()->has_listeners('testme_nested1'));
        events()->listen('testme', function ($in) use (&$out) {
            events()->listen('testme_nested1', function ($in2) use (&$out) {
                $out = $in2;
            });
            events()->fire('testme_nested1', [$in]);
        });
        events()->fire('testme', ['Hello']);
        $this->assertEquals('Hello', $out);

        events()->forget('testme');
        $this->assertFalse(events()->has_listeners('testme'));
        events()->forget('testme_nested1');
        $this->assertFalse(events()->has_listeners('testme_nested1'));
    }
    public function test_nested3()
    {
        $out = null;
        $this->assertFalse(events()->has_listeners('testme'));
        $this->assertFalse(events()->has_listeners('testme_nested1'));
        $this->assertFalse(events()->has_listeners('testme_nested2'));
        events()->listen('testme', function ($in) use (&$out) {
            events()->listen('testme_nested1', function ($in2) use (&$out) {
                events()->listen('testme_nested2', function ($in3) use (&$out) {
                    $out = $in3;
                });
                events()->fire('testme_nested2', [$in2]);
                events()->forget('testme_nested2');
            });
            events()->fire('testme_nested1', [$in]);
            events()->forget('testme_nested1');
        });
        events()->fire('testme', ['Hello']);
        events()->forget('testme');
        $this->assertEquals('Hello', $out);

        $this->assertFalse(events()->has_listeners('testme'));
        $this->assertFalse(events()->has_listeners('testme_nested1'));
        $this->assertFalse(events()->has_listeners('testme_nested2'));
    }
    public function test_responses()
    {
        events()->listen('testme', function () {
            return '111';
        });
        events()->listen('testme', function () {
            return '222';
        });
        events()->listen('testme', function () {
            return '333';
        });
        $result = events()->fire('testme', ['Hello']);
        events()->forget('testme');
        $this->assertEquals(['111', '222', '333'], $result);
    }
    public function test_responses2()
    {
        events()->listen('testme', function ($in) {
            return '1_' . $in . '_1';
        });
        events()->listen('testme', function ($in) {
            return '2_' . $in . '_2';
        });
        events()->listen('testme', function ($in) {
            return '3_' . $in . '_3';
        });
        $result = events()->fire('testme', ['Hello']);
        events()->forget('testme');
        $this->assertEquals(['1_Hello_1', '2_Hello_2', '3_Hello_3'], $result);
    }
    public function test_wildcard()
    {
        events()->listen('testme.1', function () {
            return '111';
        });
        events()->listen('testme.*', function () {
            return '222';
        });
        events()->listen('testme.3', function () {
            return '333';
        });
        $result = events()->fire('testme.1', ['Hello']);
        events()->forget('testme');
        $this->assertEquals(['111', '222'], $result);
    }
    public function test_until()
    {
        events()->listen('testme', function ($in) {
        });
        events()->listen('testme', function ($in) {
        });
        events()->listen('testme', function ($in) {
            return null;
        });
        events()->listen('testme', function ($in) {
            return '3_' . $in . '_3';
        });
        events()->listen('testme', function ($in) {
            return '4_' . $in . '_4';
        }); // This should not be called
        $result = events()->until('testme', ['Hello']);
        events()->forget('testme');
        $this->assertEquals('3_Hello_3', $result);
    }
    public function test_firing()
    {
        events()->listen('testmefiring.*', function ($in) {
            if (events()->firing() == 'testmefiring.3') {
                return '3_' . $in . '_3';
            }
        });
        $result = events()->fire('testmefiring.1', ['Hello']);
        $this->assertEquals([null], $result);
        $result = events()->fire('testmefiring.2', ['Hello']);
        $this->assertEquals([null], $result);
        $result = events()->fire('testmefiring.3', ['Hello']);
        $this->assertEquals(['3_Hello_3'], $result);
        events()->forget('testmefiring');
    }
}