1
1
package atom_test
2
2
3
3
import (
4
+ "bytes"
4
5
"strconv"
5
6
"testing"
6
7
"time"
@@ -14,8 +15,29 @@ const (
14
15
sc = "interning"
15
16
)
16
17
17
- func TestPut (t * testing.T ) {
18
- s := atom .New (atom .NewMemMap ())
18
+ func TestEphemeralPut (t * testing.T ) {
19
+ s := atom .New (atom .NewEphemeralMap ())
20
+
21
+ for val , expected := range map [string ]uint32 {
22
+ sa : 1247594388 ,
23
+ sb : 3572195896 ,
24
+ sc : 1304336027 ,
25
+ } {
26
+ sym , err := s .Atom (val )
27
+ if err != nil {
28
+ t .Errorf ("failed to assign symbol: %s" , err )
29
+ }
30
+ if sym != expected {
31
+ t .Errorf ("failed to assign symbol: %d, expected %d" , sym , expected )
32
+ }
33
+ if val != s .String (sym ) {
34
+ t .Errorf ("failed to lookup string" )
35
+ }
36
+ }
37
+ }
38
+
39
+ func TestPermanentPut (t * testing.T ) {
40
+ s := atom .New (atom .NewPermanentMap (& none {}))
19
41
20
42
for val , expected := range map [string ]uint32 {
21
43
sa : 1247594388 ,
@@ -38,8 +60,21 @@ func TestPut(t *testing.T) {
38
60
// ---------------------------------------------------------------
39
61
40
62
// go test -run=^$ -bench=. -cpu=1 -benchtime=10s -cpuprofile profile.out
41
- func BenchmarkPut (b * testing.B ) {
42
- s := atom .New (atom .NewMemMap ())
63
+ func BenchmarkEphemeralPut (b * testing.B ) {
64
+ s := atom .New (atom .NewEphemeralMap ())
65
+
66
+ b .ReportAllocs ()
67
+ b .ResetTimer ()
68
+
69
+ t := time .Now ().Nanosecond ()
70
+
71
+ for n := 0 ; n < b .N ; n ++ {
72
+ s .Atom ("https://pkg.go.dev/hash/fnv@go1.20." + strconv .Itoa (t + n ))
73
+ }
74
+ }
75
+
76
+ func BenchmarkPermanentPut (b * testing.B ) {
77
+ s := atom .New (atom .NewPermanentMap (& none {}))
43
78
44
79
b .ReportAllocs ()
45
80
b .ResetTimer ()
@@ -55,7 +90,7 @@ func BenchmarkPut(b *testing.B) {
55
90
56
91
// go test -fuzz=FuzzSymbolOf
57
92
func FuzzSymbolOf (f * testing.F ) {
58
- s := atom .New (atom .NewMemMap ())
93
+ s := atom .New (atom .NewEphemeralMap ())
59
94
60
95
f .Add ("abc" )
61
96
@@ -66,3 +101,24 @@ func FuzzSymbolOf(f *testing.F) {
66
101
}
67
102
})
68
103
}
104
+
105
+ // ---------------------------------------------------------------
106
+
107
+ type none struct {
108
+ key []byte
109
+ val []byte
110
+ }
111
+
112
+ func (n * none ) Get (key []byte ) ([]byte , error ) {
113
+ if bytes .Equal (n .key , key ) {
114
+ return n .val , nil
115
+ }
116
+
117
+ return nil , nil
118
+ }
119
+
120
+ func (n * none ) Put (key []byte , val []byte ) error {
121
+ n .key = key
122
+ n .val = val
123
+ return nil
124
+ }
0 commit comments