1package syntax
2
3import (
4 "bufio"
5 "fmt"
6 "os"
7 "testing"
8 "time"
9
10 "github.com/stretchr/testify/assert"
11)
12
13func TestInteropTIDsValid(t *testing.T) {
14 assert := assert.New(t)
15 file, err := os.Open("testdata/tid_syntax_valid.txt")
16 assert.NoError(err)
17 defer file.Close()
18 scanner := bufio.NewScanner(file)
19 for scanner.Scan() {
20 line := scanner.Text()
21 if len(line) == 0 || line[0] == '#' {
22 continue
23 }
24 _, err := ParseTID(line)
25 if err != nil {
26 fmt.Println("GOOD: " + line)
27 }
28 assert.NoError(err)
29 }
30 assert.NoError(scanner.Err())
31}
32
33func TestInteropTIDsInvalid(t *testing.T) {
34 assert := assert.New(t)
35 file, err := os.Open("testdata/tid_syntax_invalid.txt")
36 assert.NoError(err)
37 defer file.Close()
38 scanner := bufio.NewScanner(file)
39 for scanner.Scan() {
40 line := scanner.Text()
41 if len(line) == 0 || line[0] == '#' {
42 continue
43 }
44 _, err := ParseTID(line)
45 if err == nil {
46 fmt.Println("BAD: " + line)
47 }
48 assert.Error(err)
49 }
50 assert.NoError(scanner.Err())
51}
52
53func TestTIDParts(t *testing.T) {
54 assert := assert.New(t)
55
56 raw := "3kao2cl6lyj2p"
57 tid, err := ParseTID(raw)
58 assert.NoError(err)
59 // TODO: assert.Equal(uint64(0x181a8044491f3bec), tid.Integer())
60 // TODO: assert.Equal(uint(1004), tid.ClockID())
61 assert.Equal(2023, tid.Time().Year())
62
63 out := NewTID(tid.Time().UnixMicro(), tid.ClockID())
64 assert.Equal(raw, out.String())
65 assert.Equal(tid.ClockID(), out.ClockID())
66 assert.Equal(tid.Time(), out.Time())
67 assert.Equal(tid.Integer(), out.Integer())
68
69 out2 := NewTIDFromInteger(tid.Integer())
70 assert.Equal(tid.Integer(), out2.Integer())
71}
72
73func TestTIDExamples(t *testing.T) {
74 assert := assert.New(t)
75 // TODO: seems like TS code might be wrong? "242k52k4kg3s2"
76 assert.Equal("242k52k4kg3sc", NewTIDFromInteger(0x0102030405060708).String())
77 assert.Equal(uint64(0x0102030405060708), TID("242k52k4kg3sc").Integer())
78 //assert.Equal("2222222222222", NewTIDFromInteger(0x0000000000000000).String())
79 //assert.Equal(uint64(), TID("242k52k4kg3s2").Integer())
80 assert.Equal("2222222222223", NewTIDFromInteger(0x0000000000000001).String())
81 assert.Equal(uint64(0x0000000000000001), TID("2222222222223").Integer())
82
83 assert.Equal("6222222222222", NewTIDFromInteger(0x4000000000000000).String())
84 assert.Equal(uint64(0x4000000000000000), TID("6222222222222").Integer())
85
86 // ignoring type byte
87 assert.Equal("2222222222222", NewTIDFromInteger(0x8000000000000000).String())
88}
89
90func TestTIDNoPanic(t *testing.T) {
91 for _, s := range []string{"", "3jzfcijpj2z2aa", "3jzfcijpj2z2", ".."} {
92 bad := TID(s)
93 _ = bad.ClockID()
94 _ = bad.Integer()
95 _ = bad.Time()
96 _ = bad.String()
97 }
98}
99
100func TestTIDConstruction(t *testing.T) {
101 assert := assert.New(t)
102
103 zero := NewTID(0, 0)
104 assert.Equal("2222222222222", zero.String())
105 assert.Equal(uint64(0), zero.Integer())
106 assert.Equal(uint(0), zero.ClockID())
107 assert.Equal(time.UnixMicro(0).UTC(), zero.Time())
108
109 now := NewTIDNow(1011)
110 assert.Equal(uint(1011), now.ClockID())
111 assert.True(time.Since(now.Time()) < time.Minute)
112
113 over := NewTIDNow(4096)
114 assert.Equal(uint(0), over.ClockID())
115
116 next := NewTIDFromTime(time.Now(), 123)
117 assert.Equal(uint(123), next.ClockID())
118 assert.True(time.Since(next.Time()) < time.Minute)
119}
120
121func TestTIDClock(t *testing.T) {
122 assert := assert.New(t)
123
124 clk := NewTIDClock(0)
125 last := NewTID(0, 0)
126 for i := 0; i < 100; i++ {
127 next := clk.Next()
128 assert.Greater(next, last)
129 last = next
130 }
131}