The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Text::Levenshtein::TestUtils;

use strict;
use warnings;

# This line is needed before we use Test::More, to suppress warnings
# about "Wide character in print" from Test::Builder
use open ':std', ':encoding(utf8)';

use Test::More 0.88;
use Text::Levenshtein qw/ distance fastdistance /;
use parent 'Exporter';
use Carp;

our @EXPORT_OK = qw/ run_data_tests /;

sub run_data_tests
{
    my $opt = {};
    my $package = (caller(0))[0];
    my $distance;
    my $fh;
    my @extra;

    @extra = @_;

    $fh = do {
        no strict 'refs';
        \*{"${package}::DATA"};
    };

    my @tests = parse_tests($fh);

    plan tests => 4 * @tests;

    foreach my $test (@tests) {
        $distance = distance($test->{word1}, $test->{word2}, @extra);
        ok($distance == $test->{distance},
           "$test->{title} (distance)");

        $distance = distance($test->{word2}, $test->{word1}, @extra);
        ok($distance == $test->{distance},
           "$test->{title} (reverse distance)");

        $distance = fastdistance($test->{word1}, $test->{word2}, @extra);
        ok($distance == $test->{distance},
           "$test->{title} (fastdistance)");

        $distance = fastdistance($test->{word2}, $test->{word1}, @extra);
        ok($distance == $test->{distance},
           "$test->{title} (reverse fastdistance)");
    }

}

sub parse_tests
{
    my $fh = shift;
    my @tests;
    my @fields;
    local $_;

    while (<$fh>) {
        next if /^--/;  # test case divider
        next if /^#/;   # comment
        chomp;
        push(@fields, $_);
        if (@fields == 3) {
            my ($word1, $word2, $expected_distance) = @fields;
            push(@tests, { title    => "$word1 vs $word2",
                           word1    => $word1,
                           word2    => $word2,
                           distance => $expected_distance,
                         });
            @fields = ();
        }
    }
    return @tests;
}

1;