File Coverage

blib/lib/Alice/Test/MockIRC.pm
Criterion Covered Total %
statement 9 44 20.4
branch 0 8 0.0
condition n/a
subroutine 3 20 15.0
pod 0 13 0.0
total 12 85 14.1


line stmt bran cond sub pod time code
1             package Alice::Test::MockIRC;
2              
3 1     1   36503 use Any::Moose;
  1         3  
  1         41  
4 1     1   649 use AnyEvent::IRC::Util qw/parse_irc_msg prefix_nick mk_msg/;
  1         2  
  1         60  
5 1     1   7 use Try::Tiny;
  1         3  
  1         1425  
6              
7             has cbs => (is => 'rw', default => sub {{}});
8             has nick => (is => 'rw');
9             has is_connected => (is => 'rw', default => 0);
10             has channels => (is => 'rw', default => sub {{}});
11             has user_prefix => (
12             is => 'rw',
13             lazy => 1,
14             default => sub{$_[0]->nick."!".$_[0]->nick."\@host"}
15             );
16              
17             has events => (
18             is => 'rw',
19             default => sub {
20             my $self = shift;
21             {
22             TOPIC => sub {
23             my $msg = shift;
24             my $nick = prefix_nick($msg->{prefix});
25             $self->cbs->{channel_topic}->($self, @{$msg->{params}}, $nick);
26             },
27             JOIN => sub {
28             my $msg = shift;
29             my $nick = prefix_nick($msg->{prefix});
30             $self->{channels}{$msg->{params}[0]} = 1;
31             $self->cbs->{join}->($self, $nick, $msg->{params}[0], $nick eq $self->nick);
32             $self->cbs->{channel_add}->($self, $msg, $msg->{params}[0], $nick);
33             $self->send_srv(WHO => $msg->{params}[0]);
34             },
35             NICK => sub {
36             my $msg = shift;
37             my $nick = prefix_nick($msg->{prefix});
38             $self->cbs->{nick_change}->($self, $nick, ${$msg->{params}}[0], $nick eq $self->nick);
39             },
40             PART => sub {
41             my $msg = shift;
42             my $nick = prefix_nick($msg->{prefix});
43             delete $self->{channels}{$msg->{params}[0]};
44             $self->cbs->{part}->($self, $nick, $msg->{params}[0], $nick eq $self->nick);
45             $self->cbs->{channel_remove}->($self, $msg, $msg->{params}[0], $nick);
46             },
47             PRIVMSG => sub {
48             my $msg = shift;
49             my $nick = prefix_nick($msg->{prefix});
50             $self->cbs->{privatemsg}->($self, $nick, $msg);
51             },
52             numeric => sub {
53             my ($msg, $number) = @_;
54             $self->cbs->{"irc_$number"}->($self, $msg);
55             },
56             }
57             }
58             );
59              
60             sub send_srv {
61 0     0 0   my ($self, $command, @args) = @_;
62 0     0     my $echo = sub {mk_msg($self->user_prefix, $command, @args)};
  0            
63 0           my $map = {
64             map({$_ => $echo} qw/TOPIC JOIN PART NICK/),
65             WHO => sub{
66 0 0   0     my $user = ($args[0] =~ /^#/ ? "test" : $args[0]);
67 0           ":local.irc 352 ".$self->nick." #test $user il.comcast.net local.irc $user H :0 $user";
68             },
69 0           };
70 0 0         $map->{$command} ? $self->send_cl($map->{$command}->())
71             : warn "no line mapped for $command\n"
72             }
73              
74             sub send_raw {
75 0     0 0   my ($self, $line) = @_;
76 0           $self->send_srv(split ' ', $line);
77             }
78              
79             sub send_cl {
80 0     0 0   my ($self, $line) = @_;
81 0           my $msg = parse_irc_msg($line);
82 0 0         my $cmd = ($msg->{command} =~ /^\d+/ ? 'numeric' : $msg->{command});
83 0 0   0     try { $self->events->{$cmd}->($msg, $msg->{command}) if $self->events->{$cmd} }
84 0     0     catch { warn "$_\n" };
  0            
85             }
86              
87 0     0 0   sub enable_ssl {}
88 0     0 0   sub isupport {}
89 0     0 0   sub ctcp_auto_reply {}
90             sub connect {
91 0     0 0   my $self = shift;
92 0           $self->cbs->{connect}->();
93             }
94             sub register {
95 0     0 0   my $self = shift;
96 0           $self->is_connected(1);
97 0           $self->cbs->{registered}->();
98             }
99             sub disconnect {
100 0     0 0   my $self = shift;
101 0           $self->is_connected(1);
102 0           $self->cbs->{disconnect}->();
103             }
104 0     0 0   sub enable_ping {}
105              
106             sub reg_cb {
107 0     0 0   my ($self, %callbacks) = @_;
108 0           for (keys %callbacks) {
109 0           $self->cbs->{$_} = $callbacks{$_};
110             }
111             }
112              
113             sub is_channel_name {
114 0     0 0   my ($self, $name) = @_;
115 0           return $name =~ /^[#&]/;
116             }
117              
118             sub channel_list {
119 0     0 0   my $self = shift;
120 0           return $self->channels;
121             }
122              
123             __PACKAGE__->meta->make_immutable;
124             1;