Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
31 / 31
n/a
0 / 0
CRAP
n/a
0 / 0
1<?php
2
3// ╔════════════════════════════════════════════════════════════╗
4// ║ MIT Licence (#Expat) - https://opensource.org/licenses/MIT ║
5// ║ Copyright 2026 Frederic Poeydomenge <dyno@phexium.com>     ║
6// ╚════════════════════════════════════════════════════════════╝
7
8declare(strict_types=1);
9
10pest()->group('unit');
11
12use Phexium\Domain\Id\TimestampId;
13use Phexium\Domain\Specification\BinaryAndSpecification;
14use Phexium\Domain\Specification\BinaryOrSpecification;
15use Phexium\Domain\Specification\UnaryNotSpecification;
16use Tests\Phexium\Fake\Domain\Specification\IdSpecification as FakeIdSpecification;
17use Tests\Phexium\Fake\Domain\Specification\NameSpecification as FakeNameSpecification;
18
19describe('Composition', function (): void {
20    it('combines AND, OR and NOT operators', function (): void {
21        $nameIsFoo = new FakeNameSpecification('Foo');
22        $idIs123 = new FakeIdSpecification(new TimestampId(123));
23        $nameIsBar = new FakeNameSpecification('Bar');
24
25        $fooAnd123 = new BinaryAndSpecification($nameIsFoo, $idIs123);
26        $notBar = new UnaryNotSpecification($nameIsBar);
27        $complexSpec = new BinaryOrSpecification($fooAnd123, $notBar);
28
29        $result = $complexSpec->toSql();
30
31        expect($result)->toBeArray();
32        expect($result)->toHaveKey('sql');
33        expect($result)->toHaveKey('params');
34        expect($result['sql'])->toBe('((name = :name_0_0) AND (id = :id_1_0)) OR (NOT (name = :name_1))');
35        expect($result['params'])->toBe(['name_0_0' => 'Foo', 'id_1_0' => 123, 'name_1' => 'Bar']);
36
37        $filter = $complexSpec->toInMemoryFilter();
38        expect($filter)->toBeCallable();
39
40        $rowFoo123 = ['id' => 123, 'name' => 'Foo'];
41        expect($filter($rowFoo123))->toBeTrue();
42
43        $rowFoo456 = ['id' => 456, 'name' => 'Foo'];
44        expect($filter($rowFoo456))->toBeTrue();
45
46        $rowBar123 = ['id' => 123, 'name' => 'Bar'];
47        expect($filter($rowBar123))->toBeFalse();
48
49        $rowBar456 = ['id' => 456, 'name' => 'Bar'];
50        expect($filter($rowBar456))->toBeFalse();
51
52        $rowBaz123 = ['id' => 123, 'name' => 'Baz'];
53        expect($filter($rowBaz123))->toBeTrue();
54
55        $rowBaz456 = ['id' => 456, 'name' => 'Baz'];
56        expect($filter($rowBaz456))->toBeTrue();
57    });
58});