The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

# Test the strict mode of RSS 0.9 and RSS 0.91

use strict;
use warnings;

use Test::More tests => 12;

use XML::RSS;

sub item_throws_like
{
    local $Test::Builder::Level = $Test::Builder::Level + 1;
    my ($rss, $params, $regex, $msg) = @_;
    eval {
        $rss->add_item(@$params);
    };

    like ($@, $regex, $msg);
}

{
    my $rss = XML::RSS->new(version => "0.9");

    $rss->strict(1);

    $rss->channel(
        title => "freshmeat.net",
        link  => "http://freshmeat.net",
        description => "the one-stop-shop for all your Linux software needs",
        );

    # TEST
    item_throws_like($rss, [link => "http://foobar.tld/from/"],
        qr{\Atitle and link elements are required},
        "strict - checking for exception on non-specified title"
    );

    # TEST
    item_throws_like($rss, [title => "From Foobar"],
        qr{\Atitle and link elements are required},
        "strict - checking for exception on non-specified link"
    );

    # TEST
    item_throws_like($rss, [link => "http://foobar.tld/",
        title => ("Very long title indeed" x 50)],
        qr{\Atitle cannot exceed},
        "strict - checking for long title"
    );

    # TEST
    item_throws_like($rss, [
        link => "http://" . ("foobarminimoni" x 200) . ".tld/",
        title => "Short Title"
        ],
        qr{\Alink cannot exceed},
        "strict - checking for long link"
    );

    # TEST
    item_throws_like($rss, [
        link => "http://foobar.tld/from/",
        title => "Short Title",
        description => ("This description is way too long!" x 100),
        ],
        qr{\Adescription cannot exceed},
        "strict - checking for a long description"
    );
}

{
    my $rss = XML::RSS->new(version => "0.9");

    $rss->strict(1);

    $rss->channel(
        title => "freshmeat.net",
        link  => "http://freshmeat.net",
        description => "the one-stop-shop for all your Linux software needs",
        );

    foreach my $i (1 .. 15)
    {
        $rss->add_item(
            link => "http://foobar.tld/item-$i",
            title => "Item $i",
        );
    }

    # TEST
    item_throws_like($rss, [
        link => "http://foobar.tld/from/",
        title => "Short Title",
        description => "Good description",
        ],
        qr{\Atotal items cannot exceed},
        "strict - checking for too many items"
    );
}

{
    my $rss = XML::RSS->new(version => "0.9");

    $rss->strict(1);

    $rss->channel(
        title => "freshmeat.net",
        link  => "http://freshmeat.net",
        description => "the one-stop-shop for all your Linux software needs",
        stupid_key => ("I think therefore I am." x 1000),
        );

    # TEST
    ok (1, "Can add unknown keys of unlimited size without restriction");

}

{
    my $rss = XML::RSS->new(version => "0.9");

    $rss->strict(1);

    eval {
        $rss->channel(
            title => "freshmeat.net",
            link  => "http://freshmeat.net",
            description => ("I think therefore I am." x 1000),
        );
    };

    # TEST
    like ($@, qr{\Adescription cannot exceed 500 characters in length},
        "Testing for exception thrown on a very long key"
    );
}

{
    my $rss = XML::RSS->new(version => "0.9");

    $rss->strict(1);

    eval {
        $rss->skipHours(
            hour => 5,
        );
    };

    # TEST
    like ($@, qr{\AUnregistered entity: Can't access skipHours field in object of class},
        "Testing for exception thrown on an unknown field"
    );
}

{
    my $rss = XML::RSS->new(version => "0.9");

    $rss->channel(
        title => "freshmeat.net",
        link  => "http://freshmeat.net",
        description => "the one-stop-shop for all your Linux software needs",
        );

    # TEST
    is ($rss->channel()->{title},
        "freshmeat.net",
        "Testing for an AUTOLOAD accessor with 0 arguments"
    );

    # TEST
    is ($rss->channel('title'),
        "freshmeat.net",
        "Testing for an AUTOLOAD accessor with 1 argument"
    );
}

{
    my $rss = XML::RSS->new(version => "0.91");

    $rss->strict(1);

    eval {
        $rss->skipDays(
            day => "FoolambdaCroakThemOfMonetaryJudgement"
        );
    };

    # TEST
    like ($@, qr{\Aday cannot exceed 10 characters in length},
        "Testing for exception thrown on a key for 0.91"
    );
}