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  }