levenshtein_distance.t 971 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #!perl -T
  2. use utf8;
  3. use 5.006;
  4. use strict;
  5. use warnings;
  6. use Test::More;
  7. plan tests => 2;
  8. use Sidef;
  9. my $code = <<'EOT';
  10. func lev(s, t) {
  11. var d = [@(0 .. t.len), s.len.of {[_]}...]
  12. for i,j in (^s ~X ^t) {
  13. d[i+1][j+1] = (
  14. s[i] == t[j]
  15. ? d[i][j]
  16. : 1+Math.min(d[i][j+1], d[i+1][j], d[i][j])
  17. )
  18. }
  19. d[-1][-1]
  20. }
  21. EOT
  22. my $sidef = Sidef->new(name => 'levenshtein');
  23. my $lev = $sidef->execute_code($code);
  24. my @tests = (
  25. {
  26. s1 => 'kitten',
  27. s2 => 'sitting',
  28. d => 3
  29. },
  30. {
  31. s1 => 'rosettacode',
  32. s2 => 'raisethysword',
  33. d => 8,
  34. }
  35. );
  36. foreach my $t (@tests) {
  37. my ($s1, $s2) = map { Sidef::Types::String::String->new($t->{$_})->chars } ('s1', 's2');
  38. my $dist = $lev->call($s1, $s2);
  39. is("$dist", "$t->{d}", "lev($t->{s1}, $t->{s2}) = $t->{d}");
  40. }