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  }