1 // Copyright (c) 2014, Suryandaru Triandana <syndtr@gmail.com>
2 // All rights reserved.
4 // Use of this source code is governed by a BSD-style license that can be
5 // found in the LICENSE file.
16 "github.com/onsi/ginkgo/config"
18 "github.com/syndtr/goleveldb/leveldb/comparer"
22 runfn = make(map[string][]func())
26 func Defer(args ...interface{}) bool {
31 for _, arg := range args {
32 v := reflect.ValueOf(arg)
37 r := reflect.ValueOf(&fn).Elem()
43 runfn[group] = append(runfn[group], fn)
49 func RunDefer(groups ...string) bool {
51 groups = append(groups, "")
55 for _, group := range groups {
56 runfn_ = append(runfn_, runfn[group]...)
60 for _, fn := range runfn_ {
66 func RandomSeed() int64 {
68 panic("random seed not initialized")
70 return config.GinkgoConfig.RandomSeed
73 func NewRand() *rand.Rand {
74 return rand.New(rand.NewSource(RandomSeed()))
77 var cmp = comparer.DefaultComparer
79 func BytesSeparator(a, b []byte) []byte {
80 if bytes.Equal(a, b) {
87 for ; i < n && (a[i] == b[i]); i++ {
89 x := append([]byte{}, a[:i]...)
91 if c := a[i] + 1; c < b[i] {
97 for ; i < len(a); i++ {
98 if c := a[i]; c < 0xff {
104 if len(b) > i && b[i] > 0 {
105 return append(x, b[i]-1)
107 return append(x, 'x')
110 func BytesAfter(b []byte) []byte {
112 for _, c := range b {
114 return append(x, c+1)
119 return append(x, 'x')
122 func RandomIndex(rnd *rand.Rand, n, round int, fn func(i int)) {
126 for x := 0; x < round; x++ {
132 func ShuffledIndex(rnd *rand.Rand, n, round int, fn func(i int)) {
136 for x := 0; x < round; x++ {
137 for _, i := range rnd.Perm(n) {
144 func RandomRange(rnd *rand.Rand, n, round int, fn func(start, limit int)) {
148 for x := 0; x < round; x++ {
151 if j := n - start; j > 0 {
154 fn(start, start+length)
159 func Max(x, y int) int {
166 func Min(x, y int) int {