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

use strict;
use warnings;
use boolean qw(true);

use File::Spec;
use FindBin qw($Bin);
use LUGS::Events::Parser;
use Test::More tests => 8;

my $join = sub { local $_ = shift; chomp; s/\n/ /g; $_ };

my $events_file = File::Spec->catfile($Bin, 'data', 'termine.txt');
my $parser = LUGS::Events::Parser->new($events_file, {
    filter_html  => true,
    tag_handlers => {
        'a href' => [ {
            rewrite => '$TEXT - $HREF',
            fields  => [ qw(location responsible) ],
        }, {
            rewrite => '$TEXT - $HREF',
            fields  => [ qw(more) ],
        } ],
        'font color' => [ {
             rewrite => '$TEXT',
             fields  => [ '*' ],
        } ],
        'b' => [ {
            rewrite => '$TEXT',
            fields  => [ '*' ],
        } ],
        'br' => [ {
            rewrite => '',
            fields  => [ '*' ],
        } ],
    },
    strip_text => [ 'mailto:' ],
});

my @expected = (
    [
      '20080303',
      '2008',
      '03',
      '03',
      '3',
      'Mo',
      '20:00',
      'Linux Stammtisch in Winterthur',
      'winti',
      $join->(<<'EOT'),
Restaurant Pizzeria La Pergola - http://www.la-pergola-winti.ch/, Stadthausstrasse
71, 8400 Winterthur (Karte - http://map.search.ch/8400-winterthur/stadthausstr.-71)
EOT
      'Paul Bosshard - Paul.Bosshard@LUGS.ch',
      'Mehr Infos - /lugs/sektionen/winterthur.phtml',
      '20080303_0_winti',
    ],
    [
      '20080306',
      '2008',
      '03',
      '06',
      '6',
      'Do',
      '19:30',
      'LugBE Treff',
      'bern',
      $join->(<<'EOT'),
Restaurant Beaulieu, Erlachstrasse 3, 3012 Bern (Karte -
http://map.search.ch/3012-bern/erlachstr.-3)
EOT
      'info@lugbe.ch - info@lugbe.ch',
      'Mehr Infos - http://lugbe.ch/action/nexttreff.phtml',
      '20080306_0_bern',
    ],
    [
      '20090709',
      '2009',
      '07',
      '09',
      '9',
      'Do',
      '19:15',
      'LUGS Treff',
      'treff',
      $join->(<<'EOT'),
ETH Zürich, HG G 26.5 -
http://www.rauminfo.ethz.ch/grundrissplan.gif?region=Z&areal=Z&gebaeude=HG&geschoss=G&raumNr=26.5
(anderer Raum!)
EOT
      'LUGS Vorstand - lugsvs@lugs.ch',
      'Restaurant nach dem Treff: Auswahl / Anmeldung - http://www.dood' .
        'le.com/mgfpebmxx5ibyt4m (bis 09.07.2009 12:00)',
      '20090709_0_treff',
    ],
    [
      '20090725',
      '2009',
      '07',
      '25',
      '25',
      'Sa',
      'ab 17:00',
      'LUGS Grillabend',
      'spec',
      $join->(<<'EOT'),
Hütte/Areal des Schäferhundeclubs Winterthur (Anreise -
http://neil.franklin.ch/Info_Texts/Anreise_SCOG_Clubhaus.html)
EOT
      'Neil Franklin - neil@franklin.ch',
      $join->(<<'EOT'),
Wie schon die letzten Jahre werden wir auch dieses Jahr wieder eine LUGS-Grillparty
durchführen. Teilnehmer: LUGS Mitglieder (und werdende), Familie (Freund(in), Kinder,
Geschwister, ...), Freunde, ... Mehr Infos -
https://www.lugs.ch/lugs/interna/maillugs/200907/42.html (nur mit LUGS Login -
https://www.lugs.ch/lugs/badpw.phtml)
EOT
      '20090725_0_spec',
    ],
    [
      '20120922',
      '2012',
      '09',
      '22',
      '22',
      'Sa',
      '19:00 - 23:00',
      'Französischer Neujahrsmampf 2012',
      'spec',
      'Standort noch unbekannt',
      'Martin Ebnöther - ceo@fress-und-sauf-verein.ch',
      $join->(<<'EOT'),
Ideen / Vorschläge bitte per E-Mail an den CEO - ceo@fress-und-sauf-verein.ch?subject=Vorschlag
Französischer Neujahrsmampf 2012 senden.
EOT
      '20120922_0_spec',
    ],
    [
      '20100212',
      '2010',
      '02',
      '12',
      '12',
      'Fr',
      '19:15',
      'LUGS Treff - Voodoo, Schwarze Magie und Internet per UMTS',
      'treff',
      $join->(<<'EOT'),
Solino - http://www.solino.ch/, Am Schanzengraben 15, 8002 Zürich (Karte -
http://map.search.ch/zuerich/am-schanzengraben-15)
EOT
      'Martin Ebnöther - ventilator@semmel.ch',
      undef,
      '20100212_0_treff',
    ],
    [
      '20110612',
      '2011',
      '06',
      '12',
      '12',
      'So',
       undef,
       undef,
      'spec',
       undef,
       undef,
       undef,
      '20110612_0_spec',
    ],
    [
      '20110612',
      '2011',
      '06',
      '12',
      '12',
      'So',
       undef,
       undef,
      'spec',
       undef,
       undef,
       undef,
      '20110612_1_spec',
    ],
);

my @events;
while (my $event = $parser->next_event) {
    push @events, [
        $event->get_event_date,
        $event->get_event_year,
        $event->get_event_month,
        $event->get_event_day,
        $event->get_event_simple_day,
        $event->get_event_weekday,
        $event->get_event_time,
        $event->get_event_title,
        $event->get_event_color,
        $event->get_event_location,
        $event->get_event_responsible,
        $event->get_event_more,
        $event->get_event_anchor,
    ];
}

foreach my $i (0 .. $#events) {
    my $counter = $i + 1 . '/' . scalar @events;
    is_deeply($events[$i], $expected[$i], "Filtering of event $counter");
}