github.com/evolutionlandorg/raffle/algorithm@v0.0.0-20210909083243-054e780956f1/raffle/raffle_test.go (about) 1 package raffle 2 3 import ( 4 "encoding/csv" 5 "fmt" 6 "io" 7 "log" 8 "math/big" 9 "math/rand" 10 "os" 11 "strings" 12 "testing" 13 "time" 14 15 "github.com/emirpasic/gods/maps/treemap" 16 "github.com/evolutionlandorg/raffle/algorithm/comparator" 17 ) 18 19 func init() { 20 rand.Seed(time.Now().UTC().UnixNano()) 21 22 } 23 24 func testTreeMap(t *testing.T) { 25 m := treemap.NewWith(comparator.BigIntComparator) 26 m.Put(big.NewInt(1), "a") 27 m.Put(big.NewInt(3), "b") 28 m.Put(big.NewInt(6), "c") 29 // (0, 1] (1, 3] (3, 6] 30 // k0, v0 := m.Ceiling(big.NewInt(0)) 31 _, v1 := m.Ceiling(big.NewInt(1)) 32 if actualValue, expectedValue := v1, 'a'; actualValue != expectedValue { 33 t.Errorf("Got %v expected %v", actualValue, expectedValue) 34 } 35 _, v2 := m.Ceiling(big.NewInt(2)) 36 if actualValue, expectedValue := v2, 'b'; actualValue != expectedValue { 37 t.Errorf("Got %v expected %v", actualValue, expectedValue) 38 } 39 _, v3 := m.Ceiling(big.NewInt(3)) 40 if actualValue, expectedValue := v3, 'b'; actualValue != expectedValue { 41 t.Errorf("Got %v expected %v", actualValue, expectedValue) 42 } 43 _, v4 := m.Ceiling(big.NewInt(4)) 44 if actualValue, expectedValue := v4, 'c'; actualValue != expectedValue { 45 t.Errorf("Got %v expected %v", actualValue, expectedValue) 46 } 47 _, v5 := m.Ceiling(big.NewInt(5)) 48 if actualValue, expectedValue := v5, 'c'; actualValue != expectedValue { 49 t.Errorf("Got %v expected %v", actualValue, expectedValue) 50 } 51 _, v6 := m.Ceiling(big.NewInt(6)) 52 if actualValue, expectedValue := v6, 'c'; actualValue != expectedValue { 53 t.Errorf("Got %v expected %v", actualValue, expectedValue) 54 } 55 // k7, v7 := m.Ceiling(big.NewInt(7)) 56 } 57 58 func readCsvFile(filePath string) map[int]string { 59 f, err := os.Open(filePath) 60 if err != nil { 61 log.Fatal("Unable to read input file "+filePath, err) 62 } 63 defer f.Close() 64 65 r := csv.NewReader(f) 66 count := 0 67 m := make(map[int]string) 68 for { 69 record, err := r.Read() 70 if err == io.EOF { 71 break 72 } 73 74 if err != nil { 75 panic(err) 76 } 77 for value := range record { 78 m[count] = record[value] 79 } 80 count++ 81 } 82 83 return m 84 } 85 86 func U256(v string) *big.Int { 87 v = strings.TrimPrefix(v, "0x") 88 bn := new(big.Int) 89 n, _ := bn.SetString(v, 16) 90 return n 91 } 92 93 func TestRaffle(t *testing.T) { 94 tickets := []*Ticket{ 95 NewTicket("0x1111111111111111111111111111111111111111", new(big.Int).Mul(big.NewInt(1), big.NewInt(1e18))), 96 NewTicket("0x2222222222222222222222222222222222222222", new(big.Int).Mul(big.NewInt(2), big.NewInt(1e18))), 97 NewTicket("0x3333333333333333333333333333333333333333", new(big.Int).Mul(big.NewInt(3), big.NewInt(1e18))), 98 NewTicket("0x4444444444444444444444444444444444444444", new(big.Int).Mul(big.NewInt(4), big.NewInt(1e18))), 99 } 100 hashs := []*big.Int{ 101 U256("0x0000051d10559b5907127a70bc89d6ac20ad6204b865a862063a4b0d1095ae60"), 102 U256("0x0000067182592e2885dd120d0b6212c254c861b9cd2b5c97bb594b36133eb54c"), 103 } 104 l, _ := NewLottery(tickets, hashs, 2) 105 l.Pick() 106 fmt.Println(l.Luckers()) 107 } 108 109 // go test -v -test.bench=".*" 110 func BenchmarkPick(b *testing.B) { 111 tickets := []*Ticket{ 112 NewTicket("0x1111111111111111111111111111111111111111", new(big.Int).Mul(big.NewInt(1), big.NewInt(1e18))), 113 NewTicket("0x2222222222222222222222222222222222222222", new(big.Int).Mul(big.NewInt(2), big.NewInt(1e18))), 114 NewTicket("0x3333333333333333333333333333333333333333", new(big.Int).Mul(big.NewInt(3), big.NewInt(1e18))), 115 NewTicket("0x4444444444444444444444444444444444444444", new(big.Int).Mul(big.NewInt(4), big.NewInt(1e18))), 116 } 117 mm := readCsvFile("../csv/query_result.csv") 118 m := make(map[string]int) 119 for i := 0; i < 1000000; i++ { 120 hashs := []*big.Int{ 121 U256(mm[i]), 122 } 123 l, _ := NewLottery(tickets, hashs, 1) 124 l.Pick() 125 for _, addr := range l.Luckers() { 126 m[addr]++ 127 } 128 } 129 fmt.Println(m) 130 }