The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -T
use 5.008;
use strict;
use warnings FATAL => 'all';
use Test::More;
use Catalyst::TraitFor::Controller::jQuery::jqGrid::Search;
use Data::Dumper;


my @tests = (
  {
    name=>'empty and',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"AND","rules":[],"groups":[]}',
    },
    result=>{},
  },
  {
    name=>'empty or',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"OR","rules":[],"groups":[]}',
    },
    result=>{},
  },
  {
    name=>'empty and in empty and',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[]}]}',
    },
    result=>{'-and'=>[{}]},
  },
  {
    name=>'empty or in empty or',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"OR","rules":[],"groups":[{"groupOp":"OR","rules":[],"groups":[]}]}',
    },
    result=>{'-or'=>[{}]},
  },
  {
    name=>'empty and in empty and in empty and',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[]}]}]}',
    },
    result=>{'-and'=>[{'-and'=>[{}]}]},
  },
  {
    name=>'empty and in empty or in empty and',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"AND","rules":[],"groups":[{"groupOp":"OR","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[]}]}]}',
    },
    result=>{'-and'=>[{'-or'=>[{}]}]},
  },
  {
    name=>'empty or in empty and in empty or',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"OR","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[{"groupOp":"OR","rules":[],"groups":[]}]}]}',
    },
    result=>{'-or'=>[{'-and'=>[{}]}]},
  },
  {
    name=>'basic all x = y',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"AND","rules":[{"field":"x","op":"cn","data":"y"}],"groups":[]}',
    },
    result=>{'-and'=>[{'x'=>{'-like'=>'%y%'}}]},
  },
  {
    name=>'basic any x = y',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"OR","rules":[{"field":"x","op":"cn","data":"y"}],"groups":[]}',
    },
    result=>{'-or'=>[{'x'=>{'-like'=>'%y%'}}]},
  },
  {
    name=>'all a = 1, b = 2',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"AND","rules":[{"field":"a","op":"eq","data":"1"},{"field":"b","op":"eq","data":"2"}],"groups":[]}',
    },
    result=>{'-and'=>[{'a'=>{'='=>'1'}},{'b'=>{'='=>'2'}}]},
  },
  {
    name=>'any a = 1, b = 2',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"OR","rules":[{"field":"a","op":"eq","data":"1"},{"field":"b","op":"eq","data":"2"}],"groups":[]}',
    },
    result=>{'-or'=>[{'a'=>{'='=>'1'}},{'b'=>{'='=>'2'}}]},
  },
  {
    name=>'all a = 1, b = 2, c = 3',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"AND","rules":[{"field":"a","op":"eq","data":"1"},{"field":"b","op":"eq","data":"2"},{"field":"c","op":"eq","data":"3"}],"groups":[]}',
    },
    result=>{'-and'=>[{'a'=>{'='=>'1'}},{'b'=>{'='=>'2'}},{'c'=>{'='=>'3'}}]},
  },
  {
    name=>'any a = 1, b = 2, c = 3',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"OR","rules":[{"field":"a","op":"eq","data":"1"},{"field":"b","op":"eq","data":"2"},{"field":"c","op":"eq","data":"3"}],"groups":[]}',
    },
    result=>{'-or'=>[{'a'=>{'='=>'1'}},{'b'=>{'='=>'2'}},{'c'=>{'='=>'3'}}]},
  },
  {
    name=>'((a = "1" OR b = "2") AND c = "3")',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"AND","rules":[{"field":"c","op":"eq","data":"3"}],"groups":[{"groupOp":"OR","rules":[{"field":"a","op":"eq","data":"1"},{"field":"b","op":"eq","data":"2"}],"groups":[]}]}',
    },
    result=>{'-and'=>[{'-or'=>[{'a'=>{'='=>'1'}},{'b'=>{'='=>'2'}}]},[{'c'=>{'='=>'3'}}]]},
  },
  {
    name=>'((a = "1" AND b = "2") OR c = "3")',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"OR","rules":[{"field":"c","op":"eq","data":"3"}],"groups":[{"groupOp":"AND","rules":[{"field":"a","op":"eq","data":"1"},{"field":"b","op":"eq","data":"2"}],"groups":[]}]}',
    },
    result=>{'-or'=>[{'-and'=>[{'a'=>{'='=>'1'}},{'b'=>{'='=>'2'}}]},[{'c'=>{'='=>'3'}}]]},
  },
  {
    name=>'((a = "1" OR b = "2") AND c = "3" AND d = "4")',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"AND","rules":[{"field":"c","op":"eq","data":"3"},{"field":"d","op":"eq","data":"4"}],"groups":[{"groupOp":"OR","rules":[{"field":"a","op":"eq","data":"1"},{"field":"b","op":"eq","data":"2"}],"groups":[]}]}',
    },
    result=>{'-and'=>[{'-or'=>[{'a'=>{'='=>'1'}},{'b'=>{'='=>'2'}}]},[{'c'=>{'='=>'3'}},{'d'=>{'='=>'4'}}]]},
  },
  {
    name=>'((a = "1" OR b = "2") AND (c = "3" OR d = "4"))',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"AND","rules":[],"groups":[{"groupOp":"OR","rules":[{"field":"a","op":"eq","data":"1"},{"field":"b","op":"eq","data":"2"}],"groups":[]},{"groupOp":"OR","rules":[{"field":"c","op":"eq","data":"3"},{"field":"d","op":"eq","data":"4"}],"groups":[]}]}',
    },
    result=>{'-and'=>[{'-or'=>[{'a'=>{'='=>'1'}},{'b'=>{'='=>'2'}}]},{'-or'=>[{'c'=>{'='=>'3'}},{'d'=>{'='=>'4'}}]}]},
  },
  {
    name=>'and cascade: (((((((((((a = "1")))))))))))',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[{"field":"a","op":"eq","data":"1"}],"groups":[]}]}]}]}]}]}]}]}]}]}]}',
    },
    result=>{'-and'=>[{'-and'=>[{'-and'=>[{'-and'=>[{'-and'=>[{'-and'=>[{'-and'=>[{'-and'=>[{'-and'=>[{'-and'=>[{'-and'=>[{'a'=>{'='=>'1'}}]}]}]}]}]}]}]}]}]}]}]},
  },
  {
    name=>'(((a = "1" OR b = "2") AND c = "3") OR ((d = "4" OR e = "5") AND f = "6"))',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"OR","rules":[],"groups":[{"groupOp":"AND","rules":[{"field":"c","op":"eq","data":"3"}],"groups":[{"groupOp":"OR","rules":[{"field":"a","op":"eq","data":"1"},{"field":"b","op":"eq","data":"2"}],"groups":[]}]},{"groupOp":"AND","rules":[{"field":"f","op":"eq","data":"6"}],"groups":[{"groupOp":"OR","rules":[{"field":"d","op":"eq","data":"4"},{"field":"e","op":"eq","data":"5"}],"groups":[]}]}]}',
    },
    result=>{'-or'=>[{'-and'=>[{'-or'=>[{'a'=>{'='=>'1'}},{'b'=>{'='=>'2'}}]},[{'c'=>{'='=>'3'}}]]},{'-and'=>[{'-or'=>[{'d'=>{'='=>'4'}},{'e'=>{'='=>'5'}}]},[{'f'=>{'='=>'6'}}]]}]},
  },
  {
    name=>'(((a = "1" OR b = "2") AND c = "3" AND d = "4") OR ((e = "5") AND f = "6") OR g = "7")',
    search=>{ '_search'=>'true',
      'filters'=>'{"groupOp":"OR","rules":[{"field":"g","op":"eq","data":"7"}],"groups":[{"groupOp":"AND","rules":[{"field":"c","op":"eq","data":"3"},{"field":"d","op":"eq","data":"4"}],"groups":[{"groupOp":"OR","rules":[{"field":"a","op":"eq","data":"1"},{"field":"b","op":"eq","data":"2"}],"groups":[]}]},{"groupOp":"AND","rules":[{"field":"f","op":"eq","data":"6"}],"groups":[{"groupOp":"AND","rules":[{"field":"e","op":"eq","data":"5"}],"groups":[]}]}]}',
    },
    result=>{'-or'=>[{'-and'=>[{'-or'=>[{'a'=>{'='=>'1'}},{'b'=>{'='=>'2'}}]},[{'c'=>{'='=>'3'}},{'d'=>{'='=>'4'}}]]},{'-and'=>[{'-and'=>[{'e'=>{'='=>'5'}}]},[{'f'=>{'='=>'6'}}]]},[{'g'=>{'='=>'7'}}]]},
  },
#  {
#    name=>'
#
#',
#    search=>{ '_search'=>'true',
#      'filters'=>'
#
#',
#    },
#    result=>{
#
#},
#  },
);

plan tests => @tests + 1;

can_ok( 'Catalyst::TraitFor::Controller::jQuery::jqGrid::Search', 'jqGrid_search');

for my $t (@tests) {
  is_deeply(Catalyst::TraitFor::Controller::jQuery::jqGrid::Search->jqGrid_search($t->{search}), $t->{result}, $t->{name});
}