Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
@@ -1,22 +0,0 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2018-2021 Matous Dzivjak <matousdzivjak@gmail.com>
|
||||
Copyright (c) 2021 Unistack LLC <v.tolstov@unistack.org>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
@@ -1,42 +0,0 @@
|
||||
package id
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
mid "go.unistack.org/micro/v3/util/id"
|
||||
)
|
||||
|
||||
func TestHasNoCollisions(t *testing.T) {
|
||||
tries := 100_000
|
||||
used := make(map[string]bool, tries)
|
||||
for i := 0; i < tries; i++ {
|
||||
id := mid.Must()
|
||||
require.False(t, used[id], "shouldn't return colliding IDs")
|
||||
used[id] = true
|
||||
}
|
||||
}
|
||||
|
||||
func TestFlatDistribution(t *testing.T) {
|
||||
tries := 100_000
|
||||
alphabet := "abcdefghij"
|
||||
size := 10
|
||||
chars := make(map[rune]int)
|
||||
for i := 0; i < tries; i++ {
|
||||
id := mid.Must(mid.Alphabet(alphabet), mid.Size(size))
|
||||
for _, r := range id {
|
||||
chars[r]++
|
||||
}
|
||||
}
|
||||
|
||||
for _, count := range chars {
|
||||
require.InEpsilon(t, size*tries/len(alphabet), count, .01, "should have flat distribution")
|
||||
}
|
||||
}
|
||||
|
||||
// Benchmark id generator
|
||||
func BenchmarkNanoid(b *testing.B) {
|
||||
for n := 0; n < b.N; n++ {
|
||||
_, _ = mid.New()
|
||||
}
|
||||
}
|
@@ -1,68 +0,0 @@
|
||||
package id_test
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
"unicode/utf8"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
id "go.unistack.org/micro/v3/util/id"
|
||||
)
|
||||
|
||||
func TestGenerate(t *testing.T) {
|
||||
t.Run("short alphabet", func(t *testing.T) {
|
||||
alphabet := ""
|
||||
_, err := id.New(id.Alphabet(alphabet), id.Size(32))
|
||||
assert.Error(t, err, "should return error if the alphabet is too small")
|
||||
})
|
||||
|
||||
t.Run("long alphabet", func(t *testing.T) {
|
||||
alphabet := strings.Repeat("a", 256)
|
||||
_, err := id.New(id.Alphabet(alphabet), id.Size(32))
|
||||
assert.Error(t, err, "should return error if the alphabet is too long")
|
||||
})
|
||||
|
||||
t.Run("negative ID length", func(t *testing.T) {
|
||||
_, err := id.New(id.Alphabet("abcdef"), id.Size(-1))
|
||||
assert.Error(t, err, "should return error if the requested ID length is invalid")
|
||||
})
|
||||
|
||||
t.Run("happy path", func(t *testing.T) {
|
||||
alphabet := "abcdef"
|
||||
id, err := id.New(id.Alphabet(alphabet), id.Size(6))
|
||||
assert.NoError(t, err, "shouldn't return error")
|
||||
assert.Len(t, id, 6, "should return ID of requested length")
|
||||
for _, r := range id {
|
||||
assert.True(t, strings.ContainsRune(alphabet, r), "should use given alphabet")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("works with unicode", func(t *testing.T) {
|
||||
alphabet := "🚀💩🦄🤖"
|
||||
id, err := id.New(id.Alphabet(alphabet), id.Size(6))
|
||||
assert.NoError(t, err, "shouldn't return error")
|
||||
assert.Equal(t, utf8.RuneCountInString(id), 6, "should return ID of requested length")
|
||||
for _, r := range id {
|
||||
assert.True(t, strings.ContainsRune(alphabet, r), "should use given alphabet")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestNew(t *testing.T) {
|
||||
t.Run("negative ID length", func(t *testing.T) {
|
||||
_, err := id.New(id.Size(-1))
|
||||
assert.Error(t, err, "should return error if the requested ID length is invalid")
|
||||
})
|
||||
|
||||
t.Run("happy path", func(t *testing.T) {
|
||||
nid, err := id.New()
|
||||
assert.NoError(t, err, "shouldn't return error")
|
||||
assert.Len(t, nid, id.DefaultSize, "should return ID of default length")
|
||||
})
|
||||
|
||||
t.Run("custom length", func(t *testing.T) {
|
||||
id, err := id.New(id.Size(6))
|
||||
assert.NoError(t, err, "shouldn't return error")
|
||||
assert.Len(t, id, 6, "should return ID of requested length")
|
||||
})
|
||||
}
|
Reference in New Issue
Block a user