# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.pl'
#########################
use strict;
use warnings;
use Test::More tests => 144;
BEGIN { use_ok('Games::EverQuest::LogLineParser') }
#########################
# Insert your test code below, the Test module is use()ed here so read
# its man page ( perldoc Test ) for help writing this test script.
my @tests = (
{
in => qq|[Sat Sep 27 23:18:53 2003] You slash a Bloodguard crypt sentry for 88 points of damage.\r\n|,
out => {
line_type => 'MELEE_DAMAGE',
attacker => 'You',
attack => 'slash',
attackee => 'a Bloodguard crypt sentry',
amount => '88',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You try to kick a Bloodguard crypt sentry, but miss!\n|,
out => {
line_type => 'YOU_MISS_MOB',
attack => 'kick',
attackee => 'a Bloodguard crypt sentry',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] A Bloodguard crypt sentry hits YOU for 161 points of damage.\n|,
out => {
line_type => 'MELEE_DAMAGE',
attacker => 'A Bloodguard crypt sentry',
attack => 'hit',
attackee => 'YOU',
amount => '161',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] A Bloodguard crypt sentry tries to hit YOU, but misses!\n|,
out => {
line_type => 'OTHER_MISSES',
attacker => 'A Bloodguard crypt sentry',
attack => 'hit',
attackee => 'YOU',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Soandso tries to slash a Bloodguard crypt sentry, but misses!\n|,
out => {
line_type => 'OTHER_MISSES',
attacker => 'Soandso',
attack => 'slash',
attackee => 'a Bloodguard crypt sentry',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Your faction standing with Loyals got worse.\n|,
out => {
line_type => 'FACTION_HIT',
faction_group => 'Loyals',
faction_change => 'worse',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] A Bloodguard crypt sentry tries to hit YOU, but YOU parry!\n|,
out => {
line_type => 'YOU_REPEL_HIT',
attacker => 'A Bloodguard crypt sentry',
attack => 'hit',
repel => 'parry',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You try to slash a Bloodguard crypt sentry, but a Bloodguard crypt sentry ripostes!\n|,
out => {
line_type => 'MOB_REPELS_HIT',
attack => 'slash',
attackee => 'a Bloodguard crypt sentry',
repel => 'riposte',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You have slain a Bloodguard crypt sentry!\n|,
out => {
line_type => 'SLAIN_BY_YOU',
slayee => 'a Bloodguard crypt sentry',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You have become better at Abjuration! (222)\n|,
out => {
line_type => 'SKILL_UP',
skill_upped => 'Abjuration',
skill_value => '222',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] a Bloodguard crypt sentry has been slain by Soandso!\n|,
out => {
line_type => 'SLAIN_BY_OTHER',
slayee => 'a Bloodguard crypt sentry',
slayer => 'Soandso',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You receive 67 platinum, 16 gold, 20 silver and 36 copper from the corpse.\n|,
out => {
line_type => 'CORPSE_MONEY',
platinum => '67',
gold => '16',
silver => '20',
copper => '36',
value => 68.836
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] a Bloodguard crypt sentry was hit by non-melee for 8 points of damage.\n|,
out => {
line_type => 'DAMAGE_SHIELD',
attacker => 'a Bloodguard crypt sentry',
amount => '8',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Soandso hit a Bloodguard crypt sentry for 300 points of non-melee damage.\n|,
out => {
line_type => 'DIRECT_DAMAGE',
attacker => 'Soandso',
attackee => 'a Bloodguard crypt sentry',
amount => '300',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] A Bloodguard crypt sentry has taken 3 damage from your Flame Lick.\n|,
out => {
line_type => 'DAMAGE_OVER_TIME',
attackee => 'A Bloodguard crypt sentry',
amount => '3',
spell => 'Flame Lick',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] --You have looted a Flawed Green Shard of Might.--\n|,
out => {
line_type => 'LOOT_ITEM',
looter => 'You',
item => 'Flawed Green Shard of Might',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] --Soandso has looted a Tears of Prexus.--\n|,
out => {
line_type => 'LOOT_ITEM',
looter => 'Soandso',
item => 'Tears of Prexus',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You give 1 gold 2 silver 5 copper to Cavalier Aodus.\n|,
out => {
line_type => 'BUY_ITEM',
platinum => 0,
gold => '1',
silver => '2',
copper => '5',
value => 0.125,
merchant => 'Cavalier Aodus',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You have entered The Greater Faydark.\n|,
out => {
line_type => 'ENTERED_ZONE',
zone => 'The Greater Faydark',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You receive 120 platinum from Magus Delin for the Fire Emerald Ring(s).\n|,
out => {
line_type => 'SELL_ITEM',
platinum => '120',
gold => 0,
silver => 0,
copper => 0,
value => 120,
merchant => 'Magus Delin',
item => 'Fire Emerald Ring',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You receive 163 platinum, 30 gold, 25 silver and 33 copper as your split.\n|,
out => {
line_type => 'SPLIT_MONEY',
platinum => '163',
gold => '30',
silver => '25',
copper => '33',
value => 166.2830,
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You have been slain by a Bloodguard crypt sentry!\n|,
out => {
line_type => 'YOU_SLAIN',
slayer => 'a Bloodguard crypt sentry',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You begin tracking a Bloodguard crypt sentry.\n|,
out => {
line_type => 'TRACKING_MOB',
trackee => 'a Bloodguard crypt sentry',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You begin casting Ensnaring Roots.\n|,
out => {
line_type => 'YOU_CAST',
spell => 'Ensnaring Roots',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Your target resisted the Ensnaring Roots spell.\n|,
out => {
line_type => 'SPELL_RESISTED',
spell => 'Ensnaring Roots',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You forget Ensnaring Roots.\n|,
out => {
line_type => 'FORGET_SPELL',
spell => 'Ensnaring Roots',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You have finished memorizing Ensnaring Roots.\n|,
out => {
line_type => 'MEMORIZE_SPELL',
spell => 'Ensnaring Roots',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Your spell fizzles!\n|,
out => {
line_type => 'YOU_FIZZLE',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Your Location is -63.20, 3846.55, -42.76\n|,
out => {
line_type => 'LOCATION',
coord_1 => '-63.20',
coord_2 => '3846.55',
coord_3 => '-42.76',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You tell your party, 'can you say /pet get lost'\n|,
out => {
line_type => 'YOU_TELL_GROUP',
spoken => 'can you say /pet get lost',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You say, 'thanks!'\n|,
out => {
line_type => 'YOU_SAY',
spoken => 'thanks!',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You say out of character, 'thanks!'\n|,
out => {
line_type => 'YOU_OOC',
spoken => 'thanks!',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You shout, 'thanks!'\n|,
out => {
line_type => 'YOU_SHOUT',
spoken => 'thanks!',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You auction, 'thanks!'\n|,
out => {
line_type => 'YOU_AUCTION',
spoken => 'thanks!',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Soandso says, 'I aim to please :)'\n|,
out => {
line_type => 'OTHER_SAYS',
speaker => 'Soandso',
spoken => 'I aim to please :)',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You told Soandso, 'lol, i was waiting for that =)'\n|,
out => {
line_type => 'YOU_TELL_OTHER',
speakee => 'Soandso',
spoken => 'lol, i was waiting for that =)',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You told Soandso '[queued], good, one success earlier. acutally collected 27 items.'\n|,
out => {
line_type => 'YOU_TELL_OTHER',
speakee => 'Soandso',
spoken => '[queued], good, one success earlier. acutally collected 27 items.',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Soandso tells you, 'hows the adv?'\n|,
out => {
line_type => 'OTHER_TELLS_YOU',
speaker => 'Soandso',
spoken => 'hows the adv?',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Magus Delin tells you, 'I\'ll give you 3 gold 6 silver per Geode'\n|,
out => {
line_type => 'MERCHANT_TELLS_YOU',
platinum => 0,
gold => '3',
silver => '6',
copper => 0,
value => 0.360,
merchant => 'Magus Delin',
item => 'Geode',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Merabo Sotath tells you, 'I\'ll give you 3 platinum 9 gold 5 copper for the Blood Sword.'\n|,
out => {
line_type => 'MERCHANT_TELLS_YOU',
platinum => '3',
gold => '9',
silver => '0',
copper => '5',
value => 3.905,
merchant => 'Merabo Sotath',
item => 'Blood Sword',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Gaelsori Heriseron tells you, 'That\'ll be 1 platinum 2 gold 5 silver 9 copper for the Leather Wristbands.'\n|,
out => {
line_type => 'MERCHANT_PRICE',
platinum => '1',
gold => '2',
silver => '5',
copper => '9',
value => 1.259,
merchant => 'Gaelsori Heriseron',
item => 'Leather Wristbands',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You tell your party, 'will keep an eye out'\n|,
out => {
line_type => 'YOU_TELL_GROUP',
spoken => 'will keep an eye out',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Soandso tells the group, 'Didnt know that, thanks info'\n|,
out => {
line_type => 'OTHER_TELLS_GROUP',
speaker => 'Soandso',
spoken => 'Didnt know that, thanks info',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Soandso begins to cast a spell.\n|,
out => {
line_type => 'OTHER_CASTS',
caster => 'Soandso',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Soandso scores a critical hit! (126)\n|,
out => {
line_type => 'CRITICAL_DAMAGE',
attacker => 'Soandso',
type => 'hit',
amount => '126',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Soandso delivers a critical blast! (126)\n|,
out => {
line_type => 'CRITICAL_DAMAGE',
attacker => 'Soandso',
type => 'blast',
amount => '126',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Soandso has healed you for 456 points of damage.\n|,
out => {
line_type => 'PLAYER_HEALED',
healer => 'Soandso',
healee => 'you',
amount => '456',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Soandso says out of character, 'Stop following me :oP'\n|,
out => {
line_type => 'SAYS_OOC',
speaker => 'Soandso',
spoken => 'Stop following me :oP',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Soandso shouts, 'talk to vual stoutest'\n|,
out => {
line_type => 'OTHER_SHOUTS',
speaker => 'Soandso',
spoken => 'talk to vual stoutest',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Soandso auctions, 'WMBS - 4k OBO'\n|,
out => {
line_type => 'OTHER_AUCTIONS',
speaker => 'Soandso',
spoken => 'WMBS - 4k OBO',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] [56 Outrider] Soandso (Half Elf) <The Foobles>\n|,
out => {
line_type => 'PLAYER_LISTING',
afk => '',
linkdead => '',
anon => '',
level => '56',
class => 'Outrider',
name => 'Soandso',
race => 'Half Elf',
guild => 'The Foobles',
zone => '',
lfg => '',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] [65 Deceiver] Soandso (Barbarian) <The Foobles> ZONE: potranquility\n|,
out => {
line_type => 'PLAYER_LISTING',
afk => '',
linkdead => '',
anon => '',
level => '65',
class => 'Deceiver',
name => 'Soandso',
race => 'Barbarian',
guild => 'The Foobles',
zone => 'potranquility',
lfg => '',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Your Flame Lick spell has worn off.\n|,
out => {
line_type => 'YOUR_SPELL_WEARS_OFF',
spell => 'Flame Lick',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You have successfully completed your adventure. You received 22 adventure points. You have 30 minutes to exit this zone.\n|,
out => {
line_type => 'WIN_ADVENTURE',
amount => '22',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You have spent 40 adventure points.\n|,
out => {
line_type => 'SPEND_ADVENTURE_POINTS',
amount => '40',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You gain party experience!!\n|,
out => {
line_type => 'GAIN_EXPERIENCE',
gainer => 'party',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You gain experience!!\n|,
out => {
line_type => 'GAIN_EXPERIENCE',
gainer => '',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Game Time: Thursday, April 05, 3176 - 6 PM\n|,
out => {
line_type => 'GAME_TIME',
time => 'Thursday, April 05, 3176 - 6 PM',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Earth Time: Thursday, April 05, 2003 19:25:47\n|,
out => {
line_type => 'EARTH_TIME',
time => 'Thursday, April 05, 2003 19:25:47',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] **A Magic Die is rolled by Soandso.\n|,
out => {
line_type => 'MAGIC_DIE',
roller => 'Soandso',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] **It could have been any number from 0 to 550, but this time it turned up a 492.\n|,
out => {
line_type => 'ROLL_RESULT',
min => '0',
max => '550',
amount => '492',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Beginning to memorize Call of Sky...\n|,
out => {
line_type => 'BEGIN_MEMORIZE_SPELL',
spell => 'Call of Sky',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] a Bloodguard caretaker\'s casting is interrupted!\n|,
out => {
line_type => 'SPELL_INTERRUPTED',
caster => 'a Bloodguard caretaker',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Your spell is interrupted.\n|,
out => {
line_type => 'SPELL_INTERRUPTED',
caster => 'You',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Your spell would not have taken hold on your target.\n|,
out => {
line_type => 'SPELL_NO_HOLD',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Your target resisted the Snare spell.\n|,
out => {
line_type => 'SPELL_RESISTED',
spell => 'Snare',
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] You have gained a level! Welcome to level 42!\n|,
out => {
line_type => 'LEVEL_GAIN',
level => 42,
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Letsmekkadyl purchased 17 Bone Chips for ( 3p 2g 3s).\n|,
out => {
line_type => 'BAZAAR_SALE',
buyer => 'Letsmekkadyl',
item => 'Bone Chips',
quantity => '17',
platinum => '3',
gold => '2',
silver => '3',
copper => '0',
value => 3.230,
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Bazaar Trader Mode *ON*\n|,
out => {
line_type => 'BAZAAR_TRADER_MODE',
status => 1,
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] Bazaar Trader Mode *OFF*\n|,
out => {
line_type => 'BAZAAR_TRADER_MODE',
status => 0,
},
},
{
in => qq|[Sat Sep 27 23:18:53 2003] 1.) Bone Chips (Price 2g 5s).\n|,
out => {
line_type => 'BAZAAR_TRADER_PRICE',
item => 'Bone Chips',
platinum => 0,
gold => 2,
silver => 5,
copper => 0,
value => 0.250,
},
},
);
for my $test (@tests)
{
$test->{'out'}{'time_stamp'} = '[Sat Sep 27 23:18:53 2003] ';
## parse any
my $parsed_line = parse_eq_line($test->{'in'});
# is_deeply breaks on lines that did not parse. Instead we
# catch them manually.
if(not defined $parsed_line) {
fail("Did not parse: ".$test->{'in'});
fail("Did not parse: ".$test->{'in'});
next;
}
is_deeply( $parsed_line, $test->{'out'}, $test->{'in'});
## parse type
$parsed_line = parse_eq_line_type($test->{'out'}{'line_type'}, $test->{'in'});
is_deeply( $parsed_line, $test->{'out'}, $test->{'in'});
}
my $got_time_stamp = parse_eq_time_stamp('[Mon Oct 13 00:42:36 2003] ');
my $exp_time_stamp = {
day => 'Mon',
month => 'Oct',
date => '13',
hour => '00',
min => '42',
sec => '36',
year => '2003',
};
is_deeply( $got_time_stamp, $exp_time_stamp, 'parse_eq_time_stamp');