1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-07-22 14:49:42 +02:00
documize/vendor/github.com/rs/xid/id_test.go
2016-07-07 18:54:16 -07:00

111 lines
2.8 KiB
Go

package xid
import (
"encoding/json"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
type IDParts struct {
id ID
timestamp int64
machine []byte
pid uint16
counter int32
}
var IDs = []IDParts{
IDParts{
ID{0x4d, 0x88, 0xe1, 0x5b, 0x60, 0xf4, 0x86, 0xe4, 0x28, 0x41, 0x2d, 0xc9},
1300816219,
[]byte{0x60, 0xf4, 0x86},
0xe428,
4271561,
},
IDParts{
ID{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
0,
[]byte{0x00, 0x00, 0x00},
0x0000,
0,
},
IDParts{
ID{0x00, 0x00, 0x00, 0x00, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0x00, 0x00, 0x01},
0,
[]byte{0xaa, 0xbb, 0xcc},
0xddee,
1,
},
}
func TestIDPartsExtraction(t *testing.T) {
for i, v := range IDs {
assert.Equal(t, v.id.Time(), time.Unix(v.timestamp, 0), "#%d timestamp", i)
assert.Equal(t, v.id.Machine(), v.machine, "#%d machine", i)
assert.Equal(t, v.id.Pid(), v.pid, "#%d pid", i)
assert.Equal(t, v.id.Counter(), v.counter, "#%d counter", i)
}
}
func TestNew(t *testing.T) {
// Generate 10 ids
ids := make([]ID, 10)
for i := 0; i < 10; i++ {
ids[i] = New()
}
for i := 1; i < 10; i++ {
prevID := ids[i-1]
id := ids[i]
// Test for uniqueness among all other 9 generated ids
for j, tid := range ids {
if j != i {
assert.NotEqual(t, id, tid, "Generated ID is not unique")
}
}
// Check that timestamp was incremented and is within 30 seconds of the previous one
secs := id.Time().Sub(prevID.Time()).Seconds()
assert.Equal(t, (secs >= 0 && secs <= 30), true, "Wrong timestamp in generated ID")
// Check that machine ids are the same
assert.Equal(t, id.Machine(), prevID.Machine())
// Check that pids are the same
assert.Equal(t, id.Pid(), prevID.Pid())
// Test for proper increment
delta := int(id.Counter() - prevID.Counter())
assert.Equal(t, delta, 1, "Wrong increment in generated ID")
}
}
func TestIDString(t *testing.T) {
id := ID{0x4d, 0x88, 0xe1, 0x5b, 0x60, 0xf4, 0x86, 0xe4, 0x28, 0x41, 0x2d, 0xc9}
assert.Equal(t, "TYjhW2D0huQoQS3J", id.String())
}
type jsonType struct {
ID *ID
}
func TestIDJSONMarshaling(t *testing.T) {
id := ID{0x4d, 0x88, 0xe1, 0x5b, 0x60, 0xf4, 0x86, 0xe4, 0x28, 0x41, 0x2d, 0xc9}
v := jsonType{ID: &id}
data, err := json.Marshal(&v)
assert.NoError(t, err)
assert.Equal(t, `{"ID":"TYjhW2D0huQoQS3J"}`, string(data))
}
func TestIDJSONUnmarshaling(t *testing.T) {
data := []byte(`{"ID":"TYjhW2D0huQoQS3J"}`)
v := jsonType{}
err := json.Unmarshal(data, &v)
assert.NoError(t, err)
assert.Equal(t, ID{0x4d, 0x88, 0xe1, 0x5b, 0x60, 0xf4, 0x86, 0xe4, 0x28, 0x41, 0x2d, 0xc9}, *v.ID)
}
func TestIDJSONUnmarshalingError(t *testing.T) {
v := jsonType{}
err := json.Unmarshal([]byte(`{"ID":"TYjhW2D0huQoQS"}`), &v)
assert.EqualError(t, err, "invalid ID")
err = json.Unmarshal([]byte(`{"ID":"TYjhW2D0huQoQS3kdk"}`), &v)
assert.EqualError(t, err, "invalid ID")
}