The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use strict;
use warnings;
use utf8;
use Test::More;
use Test::Requires 'Test::TCP';
use AnyEvent;
use AnyEvent::Handle;
use AnyEvent::Socket;
use Encode;

use AnyEvent::SKKServ;

sub on_request {
    my ($hdl, $req) = @_;
    my %dict = (
        'はつねみく'   => "1/初音ミク/初音未来/ハツネミク/はつねミク/はつねみく/\n",
        'かがみねりん' => "1/鏡音リン/鏡音鈴/かがみねりん/カガミネリン/カガミネリン/\n",
        'かがみねれん' => "1/鏡音レン/かがみねれん/カガミネレン/カガミネレン/\n",
    );

    $req = decode_utf8($req);
    if (exists $dict{$req}) {
        $hdl->push_write(encode_utf8($dict{$req}));
    } else {
        $hdl->push_write("4\n");
    }
}

my $server = Test::TCP->new(
    code => sub {
        my $port = shift;

        my $skkserv = AnyEvent::SKKServ->new(
            port => $port,
            on_request => \&on_request,
        );
        $skkserv->run;

        AE::cv()->recv;
    },
);

my $cv = AE::cv();

tcp_connect '127.0.0.1', $server->port, sub {
    my ($fh) = @_ or die $!;
    my $hdl; $hdl = AnyEvent::Handle->new(
        fh => $fh,
    );

    $hdl->push_write(encode_utf8('1はつねみく '));
    $hdl->push_read(regex => qr/\n/, sub {
        is decode_utf8($_[1]), "1/初音ミク/初音未来/ハツネミク/はつねミク/はつねみく/\n";
    });

    $hdl->push_write(encode_utf8('1かがみねりん '));
    $hdl->push_read(regex => qr/\n/, sub {
        is decode_utf8($_[1]), "1/鏡音リン/鏡音鈴/かがみねりん/カガミネリン/カガミネリン/\n";
    });

    $hdl->push_write(encode_utf8('1かがみねれん '));
    $hdl->push_read(regex => qr/\n/, sub {
        is decode_utf8($_[1]), "1/鏡音レン/かがみねれん/カガミネレン/カガミネレン/\n";
    });

    $hdl->push_write(encode_utf8('1めぐりねるか '));
    $hdl->push_read(regex => qr/\n/, sub {
        is decode_utf8($_[1]), "4\n";

        undef $hdl;
        $cv->send;
    });
};

$cv->recv;

done_testing;