...

Source file src/github.com/syndtr/goleveldb/leveldb/testutil/util.go

Documentation: github.com/syndtr/goleveldb/leveldb/testutil

     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/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