github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/syndtr/goleveldb/leveldb/testutil/util.go (about) 1 // Copyright (c) 2014, Suryandaru Triandana <syndtr@gmail.com> 2 // All rights reserved. 3 // 4 // Use of this source code is governed by a BSD-style license that can be 5 // found in the LICENSE file. 6 7 package testutil 8 9 import ( 10 "bytes" 11 "flag" 12 "math/rand" 13 "reflect" 14 "sync" 15 16 "github.com/insionng/yougam/libraries/onsi/ginkgo/config" 17 18 "github.com/insionng/yougam/libraries/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{}, 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 } else { 116 x = append(x, c) 117 } 118 } 119 return append(x, 'x') 120 } 121 122 func RandomIndex(rnd *rand.Rand, n, round int, fn func(i int)) { 123 if rnd == nil { 124 rnd = NewRand() 125 } 126 for x := 0; x < round; x++ { 127 fn(rnd.Intn(n)) 128 } 129 return 130 } 131 132 func ShuffledIndex(rnd *rand.Rand, n, round int, fn func(i int)) { 133 if rnd == nil { 134 rnd = NewRand() 135 } 136 for x := 0; x < round; x++ { 137 for _, i := range rnd.Perm(n) { 138 fn(i) 139 } 140 } 141 return 142 } 143 144 func RandomRange(rnd *rand.Rand, n, round int, fn func(start, limit int)) { 145 if rnd == nil { 146 rnd = NewRand() 147 } 148 for x := 0; x < round; x++ { 149 start := rnd.Intn(n) 150 length := 0 151 if j := n - start; j > 0 { 152 length = rnd.Intn(j) 153 } 154 fn(start, start+length) 155 } 156 return 157 } 158 159 func Max(x, y int) int { 160 if x > y { 161 return x 162 } 163 return y 164 } 165 166 func Min(x, y int) int { 167 if x < y { 168 return x 169 } 170 return y 171 }