<?php 
 
declare(strict_types=1); 
 
use ComplexHeart\Domain\Criteria\Filter; 
use ComplexHeart\Domain\Criteria\FilterGroup; 
use ComplexHeart\Domain\Criteria\Operator; 
 
test('FilterGroup should be created from primitive array of values.', function () { 
    expect(FilterGroup::fromArray([['field', '=', 'value']])) 
        ->toHaveCount(1); 
}); 
 
test('FilterGroup should be created without duplicated filters.', function () { 
    $filters = [ 
        ['field', '=', 'value'], 
        ['field', '=', 'value'], 
    ]; 
 
    $g = FilterGroup::fromArray($filters) 
        ->addFilter(Filter::create('field', Operator::EQUAL, 'value')) 
        ->addFilter(Filter::create('name', Operator::EQUAL, 'Vega')); 
 
    expect($g) 
        ->toHaveCount(2); 
}); 
 
test('FilterGroup should add new filter with fluent interface.', function () { 
    $filters = FilterGroup::create() 
        ->addFilterEqual('name', 'Vincent') 
        ->addFilterNotEqual('surname', 'Winnfield') 
        ->addFilterGreaterThan('money', 10000) 
        ->addFilterGreaterOrEqualThan('age', 35) 
        ->addFilterLessThan('cars', 2) 
        ->addFilterLessOrEqualThan('houses', 2) 
        ->addFilterLike('bio', 'pork lover') 
        ->addFilterNotLike('bio', 'dog lover') 
        ->addFilterContains('name', 'nce') 
        ->addFilterNotContains('name', 'les') 
        ->addFilterIn('boss', ['Marcellus', 'Mia']) 
        ->addFilterNotIn('hates', ['Ringo', 'Yolanda']); 
 
    expect($filters)->toHaveCount(12); 
}); 
 
 |