<?php

namespace spec\Prophecy\Comparator;

use PhpSpec\ObjectBehavior;
use Prophecy\Argument;

class ClosureComparatorSpec extends ObjectBehavior
{
    function it_is_comparator()
    {
        $this->shouldHaveType('SebastianBergmann\Comparator\Comparator');
    }

    function it_accepts_only_closures()
    {
        $this->accepts(123, 321)->shouldReturn(false);
        $this->accepts('string', 'string')->shouldReturn(false);
        $this->accepts(false, true)->shouldReturn(false);
        $this->accepts(true, false)->shouldReturn(false);
        $this->accepts((object) array(), (object) array())->shouldReturn(false);
        $this->accepts(function () {}, (object) array())->shouldReturn(false);
        $this->accepts(function () {}, (object) array())->shouldReturn(false);

        $this->accepts(function () {}, function () {})->shouldReturn(true);
    }

    function it_asserts_that_different_closures_are_different()
    {
        $this->shouldThrow()->duringAssertEquals(function () {}, function () {});
    }

    function it_asserts_that_closures_are_equal_if_its_the_same_closure()
    {
        $closure = function () {};

        $this->shouldNotThrow()->duringAssertEquals($closure, $closure);
    }
}
