From 26bc40c6141d2bfdb3f02fb31f63bee8eb6f946a Mon Sep 17 00:00:00 2001 From: dudaodong Date: Tue, 8 Nov 2022 14:54:17 +0800 Subject: [PATCH] feat: add new random function --- random/random.go | 53 +++++++++++++++++++++++++++++++++---------- random/random_test.go | 45 ++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 12 deletions(-) diff --git a/random/random.go b/random/random.go index d84f5d3..d3158b8 100644 --- a/random/random.go +++ b/random/random.go @@ -12,18 +12,12 @@ import ( "time" ) -// RandString generate random string -// see https://stackoverflow.com/questions/22892120/how-to-generate-a-random-string-of-a-fixed-length-in-go -func RandString(length int) string { - const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - - b := make([]byte, length) - r := rand.New(rand.NewSource(time.Now().UnixNano())) - for i := range b { - b[i] = letters[r.Int63()%int64(len(letters))] - } - return string(b) -} +const ( + NUMERAL = "0123456789" + LOWER_LETTERS = "abcdefghijklmnopqrstuvwxyz" + UPPER_LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + LETTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +) // RandInt generate random int between min and max, maybe min, not be max func RandInt(min, max int) int { @@ -50,6 +44,41 @@ func RandBytes(length int) []byte { return b } +// RandString generate random string +func RandString(length int) string { + return random(LETTERS, length) +} + +// RandUpper generate a random upper case string +func RandUpper(length int) string { + return random(UPPER_LETTERS, length) +} + +// RandLower generate a random lower case string +func RandLower(length int) string { + return random(LOWER_LETTERS, length) +} + +// RandNumeral generate a random numeral string +func RandNumeral(length int) string { + return random(NUMERAL, length) +} + +// RandNumeralOrLetter generate a random numeral or letter string +func RandNumeralOrLetter(length int) string { + return random(NUMERAL+LETTERS, length) +} + +// random generate a random string based on given string range +func random(s string, length int) string { + b := make([]byte, length) + r := rand.New(rand.NewSource(time.Now().UnixNano())) + for i := range b { + b[i] = s[r.Int63()%int64(len(s))] + } + return string(b) +} + // UUIdV4 generate a random UUID of version 4 according to RFC 4122 func UUIdV4() (string, error) { uuid := make([]byte, 16) diff --git a/random/random_test.go b/random/random_test.go index 82fc19a..1813931 100644 --- a/random/random_test.go +++ b/random/random_test.go @@ -19,6 +19,51 @@ func TestRandString(t *testing.T) { assert.Equal(true, reg.MatchString(randStr)) } +func TestRandUpper(t *testing.T) { + pattern := `^[A-Z]+$` + reg := regexp.MustCompile(pattern) + + randStr := RandUpper(6) + + assert := internal.NewAssert(t, "TestRandUpper") + assert.Equal(6, len(randStr)) + assert.Equal(true, reg.MatchString(randStr)) +} + +func TestRandLower(t *testing.T) { + pattern := `^[a-z]+$` + reg := regexp.MustCompile(pattern) + + randStr := RandLower(6) + + assert := internal.NewAssert(t, "TestRandLower") + assert.Equal(6, len(randStr)) + assert.Equal(true, reg.MatchString(randStr)) +} + +func TestRandNumeral(t *testing.T) { + pattern := `^[0-9]+$` + reg := regexp.MustCompile(pattern) + + randStr := RandNumeral(12) + + assert := internal.NewAssert(t, "TestRandNumeral") + assert.Equal(12, len(randStr)) + assert.Equal(true, reg.MatchString(randStr)) +} + +func TestRandNumeralOrLetter(t *testing.T) { + pattern := `^[0-9a-zA-Z]+$` + reg := regexp.MustCompile(pattern) + + randStr := RandNumeralOrLetter(10) + t.Log(randStr) + + assert := internal.NewAssert(t, "TestRandNumeralOrLetter") + assert.Equal(10, len(randStr)) + assert.Equal(true, reg.MatchString(randStr)) +} + func TestRandInt(t *testing.T) { assert := internal.NewAssert(t, "TestRandInt")