The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 15;
use Data::Dump qw( dump );

use_ok('Search::Query');
use_ok('Search::Query::Clause');

ok( my $parser = Search::Query->parser(
        dialect       => 'SWISH',
        fields        => [qw( a color )],
        default_field => 'a',
    ),
    "new parser"
);

ok( my $clause = Search::Query::Clause->new(
        field => 'color',
        op    => '=',
        value => 'green',
    ),
    "create clause"
);
ok( my $query = $parser->parse("color=red"), "parse query" );
ok( $query->add_or_clause($clause), "add_or_clause" );
is( "$query", qq/(color=red) OR (color=green)/, "stringify" );
ok( $query->add_sub_clause( $parser->parse("color=(blue OR yellow)") ),
    "add sub_clause" );
is( "$query",
    qq/((color=red) OR (color=green)) AND ((color=blue OR color=yellow))/,
    "sub_clause stringify"
);

# roundtrip
ok( $parser->parse("$query"), "round-trip '$query'" );
diag( $parser->error ) if $parser->error;
$parser->clear_error;

ok( $query = $parser->parse("(foo or bar) or (green and red)"),
    "parse compound clauses" );
ok( $query->add_and_clause(
        Search::Query::Clause->new(
            field => 'color',
            op    => '=',
            value => 'brown',
        )
    ),
    "add and_clause"
);
ok( $query->add_not_clause(
        Search::Query::Clause->new(
            field => 'color',
            op    => ':',
            value => 'purple',
        )
    ),
    "add not_clause"
);
is( "$query",
    qq/(((a=foo OR a=bar) OR (a=green AND a=red)) AND (color=brown)) NOT (color=purple)/,
    "stringify compound query"
);

# roundtrip
ok( $parser->parse("$query"), "round-trip '$query'" );
diag( $parser->error ) if $parser->error;
$parser->clear_error;