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  }