#!/usr/bin/perl -T

use lib '.'; use lib 't';
use SATest; sa_t_init("if_can");
use Test::More tests => 17;

# ---------------------------------------------------------------------------

%patterns = (

        q{ GTUBE }, 'gtube',
        q{ SHOULD_BE_CALLED01 }, 'should_be_called01',
        q{ SHOULD_BE_CALLED02 }, 'should_be_called02',
        q{ SHOULD_BE_CALLED03 }, 'should_be_called03',
        q{ SHOULD_BE_CALLED04 }, 'should_be_called04',
        q{ SHOULD_BE_CALLED05 }, 'should_be_called05',
        q{ SHOULD_BE_CALLED06 }, 'should_be_called06',
        q{ SHOULD_BE_CALLED07 }, 'should_be_called07',
        q{ SHOULD_BE_CALLED08 }, 'should_be_called08',
        q{ SHOULD_BE_CALLED09 }, 'should_be_called09',
        q{ SHOULD_BE_CALLED10 }, 'should_be_called10',
        q{ SHOULD_BE_CALLED11 }, 'should_be_called11',

);
%anti_patterns = (

        q{ SHOULD_NOT_BE_CALLED01 }, 'should_not_be_called01',
        q{ SHOULD_NOT_BE_CALLED02 }, 'should_not_be_called02',
        q{ SHOULD_NOT_BE_CALLED03 }, 'should_not_be_called03',
        q{ SHOULD_NOT_BE_CALLED04 }, 'should_not_be_called04',

);
tstlocalrules (q{

        loadplugin Mail::SpamAssassin::Plugin::Test

        if (has(Mail::SpamAssassin::Plugin::Test::check_test_plugin))
          body SHOULD_BE_CALLED01 /./
        endif
        if (has(Mail::SpamAssassin::Plugin::Test::test_feature_xxxx_true))
          body SHOULD_BE_CALLED02 /./
        endif
        if (has(Mail::SpamAssassin::Plugin::Test::test_feature_xxxx_false))
          body SHOULD_BE_CALLED03 /./
        endif
        if (can(Mail::SpamAssassin::Plugin::Test::test_feature_xxxx_true))
          body SHOULD_BE_CALLED04 /./
        endif
        if (!can(Mail::SpamAssassin::Plugin::Test::test_feature_xxxx_false))
          body SHOULD_BE_CALLED05 /./
        endif
        if (!has(Mail::SpamAssassin::Plugin::Test::test_feature_xxxx_nosuch))
          body SHOULD_BE_CALLED06 /./
        endif
        if (!can(Mail::SpamAssassin::Plugin::Test::test_feature_xxxx_nosuch))
          body SHOULD_BE_CALLED07 /./
        endif
        if can(Mail::SpamAssassin::Plugin::Test::test_feature_xxxx_true) && version > 0.00000
          body SHOULD_BE_CALLED08 /./
        endif
        if !can(Mail::SpamAssassin::Plugin::Test::test_feature_xxxx_false  ) && !(! version > 0.00000)
          body SHOULD_BE_CALLED09 /./
        endif
        if has(Mail::SpamAssassin::Plugin::Test::test_feature_xxxx_true) && (!can(Mail::SpamAssassin::Plugin::Test::test_feature_xxxx_nosuch))
          body SHOULD_BE_CALLED10 /./
        endif

        if !has(Mail::SpamAssassin::Plugin::Test::check_test_plugin)
          body SHOULD_NOT_BE_CALLED01 /./
        endif
        if (has(Mail::SpamAssassin::Plugin::Test::non_existent_method))
          body SHOULD_NOT_BE_CALLED02 /./
        endif
        if (can(Mail::SpamAssassin::Plugin::Test::non_existent_method))
          body SHOULD_NOT_BE_CALLED03 /./
        endif
        if can(Mail::SpamAssassin::Plugin::Test::test_feature_xxxx_true)
        if (can(Mail::SpamAssassin::Plugin::Test::test_feature_xxxx_false))
          body SHOULD_NOT_BE_CALLED04 /./
        else
          body SHOULD_BE_CALLED11 /./
        endif
        endif

});

ok (sarun ("-L -t < data/spam/gtube.eml", \&patterns_run_cb));
ok_all_patterns();

