The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/perl -w
use strict;
use lib 't/lib';
use vars qw( $class $subclass );

use Test::More tests => 39;

# ------------------------------------------------------------------------

BEGIN {
    $class = 'Data::Phrasebook';
    use_ok $class;

    $subclass = 'MyPhrasebook';
    use_ok $subclass;
}

my $file = 't/01phrases.txt';
my $file2 = 't/01phrases2.txt';

# ------------------------------------------------------------------------

{
    my $obj = $class->new;
    isa_ok( $obj => "${class}::Plain", 'Class new' );
    $obj->file( $file );
    is( $obj->file() => $file , 'Set/get file works');
    $obj->file( $file2 );
    is( $obj->file() => $file2 , 'Reset/get file works');
}

{
    my $obj = $subclass->new;
    isa_ok( $obj => "${class}::Plain", 'Subclass new' );
    $obj->file( $file );
    is( $obj->file() => $file , 'Set/get file works');
}

{
    my $obj = $subclass->new( class => 'MyClass' );
    isa_ok( $obj => "MyClass", 'Subbed subclass new' );
    $obj->file( $file );
    is( $obj->file() => $file , 'Set/get file works');
}

{
	my $obj;
    eval { $obj = $subclass->new( class => 'BadClass' ); };
    is( $obj, undef, 'Nonexistent subbed subclass new' );
}

{
    my $obj = $class->new( file => $file );
    isa_ok( $obj => "${class}::Plain", 'New with file' );
    is( $obj->file() => $file , 'Get file works');

    {
        $obj->delimiters( qr{ \[% \s+ (\w+) \s+ %\] }x );

        my $str = $obj->fetch( 'foo', {
                my => "Iain's",
                place => 'locale',
            });

        is ($str, "Welcome to Iain's world. It is a nice locale.",
            'Fetch matches' );
    }

    {
        $obj->delimiters( qr{ :(\w+) }x );

        my $str = $obj->fetch( 'bar', {
                my => "Bob's",
                place => 'whatever',
            });

        is ($str, "Welcome to Bob's world. It is a nice whatever.",
            'Fetch matches' );
    }
}

{
    my $obj = $class->new;
    $obj->file( $file );
    is( $obj->file() => $file , 'Set/get file works');
    my $str = $obj->fetch( 'baz' );
    is($str, 'This is File 1');

    $obj->file( $file2 );
    is( $obj->file() => $file2 , 'Set/get file works');
    $str = $obj->fetch( 'baz' );
    is($str, 'This is File 2');

    $obj->file( $file );
    eval { $str = $obj->fetch( 'bar' ); };
    like($@, qr/No value/);
    eval { $str = $obj->fetch( 'notfound' ); };
    like($@, qr/No mapping/);
}

{
    eval { my $obj = $class->new(class  => 'Plain', loader => 'Bogus' ); $obj->fetch( 'bar' ); };
    like($@, qr/no loader available of that name/);
}

{
    BEGIN { use_ok 'Data::Phrasebook::Loader'; }

    my $obj = Data::Phrasebook::Loader->new();
    isa_ok( $obj => "${class}::Loader::Text", 'Loader new' );
    is( $obj->class, 'Text', 'default loader = Text' );
}

{
    BEGIN { use_ok 'Data::Phrasebook::Loader::Fake'; }
    BEGIN { use_ok 'Data::Phrasebook::Loader'; }

    my $fake = Data::Phrasebook::Loader::Fake->new();
    isa_ok( $fake => "${class}::Loader::Fake", 'new Fake Loader' );
    is( $fake->class, 'Fake', 'pretend loader = Fake' );
    is( $fake->load, undef, 'Fake - failed to load' );
    is( $fake->get,  undef, 'Fake - failed to get' );
    is_deeply( [$fake->dicts],    [], 'Fake - no dictionaries' );
    is_deeply( [$fake->keywords], [], 'Fake - no keywords' );

    my $obj = $subclass->new;
    is( $obj->loader, 'Text', 'empty loader => Text' );
    is( $obj->loaded(), undef, 'nothing loaded' );
    is( $obj->loaded($fake), $fake, 'Fake loaded' );
    is( $obj->loader, 'Fake', 'Fake loader' );

    $obj = $subclass->new;
    is( $obj->loaded(), undef, 'nothing loaded' );
    is( $obj->loaded($fake), $fake, 'Fake loaded' );
    is( $obj->loader, 'Fake', 'Fake loader' );
}