diff --git a/validUtil/bank_card.go b/validUtil/bank_card.go index 6f0c689..e4c75db 100644 --- a/validUtil/bank_card.go +++ b/validUtil/bank_card.go @@ -1,33 +1,40 @@ package validUtil -import ( - "regexp" -) - // IsBankCardNo 验证是否为大陆银行卡号 -func IsBankCardNo(cardNo string) bool { - // 银行卡号长度为 16-19 位 - if len(cardNo) < 16 || len(cardNo) > 19 { +func IsBankCardNo(cardNumber string) bool { + if len(cardNumber) != 16 && len(cardNumber) != 19 { return false } - - // 银行卡号必须为数字 - match, _ := regexp.MatchString("^[0-9]+$", cardNo) - if !match { - return false - } - - // 使用 Luhn 算法验证银行卡号的合法性 - var sum int - for i, c := range cardNo { - num := int(c - '0') - if i%2 == 0 { - num *= 2 - if num > 9 { - num -= 9 - } + var cardArr []int + for _, c := range cardNumber { + if c < '0' || c > '9' { + return false } - sum += num + cardArr = append(cardArr, int(c-'0')) + } + if len(cardArr) == 16 { + sum := 0 + for i := len(cardArr) - 1; i >= 0; i-- { + if i%2 == 0 { + cardArr[i] *= 2 + if cardArr[i] > 9 { + cardArr[i] -= 9 + } + } + sum += cardArr[i] + } + return sum%10 == 0 + } else { + sum := 0 + for i := len(cardArr) - 1; i >= 0; i-- { + if (len(cardArr)-i)%2 == 0 { + cardArr[i] *= 2 + if cardArr[i] > 9 { + cardArr[i] -= 9 + } + } + sum += cardArr[i] + } + return sum%10 == 0 } - return sum%10 == 0 } diff --git a/validUtil/bank_card_test.go b/validUtil/bank_card_test.go index aa7ebcc..9e1e169 100644 --- a/validUtil/bank_card_test.go +++ b/validUtil/bank_card_test.go @@ -1,39 +1,49 @@ package validUtil -import "testing" +import ( + "testing" +) +// 测试IsBankCardNo函数 func TestIsBankCardNo(t *testing.T) { + tests := []struct { + name string + cardNo string + wantRes bool + }{ + {"empty cardNo", "", false}, + {"less than 16 digits", "123456789012345", false}, + {"more than 19 digits", "12345678901234567890", false}, + {"contains non-numeric characters", "1234567a890123456", false}, + {"valid cardNo with 16 digits", "6222020123456789", true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := IsBankCardNo(tt.cardNo) + if got != tt.wantRes { + t.Errorf("IsBankCardNo(%s) = %t, want %t", tt.cardNo, got, tt.wantRes) + } + }) + } + testCases := []struct { name string - input string + cardNum string expected bool }{ - { - name: "valid bank card number with 15 digits", - input: "123456789012345", - expected: false, - }, - { - name: "invalid bank card number with less than 15 digits", - input: "123456789012", - expected: false, - }, - { - name: "invalid bank card number with more than 19 digits", - input: "12345678901234567890", - expected: false, - }, - { - name: "invalid bank card number with non-digit characters", - input: "12345abc6789012345", - expected: false, - }, + {"case 1", "1234567890123456", false}, + {"case 2", "6217000010081698261", true}, + {"case 3", "6227000010081698261", false}, + {"case 4", "621700001008169826", false}, + {"case 5", "62170000100816982612", false}, } + for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - result := IsBankCardNo(tc.input) + result := IsBankCardNo(tc.cardNum) if result != tc.expected { - t.Errorf("input(%s) expected %v, but got %v", tc.input, tc.expected, result) + t.Errorf("expected %v, but got %v", tc.expected, result) } }) } diff --git a/validUtil/datetime_test.go b/validUtil/datetime_test.go index c224ee7..246cac4 100644 --- a/validUtil/datetime_test.go +++ b/validUtil/datetime_test.go @@ -23,20 +23,22 @@ func TestIsTime(t *testing.T) { } func TestIsDate(t *testing.T) { - if !IsDate("2023-03-11") { - t.Error("Expected true, got false") + testCases := []struct { + input string + expected bool + }{ + {"2021-01-01", true}, + {"2021/01/01", false}, + {"2021-13-01", false}, + {"2021-02-29", false}, + {"2020-02-29", true}, } - if IsDate("2023-02-29") { - t.Error("Expected false, got true") - } - if IsDate("2023-04-31") { - t.Error("Expected false, got true") - } - if IsDate("2023-13-01") { - t.Error("Expected false, got true") - } - if IsDate("2023-03-11 12:34:56") { - t.Error("Expected false, got true") + + for _, testCase := range testCases { + result := IsDate(testCase.input) + if result != testCase.expected { + t.Errorf("IsDate(%v) = %v, expected %v", testCase.input, result, testCase.expected) + } } } diff --git a/validUtil/idcard_test.go b/validUtil/idcard_test.go index 613170d..95efea8 100644 --- a/validUtil/idcard_test.go +++ b/validUtil/idcard_test.go @@ -1,61 +1,41 @@ package validUtil -//import "testing" -// -//func TestIsIDCard(t *testing.T) { -// // 18位身份证号码测试 -// cases18 := []struct { -// input string -// want bool -// }{ -// {"", false}, -// {"123456789012345678", false}, -// {"12345678901234567X", false}, -// {"12345678901234567x", false}, -// {"360313198909085215", true}, -// {"36031319890908521x", true}, -// {"36031319890908521X", true}, -// {"110101198001010018", true}, -// {"11010119800101001X", true}, -// {"11010119800101001x", true}, -// {"320311770706001", false}, -// {"32031119770706001X", false}, -// {"360313198909285215", false}, -// {"360313198909085211", false}, -// {"360313198912345678", false}, -// } -// for _, c := range cases18 { -// got := IsIDCard(c.input) -// if got != c.want { -// t.Errorf("IsIDCard(%q) == %v, want %v", c.input, got, c.want) -// } -// } -// -// // 15位身份证号码测试 -// cases15 := []struct { -// input string -// want bool -// }{ -// {"", false}, -// {"12345678901234", false}, -// {"1234567890123X", false}, -// {"1234567890123x", false}, -// {"320311770706001", true}, -// {"330782820506908", true}, -// {"620321871001001", true}, -// {"622922780623068", true}, -// {"632523830310017", true}, -// {"130283820529063", true}, -// {"340702800818200", true}, -// {"110000400101001", true}, -// {"110000500101001", false}, -// {"110000200101001", false}, -// {"110000700101001", false}, -// } -// for _, c := range cases15 { -// got := IsIDCard(c.input) -// if got != c.want { -// t.Errorf("IsIDCard(%q) == %v, want %v", c.input, got, c.want) -// } -// } -//} +import "testing" + +func TestIsIDCard1(t *testing.T) { + // 18位身份证号码测试 + cases18 := []struct { + input string + want bool + }{ + {"", false}, + {"123456789012345678", false}, + {"12345678901234567X", false}, + {"12345678901234567x", false}, + {"120103199001015953", true}, + } + for _, c := range cases18 { + got := IsIDCard(c.input) + if got != c.want { + t.Errorf("IsIDCard(%q) == %v, want %v", c.input, got, c.want) + } + } +} + +func TestIsIDCard2(t *testing.T) { + // 15位身份证号码测试 + cases15 := []struct { + input string + want bool + }{ + {"", false}, + {"12345678901234", false}, + {"1234567890123X", false}, + } + for _, c := range cases15 { + got := IsIDCard(c.input) + if got != c.want { + t.Errorf("IsIDCard(%q) == %v, want %v", c.input, got, c.want) + } + } +}