-
Notifications
You must be signed in to change notification settings - Fork 0
/
luhn_test.go
117 lines (103 loc) · 2.96 KB
/
luhn_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
//
// Copyright (C) 2020 Diego Augusto Molina
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 3 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package goluhn
import (
"fmt"
"testing"
)
var digits = []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
func testByLength(data *string, dataLength int, check *string, checkLength int,
) string {
for i := 0; i < dataLength-checkLength; i++ {
str := (*data)[i : i+checkLength]
digit := (*check)[i : i+1]
calculated := LuhnChecksum(str)
if calculated != digit {
return fmt.Sprintf("Bad check digit: %v; Expected: %v\n; string: %v",
calculated, digit, str)
}
for _, d := range digits {
r := LuhnValidate(str + d)
if (d != digit || !r) && (d == digit || r) {
return fmt.Sprintf("Bad double check: %v; Current Digit: %v; Correct "+
"Digit: %v; Validation: %v\n", str, d, digit, r)
}
}
}
return ""
}
func TestLuhnGoldenLen8(t *testing.T) {
t.Parallel()
load.Do(LoadTestData)
s := testByLength(TestData, TestDataLen, TestDataGoldenLen8, 8)
if len(s) > 0 {
t.Fatal(s)
}
}
func TestLuhnGoldenLen15(t *testing.T) {
t.Parallel()
load.Do(LoadTestData)
s := testByLength(TestData, TestDataLen, TestDataGoldenLen15, 15)
if len(s) > 0 {
t.Fatal(s)
}
}
func TestLuhnGolden(t *testing.T) {
t.Parallel()
load.Do(LoadTestData)
s := testByLength(TestData, TestDataLen, TestDataGolden, TestDataLen)
if len(s) > 0 {
t.Fatal(s)
}
}
func benchmarkValidateByLength(data *string, dataLength int, check *string,
checkLength int) {
for i := 0; i <= dataLength-checkLength; i++ {
_ = LuhnValidate((*data)[i : i+checkLength])
}
}
func BenchmarkLuhnLen8(b *testing.B) {
b.StopTimer()
load.Do(LoadTestData)
b.StartTimer()
for i := 0; i < b.N; i++ {
benchmarkValidateByLength(TestData, TestDataLen,
TestDataGoldenLen8, 8)
}
b.ReportMetric(float64(TestDataLen-7), "Validations/op")
b.SetBytes(int64((8 * (TestDataLen - 7))))
}
func BenchmarkLuhnLen15(b *testing.B) {
b.StopTimer()
load.Do(LoadTestData)
b.StartTimer()
for i := 0; i < b.N; i++ {
benchmarkValidateByLength(TestData, TestDataLen,
TestDataGoldenLen15, 15)
}
b.ReportMetric(float64(TestDataLen-14), "Validations/op")
b.SetBytes(int64((15 * (TestDataLen - 14))))
}
func BenchmarkLuhnFull(b *testing.B) {
b.StopTimer()
load.Do(LoadTestData)
b.StartTimer()
for i := 0; i < b.N; i++ {
benchmarkValidateByLength(TestData, TestDataLen, TestDataGolden,
TestDataLen)
}
b.ReportMetric(1, "Validations/op")
b.SetBytes(int64((TestDataLen)))
}