github.com/aarzilli/tools@v0.0.0-20151123112009-0d27094f75e0/text/levenshtein/word/levenshtein_test.go (about) 1 package word 2 3 import ( 4 "fmt" 5 6 "github.com/pbberlin/tools/stringspb" 7 ls_core "github.com/pbberlin/tools/text/levenshtein" 8 9 "testing" 10 ) 11 12 type TestCase struct { 13 src string 14 dst string 15 distances []int 16 } 17 18 var testCasesBasic = []TestCase{ 19 20 // Edit Script Test Cases 21 {"", "wd1", []int{1, 1}}, 22 {"wd1", "wd1 wd1", []int{1, 1}}, 23 {"wd1", "wd1 wd1 wd1", []int{2, 2}}, 24 25 {"", "", []int{0, 0}}, 26 {"wd1", "wd2", []int{2, 2}}, 27 {"wd1 wd1 wd1", "wd1 wd2 wd1", []int{2, 2}}, 28 {"wd1 wd1 wd1", "wd1 wd2", []int{3, 3}}, 29 30 {"wd1", "wd1", []int{0, 0}}, 31 {"wd1 wd2", "wd1 wd2", []int{0, 0}}, 32 {"wd1", "", []int{1, 1}}, 33 34 {"wd1 wd2", "wd1", []int{1, 1}}, 35 {"wd1 wd2 wd3", "wd1", []int{2, 2}}, 36 37 {"wd1 wd1 wd1", "wd1 wd2 wd1 wd3", []int{3, 3}}, 38 } 39 40 var testCasesAdv1 = []TestCase{ 41 {"trink nicht so viel Kaffee", 42 "nicht für Kinder ist der Türkentrank", []int{9, 9}}, 43 44 {"ihn nicht der lassen kann", 45 "nicht für Kinder ist der Türkentrank", []int{7, 7}}, 46 } 47 48 var testCasesMoved = []TestCase{ 49 {"Ich ging im Walde so vor mich hin", 50 "im Walde Ich ging so vor mich hin", []int{4, 4}}, 51 52 {"Ich ging im Walde so vor mich hin", 53 "so vor mich hin im Walde Ich ging", []int{8, 8}}, 54 55 {"Ich ging im Walde so vor mich hin", 56 "Ich ging im Forst so vor mich her", []int{4, 228}}, 57 58 {"Ich ging im Walde so vor mich hin", 59 "Ich ging im Walde so vor mich her hin", []int{1, 228}}, 60 } 61 62 func TestLevenshteinA(t *testing.T) { 63 64 cases := testCasesBasic 65 cases = append(cases, testCasesAdv1...) 66 cases = append(cases, testCasesMoved...) 67 // cases = testCasesMoved[3:4] 68 69 { 70 inner(t, &cases, 0, ls_core.DefaultOptions, false) 71 72 // opt2 := ls_core.DefaultOptions 73 // opt2.SubCost = 1 74 // inner(t, &cases, 1, opt2, false) 75 // inner(t, &cases, 1, opt2, true) 76 } 77 78 } 79 80 func inner(t *testing.T, cases *[]TestCase, wantIdx int, opt ls_core.Options, sortIt bool) { 81 82 for i, tc := range *cases { 83 84 m := ls_core.New(WrapAsEqualer(tc.src, sortIt), WrapAsEqualer(tc.dst, sortIt), opt) 85 got, relDist := m.Distance() 86 _ = relDist 87 // fmt.Printf("%v %v\n", got, relDist) 88 89 ssrc := fmt.Sprintf("%v", tc.src) 90 sdst := fmt.Sprintf("%v", tc.dst) 91 if got != tc.distances[wantIdx] { 92 t.Logf( 93 "%2v: Distance between %20v and %20v should be %v - but got %v (sorted %v)", 94 i, stringspb.Ellipsoider(ssrc, 8), stringspb.Ellipsoider(sdst, 8), tc.distances[wantIdx], got, sortIt) 95 t.Fail() 96 } 97 98 m.Print() 99 fmt.Printf("\n") 100 101 es := m.EditScript() 102 103 got2 := m.ApplyEditScript(es) 104 if !m.CompareToCol(got2) { 105 t.Logf("\nwnt %v \ngot %v ", WrapAsEqualer(tc.dst, sortIt), got2) 106 t.Fail() 107 } 108 109 fmt.Printf("\n") 110 fmt.Printf("\n") 111 112 } 113 114 }