github.com/icub3d/gop@v0.2.1/algo/algo_test.go (about) 1 // Copyright (c) 2015 Joshua Marsh. All rights reserved. 2 // 3 // Use of this source code is governed by the MIT license that can be 4 // found in the LICENSE file in the root of the repository or at 5 // https://raw.githubusercontent.com/icub3d/gop/master/LICENSE. 6 7 package algo 8 9 import ( 10 "bufio" 11 "errors" 12 "fmt" 13 "os" 14 "testing" 15 ) 16 17 func ExampleLevenshtein() { 18 h := "Happy Christmas" 19 m := "Merry Christmas" 20 l := Levenshtein(h, m) 21 fmt.Println(l) 22 // Output: 23 // 4 24 } 25 26 func TestMinInt(t *testing.T) { 27 tests := []struct { 28 a []int 29 e int 30 }{ 31 {e: 0, a: []int{}}, 32 {e: 1, a: []int{1}}, 33 {e: 30, a: []int{30, 100}}, 34 {e: 30, a: []int{100, 30}}, 35 {e: 10, a: []int{90, 40, 60, 12, 11, 10, 11, 14, 19, 100, 11, 11, 20}}, 36 } 37 for k, test := range tests { 38 r := MinInt(test.a...) 39 if r != test.e { 40 t.Errorf("Test %v: MinInt(%v) = %v, expected %v", k, test.a, r, test.e) 41 } 42 } 43 } 44 45 func TestMaxInt(t *testing.T) { 46 tests := []struct { 47 a []int 48 e int 49 }{ 50 {e: 0, a: []int{}}, 51 {e: 1, a: []int{1}}, 52 {e: 100, a: []int{30, 100}}, 53 {e: 100, a: []int{100, 30}}, 54 {e: 100, a: []int{90, 40, 60, 12, 11, 10, 11, 14, 19, 100, 11, 11, 20}}, 55 } 56 for k, test := range tests { 57 r := MaxInt(test.a...) 58 if r != test.e { 59 t.Errorf("Test %v: MaxInt(%v) = %v, expected %v", k, test.a, r, test.e) 60 } 61 } 62 } 63 64 func TestLevenshtein(t *testing.T) { 65 tests := []struct { 66 s string 67 t string 68 e int 69 }{ 70 { 71 s: "", 72 t: "test", 73 e: 4, 74 }, 75 { 76 s: "test", 77 t: "", 78 e: 4, 79 }, 80 { 81 s: "Claredi", 82 t: "Claredi", 83 e: 0, 84 }, 85 { 86 s: "Claredi", 87 t: "Clarity", 88 e: 3, 89 }, 90 { 91 s: "Claredi", 92 t: "Clardi", 93 e: 1, 94 }, 95 } 96 for k, test := range tests { 97 r := Levenshtein(test.s, test.t) 98 t.Logf("Levenshtein(%v, %v) = %v", test.s, test.t, r) 99 if r != test.e { 100 t.Errorf("Test %v: Levenshtein(%v, %v) = %v, expected %v", 101 k, test.s, test.t, r, test.e) 102 } 103 } 104 } 105 106 func BenchmarkLevenshtein(b *testing.B) { 107 b.StopTimer() 108 // Build a large sample set to test with. 109 var dict []string 110 var test = "Claredi" 111 f, err := os.Open("/usr/share/dict/american-english") 112 if err != nil { 113 panic(err) 114 } 115 defer f.Close() 116 s := bufio.NewScanner(f) 117 x := 0 118 for s.Scan() { 119 dict = append(dict, s.Text()) 120 x++ 121 if x > 10000 { 122 break 123 } 124 } 125 if s.Err() != nil { 126 panic(err) 127 } 128 129 b.StartTimer() 130 for _, t := range dict { 131 Levenshtein(test, t) 132 } 133 } 134 135 func TestNPIChecksum(t *testing.T) { 136 // This also checks most of Luhn. 137 tests := []struct { 138 s string 139 expected string 140 err error 141 }{ 142 {s: "123456789", expected: "3", err: nil}, 143 {s: "992739871", expected: "6", err: nil}, 144 {s: "000000000", expected: "6", err: nil}, 145 {s: "300000000", expected: "0", err: nil}, 146 {s: "000000060", expected: "0", err: nil}, 147 {s: "A0000", expected: "", err: errors.New(`strconv.ParseInt: parsing "A": invalid syntax`)}, 148 } 149 150 for k, test := range tests { 151 result, err := NPIChecksum(test.s) 152 if fmt.Sprintf("%v", err) != fmt.Sprintf("%v", test.err) { 153 t.Errorf("Test %v: expected error '%v' but got '%v'", k, test.err, err) 154 } 155 if result != test.expected { 156 t.Errorf("Test %v: expected result '%v' but got '%v'", k, test.expected, result) 157 } 158 } 159 } 160 161 func TestNPIChecksumAppend(t *testing.T) { 162 tests := []struct { 163 s string 164 expected string 165 err error 166 }{ 167 {s: "123456789", expected: "1234567893", err: nil}, 168 {s: "992739871", expected: "9927398716", err: nil}, 169 {s: "000000000", expected: "0000000006", err: nil}, 170 {s: "300000000", expected: "3000000000", err: nil}, 171 {s: "000000060", expected: "0000000600", err: nil}, 172 {s: "A0000", expected: "", err: errors.New(`strconv.ParseInt: parsing "A": invalid syntax`)}, 173 } 174 175 for k, test := range tests { 176 result, err := NPIChecksumAppend(test.s) 177 if fmt.Sprintf("%v", err) != fmt.Sprintf("%v", test.err) { 178 t.Errorf("Test %v: expected error '%v' but got '%v'", k, test.err, err) 179 } 180 if result != test.expected { 181 t.Errorf("Test %v: expected result '%v' but got '%v'", k, test.expected, result) 182 } 183 } 184 } 185 186 func TestNPIChecksumCheck(t *testing.T) { 187 // This also checks most of LuhnCheck. 188 tests := []struct { 189 s string 190 expected bool 191 }{ 192 {s: "1234567893", expected: true}, 193 {s: "9927398716", expected: true}, 194 {s: "0000000006", expected: true}, 195 {s: "3000000000", expected: true}, 196 {s: "0000000600", expected: true}, 197 {s: "A000000000", expected: false}, 198 {s: "1234567890", expected: false}, 199 {s: "1234567891", expected: false}, 200 {s: "1234567892", expected: false}, 201 {s: "1234567894", expected: false}, 202 {s: "1234567895", expected: false}, 203 {s: "1234567896", expected: false}, 204 {s: "1234567897", expected: false}, 205 {s: "1234567898", expected: false}, 206 {s: "1234567899", expected: false}, 207 } 208 209 for k, test := range tests { 210 result := NPIChecksumCheck(test.s) 211 if result != test.expected { 212 t.Errorf("Test %v: NPIChecksumCheck(%v) != %v", k, test.s, test.expected) 213 } 214 } 215 } 216 217 func TestLuhnErrors(t *testing.T) { 218 if LuhnCheck("1") != false { 219 t.Errorf(`LuhnCheck("1") != false`) 220 } 221 if s, err := Luhn("1"); s != "" || err != ErrInvalidParams { 222 t.Errorf(`Luhn("1") != "", ErrInvalidParams`) 223 } 224 } 225 226 func TestLuhnAppend(t *testing.T) { 227 tests := []struct { 228 s string 229 expected string 230 err error 231 }{ 232 {s: "123456789", expected: "1234567897", err: nil}, 233 {s: "992739871", expected: "9927398710", err: nil}, 234 {s: "000000000", expected: "0000000000", err: nil}, 235 {s: "300000000", expected: "3000000004", err: nil}, 236 {s: "000000060", expected: "0000000604", err: nil}, 237 {s: "A0000", expected: "", err: errors.New(`strconv.ParseInt: parsing "A": invalid syntax`)}, 238 } 239 240 for k, test := range tests { 241 result, err := LuhnAppend(test.s) 242 if fmt.Sprintf("%v", err) != fmt.Sprintf("%v", test.err) { 243 t.Errorf("Test %v: expected error '%v' but got '%v'", k, test.err, err) 244 } 245 if result != test.expected { 246 t.Errorf("Test %v: expected result '%v' but got '%v'", k, test.expected, result) 247 } 248 } 249 250 }