...

Source file src/github.com/agnivade/levenshtein/levenshtein_test.go

Documentation: github.com/agnivade/levenshtein

     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  		// Testing acutes and umlauts
    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  		// Only 2 characters are less in the 2nd string
    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  // Benchmarks
    60  // ----------------------------------------------
    61  var sink int
    62  
    63  func BenchmarkSimple(b *testing.B) {
    64  	tests := []struct {
    65  		a, b string
    66  		name string
    67  	}{
    68  		// ASCII
    69  		{"levenshtein", "frankenstein", "ASCII"},
    70  		// Testing acutes and umlauts
    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  		// Only 2 characters are less in the 2nd string
    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  		// ASCII
    94  		{"levenshtein", "frankenstein", "ASCII"},
    95  		// Testing acutes and umlauts
    96  		{"resumé and café", "resumés and cafés", "French"},
    97  		{"Hafþór Júlíus Björnsson", "Hafþor Julius Bjornsson", "Nordic"},
    98  		// Only 2 characters are less in the 2nd string
    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