1
2use strict;
3use warnings;
4
5use Test::More tests => 27;
6use Test::Deep;
7
8use_ok 'Parse::BooleanLogic';
9
10my $p = new Parse::BooleanLogic;
11
12my $cb = sub { return $_[0]->{'v'} };
13
14cmp_deeply $p->filter( [{ v => 1 }], $cb ), [{v => 1}], "'1'";
15cmp_deeply $p->filter( [{ v => 0 }], $cb ), [], "'0'";
16
17cmp_deeply $p->filter( [{v => 0}, 'AND', {v => 0}], $cb ), [], "0 AND 0";
18cmp_deeply $p->filter( [{v => 0}, 'AND', {v => 2}], $cb ), [{v => 2}], "0 AND 1";
19cmp_deeply $p->filter( [{v => 1}, 'AND', {v => 0}], $cb ), [{v => 1}], "1 AND 0";
20cmp_deeply $p->filter( [{v => 1}, 'AND', {v => 2}], $cb ), [{v => 1}, 'AND', {v => 2}], "1 AND 1";
21
22cmp_deeply $p->filter( [{v => 0}, 'OR', {v => 0}], $cb ), [], "0 OR 0";
23cmp_deeply $p->filter( [{v => 0}, 'OR', {v => 2}], $cb ), [{v => 2}], "0 OR 1";
24cmp_deeply $p->filter( [{v => 1}, 'OR', {v => 0}], $cb ), [{v => 1}], "1 OR 0";
25cmp_deeply $p->filter( [{v => 1}, 'OR', {v => 2}], $cb ), [{v => 1}, 'OR', {v => 2}], "1 OR 1";
26
27cmp_deeply $p->filter( [{v => 0}, 'AND', {v => 0}, 'OR', {v => 0}], $cb ), [], "0 AND 0 OR 0";
28cmp_deeply $p->filter( [{v => 0}, 'AND', {v => 0}, 'OR', {v => 3}], $cb ), [{v => 3}], "0 AND 0 OR 1";
29cmp_deeply $p->filter( [{v => 0}, 'AND', {v => 2}, 'OR', {v => 0}], $cb ), [{v => 2}], "0 AND 1 OR 0";
30cmp_deeply $p->filter( [{v => 0}, 'AND', {v => 2}, 'OR', {v => 3}], $cb ), [{v => 2}, 'OR', {v => 3}], "0 AND 1 OR 1";
31cmp_deeply $p->filter( [{v => 1}, 'AND', {v => 0}, 'OR', {v => 0}], $cb ), [{v => 1}], "1 AND 0 OR 0";
32cmp_deeply $p->filter( [{v => 1}, 'AND', {v => 0}, 'OR', {v => 3}], $cb ), [{v => 1}, 'OR', {v => 3}], "1 AND 0 OR 1";
33cmp_deeply $p->filter( [{v => 1}, 'AND', {v => 2}, 'OR', {v => 0}], $cb ), [{v => 1}, 'AND', {v => 2}], "1 AND 1 OR 0";
34cmp_deeply $p->filter( [{v => 1}, 'AND', {v => 2}, 'OR', {v => 3}], $cb ), [{v => 1}, 'AND', {v => 2}, 'OR', {v => 3}], "1 AND 1 OR 1";
35
36cmp_deeply $p->filter( [{v => 0}, 'AND', [ {v => 0}, 'OR', {v => 0}]], $cb ), [], "0 AND (0 OR 0)";
37cmp_deeply $p->filter( [{v => 0}, 'AND', [ {v => 0}, 'OR', {v => 3}]], $cb ), [{v => 3}], "0 AND (0 OR 1)";
38cmp_deeply $p->filter( [{v => 0}, 'AND', [ {v => 2}, 'OR', {v => 0}]], $cb ), [{v => 2}], "0 AND (1 OR 0)";
39cmp_deeply $p->filter( [{v => 0}, 'AND', [ {v => 2}, 'OR', {v => 3}]], $cb ), [{v => 2}, 'OR', {v => 3}], "0 AND (1 OR 1)";
40cmp_deeply $p->filter( [{v => 1}, 'AND', [ {v => 0}, 'OR', {v => 0}]], $cb ), [{v => 1}], "1 AND (0 OR 0)";
41cmp_deeply $p->filter( [{v => 1}, 'AND', [ {v => 0}, 'OR', {v => 3}]], $cb ), [{v => 1}, 'AND', {v => 3}], "1 AND (0 OR 1)";
42cmp_deeply $p->filter( [{v => 1}, 'AND', [ {v => 2}, 'OR', {v => 0}]], $cb ), [{v => 1}, 'AND', {v => 2}], "1 AND (1 OR 0)";
43cmp_deeply $p->filter( [{v => 1}, 'AND', [ {v => 2}, 'OR', {v => 3}]], $cb ), [{v => 1}, 'AND', [ {v => 2}, 'OR', {v => 3}]], "1 AND (1 OR 1)";
44