177 lines
3.3 KiB
Go
177 lines
3.3 KiB
Go
|
package usecase
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"log/slog"
|
||
|
"math/big"
|
||
|
"math/rand"
|
||
|
"slices"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/optclblast/blk/internal/entities"
|
||
|
)
|
||
|
|
||
|
func TestAddressWithBiggestDelta(t *testing.T) {
|
||
|
ethInteractor := ðInteractor{log: slog.Default()}
|
||
|
|
||
|
for _, tc := range tests {
|
||
|
t.Run(tc.Title, func(t *testing.T) {
|
||
|
txCh := make(chan *entities.Transaction, len(tc.Block.Transactions))
|
||
|
|
||
|
for _, txs := range tc.Block.Transactions {
|
||
|
txCh <- txs
|
||
|
}
|
||
|
|
||
|
close(txCh)
|
||
|
|
||
|
walletAddr, err := ethInteractor.addressWithBiggestDelta(context.TODO(), txCh)
|
||
|
if err != nil {
|
||
|
t.Fatalf("error: %s\n", err.Error())
|
||
|
}
|
||
|
|
||
|
if !slices.Contains(tc.ExpectedResult, walletAddr) {
|
||
|
t.Fatalf("invalid result: %s | Expected: %v", walletAddr, tc.ExpectedResult)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkAddressWithBiggestDelta(b *testing.B) {
|
||
|
ethInteractor := ðInteractor{log: slog.Default()}
|
||
|
|
||
|
txs := make([]*entities.Transaction, 20000)
|
||
|
|
||
|
for i := 0; i < 20000; i++ {
|
||
|
txs[i] = &entities.Transaction{
|
||
|
Value: big.NewInt(rand.Int63()),
|
||
|
From: RandStringRunes(rand.Intn(1000)),
|
||
|
To: RandStringRunes(rand.Intn(1000)),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
txCh := make(chan *entities.Transaction, len(txs))
|
||
|
|
||
|
for _, txs := range txs {
|
||
|
txCh <- txs
|
||
|
}
|
||
|
|
||
|
close(txCh)
|
||
|
|
||
|
_, err := ethInteractor.addressWithBiggestDelta(context.TODO(), txCh)
|
||
|
if err != nil {
|
||
|
b.Fatalf("error: %s\n", err.Error())
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
||
|
|
||
|
func RandStringRunes(n int) string {
|
||
|
b := make([]rune, n)
|
||
|
|
||
|
for i := range b {
|
||
|
b[i] = letterRunes[rand.Intn(len(letterRunes))]
|
||
|
}
|
||
|
|
||
|
return string(b)
|
||
|
}
|
||
|
|
||
|
type TestCase struct {
|
||
|
Title string
|
||
|
Block *entities.Block
|
||
|
ExpectedResult []string
|
||
|
}
|
||
|
|
||
|
var tests []TestCase = []TestCase{
|
||
|
{
|
||
|
Title: "1 block, 3 wallets, 4 txs. Positive is the highest",
|
||
|
Block: &entities.Block{
|
||
|
Transactions: []*entities.Transaction{
|
||
|
{
|
||
|
From: "A",
|
||
|
To: "B", // + 1000
|
||
|
Value: big.NewInt(1000),
|
||
|
},
|
||
|
{
|
||
|
From: "F", // -90
|
||
|
To: "A", // -10
|
||
|
Value: big.NewInt(1000),
|
||
|
},
|
||
|
{
|
||
|
From: "A",
|
||
|
To: "B", // +10
|
||
|
Value: big.NewInt(10),
|
||
|
},
|
||
|
{
|
||
|
From: "A",
|
||
|
To: "B", // +15
|
||
|
Value: big.NewInt(15),
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
ExpectedResult: []string{"B"},
|
||
|
},
|
||
|
{
|
||
|
Title: "1 block, 0 wallets, 0 txs",
|
||
|
Block: &entities.Block{
|
||
|
Transactions: []*entities.Transaction{},
|
||
|
},
|
||
|
ExpectedResult: []string{""},
|
||
|
},
|
||
|
{
|
||
|
Title: "1 block, 3 wallets, 3 txs. Txs are negative",
|
||
|
Block: &entities.Block{
|
||
|
Transactions: []*entities.Transaction{
|
||
|
{
|
||
|
From: "A",
|
||
|
To: "B",
|
||
|
Value: big.NewInt(-10),
|
||
|
},
|
||
|
{
|
||
|
From: "A",
|
||
|
To: "B",
|
||
|
Value: big.NewInt(-1000),
|
||
|
},
|
||
|
{
|
||
|
From: "F",
|
||
|
To: "A",
|
||
|
Value: big.NewInt(-1000),
|
||
|
},
|
||
|
{
|
||
|
From: "A",
|
||
|
To: "B",
|
||
|
Value: big.NewInt(-15),
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
ExpectedResult: []string{"B"},
|
||
|
},
|
||
|
{
|
||
|
Title: "1 block, 2 wallets, 3 txs. Both are equal",
|
||
|
Block: &entities.Block{
|
||
|
Transactions: []*entities.Transaction{
|
||
|
{
|
||
|
From: "A",
|
||
|
To: "B",
|
||
|
Value: big.NewInt(-10),
|
||
|
},
|
||
|
{
|
||
|
From: "A",
|
||
|
To: "B",
|
||
|
Value: big.NewInt(50),
|
||
|
},
|
||
|
{
|
||
|
From: "B",
|
||
|
To: "A",
|
||
|
Value: big.NewInt(10),
|
||
|
},
|
||
|
{
|
||
|
From: "A",
|
||
|
To: "B",
|
||
|
Value: big.NewInt(-15),
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
ExpectedResult: []string{"B", "A"},
|
||
|
},
|
||
|
}
|