...
1
2
3
4
5
6
7 package testutil
8
9 import (
10 "bytes"
11 "flag"
12 "math/rand"
13 "reflect"
14 "sync"
15
16 "github.com/onsi/ginkgo/config"
17
18 "github.com/syndtr/goleveldb/leveldb/comparer"
19 )
20
21 var (
22 runfn = make(map[string][]func())
23 runmu sync.Mutex
24 )
25
26 func Defer(args ...interface{}) bool {
27 var (
28 group string
29 fn func()
30 )
31 for _, arg := range args {
32 v := reflect.ValueOf(arg)
33 switch v.Kind() {
34 case reflect.String:
35 group = v.String()
36 case reflect.Func:
37 r := reflect.ValueOf(&fn).Elem()
38 r.Set(v)
39 }
40 }
41 if fn != nil {
42 runmu.Lock()
43 runfn[group] = append(runfn[group], fn)
44 runmu.Unlock()
45 }
46 return true
47 }
48
49 func RunDefer(groups ...string) bool {
50 if len(groups) == 0 {
51 groups = append(groups, "")
52 }
53 runmu.Lock()
54 var runfn_ []func()
55 for _, group := range groups {
56 runfn_ = append(runfn_, runfn[group]...)
57 delete(runfn, group)
58 }
59 runmu.Unlock()
60 for _, fn := range runfn_ {
61 fn()
62 }
63 return runfn_ != nil
64 }
65
66 func RandomSeed() int64 {
67 if !flag.Parsed() {
68 panic("random seed not initialized")
69 }
70 return config.GinkgoConfig.RandomSeed
71 }
72
73 func NewRand() *rand.Rand {
74 return rand.New(rand.NewSource(RandomSeed()))
75 }
76
77 var cmp = comparer.DefaultComparer
78
79 func BytesSeparator(a, b []byte) []byte {
80 if bytes.Equal(a, b) {
81 return b
82 }
83 i, n := 0, len(a)
84 if n > len(b) {
85 n = len(b)
86 }
87 for ; i < n && (a[i] == b[i]); i++ {
88 }
89 x := append([]byte(nil), a[:i]...)
90 if i < n {
91 if c := a[i] + 1; c < b[i] {
92 return append(x, c)
93 }
94 x = append(x, a[i])
95 i++
96 }
97 for ; i < len(a); i++ {
98 if c := a[i]; c < 0xff {
99 return append(x, c+1)
100 } else {
101 x = append(x, c)
102 }
103 }
104 if len(b) > i && b[i] > 0 {
105 return append(x, b[i]-1)
106 }
107 return append(x, 'x')
108 }
109
110 func BytesAfter(b []byte) []byte {
111 var x []byte
112 for _, c := range b {
113 if c < 0xff {
114 return append(x, c+1)
115 }
116 x = append(x, c)
117 }
118 return append(x, 'x')
119 }
120
121 func RandomIndex(rnd *rand.Rand, n, round int, fn func(i int)) {
122 if rnd == nil {
123 rnd = NewRand()
124 }
125 for x := 0; x < round; x++ {
126 fn(rnd.Intn(n))
127 }
128 }
129
130 func ShuffledIndex(rnd *rand.Rand, n, round int, fn func(i int)) {
131 if rnd == nil {
132 rnd = NewRand()
133 }
134 for x := 0; x < round; x++ {
135 for _, i := range rnd.Perm(n) {
136 fn(i)
137 }
138 }
139 }
140
141 func RandomRange(rnd *rand.Rand, n, round int, fn func(start, limit int)) {
142 if rnd == nil {
143 rnd = NewRand()
144 }
145 for x := 0; x < round; x++ {
146 start := rnd.Intn(n)
147 length := 0
148 if j := n - start; j > 0 {
149 length = rnd.Intn(j)
150 }
151 fn(start, start+length)
152 }
153 }
154
155 func Max(x, y int) int {
156 if x > y {
157 return x
158 }
159 return y
160 }
161
162 func Min(x, y int) int {
163 if x < y {
164 return x
165 }
166 return y
167 }
168
View as plain text