1 package levenshtein_test
2
3 import (
4 "testing"
5
6 agnivade "github.com/agnivade/levenshtein"
7 arbovm "github.com/arbovm/levenshtein"
8 dgryski "github.com/dgryski/trifles/leven"
9 )
10
11 func TestSanity(t *testing.T) {
12 tests := []struct {
13 a, b string
14 want int
15 }{
16 {"", "hello", 5},
17 {"hello", "", 5},
18 {"hello", "hello", 0},
19 {"ab", "aa", 1},
20 {"ab", "ba", 2},
21 {"ab", "aaa", 2},
22 {"bbb", "a", 3},
23 {"kitten", "sitting", 3},
24 {"distance", "difference", 5},
25 {"levenshtein", "frankenstein", 6},
26 {"resume and cafe", "resumes and cafes", 2},
27 {"a very long string that is meant to exceed", "another very long string that is meant to exceed", 6},
28 }
29 for i, d := range tests {
30 n := agnivade.ComputeDistance(d.a, d.b)
31 if n != d.want {
32 t.Errorf("Test[%d]: ComputeDistance(%q,%q) returned %v, want %v",
33 i, d.a, d.b, n, d.want)
34 }
35 }
36 }
37
38 func TestUnicode(t *testing.T) {
39 tests := []struct {
40 a, b string
41 want int
42 }{
43
44 {"resumé and café", "resumés and cafés", 2},
45 {"resume and cafe", "resumé and café", 2},
46 {"Hafþór Júlíus Björnsson", "Hafþor Julius Bjornsson", 4},
47
48 {"།་གམ་འས་པ་་མ།", "།་གམའས་པ་་མ", 2},
49 }
50 for i, d := range tests {
51 n := agnivade.ComputeDistance(d.a, d.b)
52 if n != d.want {
53 t.Errorf("Test[%d]: ComputeDistance(%q,%q) returned %v, want %v",
54 i, d.a, d.b, n, d.want)
55 }
56 }
57 }
58
59
60
61 var sink int
62
63 func BenchmarkSimple(b *testing.B) {
64 tests := []struct {
65 a, b string
66 name string
67 }{
68
69 {"levenshtein", "frankenstein", "ASCII"},
70
71 {"resumé and café", "resumés and cafés", "French"},
72 {"Hafþór Júlíus Björnsson", "Hafþor Julius Bjornsson", "Nordic"},
73 {"a very long string that is meant to exceed", "another very long string that is meant to exceed", "long string"},
74
75 {"།་གམ་འས་པ་་མ།", "།་གམའས་པ་་མ", "Tibetan"},
76 }
77 tmp := 0
78 for _, test := range tests {
79 b.Run(test.name, func(b *testing.B) {
80 for n := 0; n < b.N; n++ {
81 tmp = agnivade.ComputeDistance(test.a, test.b)
82 }
83 })
84 }
85 sink = tmp
86 }
87
88 func BenchmarkAll(b *testing.B) {
89 tests := []struct {
90 a, b string
91 name string
92 }{
93
94 {"levenshtein", "frankenstein", "ASCII"},
95
96 {"resumé and café", "resumés and cafés", "French"},
97 {"Hafþór Júlíus Björnsson", "Hafþor Julius Bjornsson", "Nordic"},
98
99 {"།་གམ་འས་པ་་མ།", "།་གམའས་པ་་མ", "Tibetan"},
100 }
101 tmp := 0
102 for _, test := range tests {
103 b.Run(test.name, func(b *testing.B) {
104 b.Run("agniva", func(b *testing.B) {
105 for n := 0; n < b.N; n++ {
106 tmp = agnivade.ComputeDistance(test.a, test.b)
107 }
108 })
109 b.Run("arbovm", func(b *testing.B) {
110 for n := 0; n < b.N; n++ {
111 tmp = arbovm.Distance(test.a, test.b)
112 }
113 })
114 b.Run("dgryski", func(b *testing.B) {
115 for n := 0; n < b.N; n++ {
116 tmp = dgryski.Levenshtein([]rune(test.a), []rune(test.b))
117 }
118 })
119 })
120 }
121 sink = tmp
122 }
123
View as plain text