arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/test/lang_test.go
test/lang_test.goRaw
  1package test
  2
  3import (
  4	"fmt"
  5	"strings"
  6	"testing"
  7
  8	"github.com/stretchr/testify/assert"
  9)
 10
 11var debug = false
 12
 13func TestParseBlockchainTxs(t *testing.T) {
 14	s := `
 15		// deposits
 16		Deposit(1) A: 10
 17		Deposit(2) A: 20
 18		Deposit(1) B: 5
 19		CreateAccountDeposit(1) C: 5
 20		CreateAccountDepositTransfer(1) D-A: 15, 10 (3)
 21
 22		// L2 transactions
 23		Transfer(1) A-B: 6 (1)
 24		Transfer(1) B-D: 3 (1)
 25
 26		// set new batch
 27		> batch
 28
 29		DepositTransfer(1) A-B: 15, 10 (1)
 30		Transfer(1) C-A : 3 (1)
 31		Transfer(2) A-B: 15 (1)
 32
 33		Deposit(1) User0: 20
 34		Deposit(3) User1: 20
 35		Transfer(1) User0-User1: 15 (1)
 36		Transfer(3) User1-User0: 15 (1)
 37
 38		> batch
 39
 40		Transfer(1) User1-User0: 1 (1)
 41
 42		> batch
 43		> block
 44
 45		// Exits
 46		Exit(1) A: 5
 47	`
 48
 49	parser := NewParser(strings.NewReader(s))
 50	instructions, err := parser.Parse()
 51	assert.Nil(t, err)
 52	assert.Equal(t, 20, len(instructions.Instructions))
 53	assert.Equal(t, 10, len(instructions.Accounts))
 54	assert.Equal(t, 3, len(instructions.TokenIDs))
 55
 56	if debug {
 57		fmt.Println(instructions)
 58		for _, instruction := range instructions.Instructions {
 59			fmt.Println(instruction.Raw())
 60		}
 61	}
 62
 63	assert.Equal(t, TypeNewBatch, instructions.Instructions[7].Type)
 64	assert.Equal(t, "Deposit(1)User0:20", instructions.Instructions[11].Raw())
 65	assert.Equal(t, "Type: DepositTransfer, From: A, To: B, LoadAmount: 15, Amount: 10, Fee: 1, TokenID: 1\n", instructions.Instructions[8].String())
 66	assert.Equal(t, "Type: Transfer, From: User1, To: User0, Amount: 15, Fee: 1, TokenID: 3\n", instructions.Instructions[14].String())
 67	assert.Equal(t, "Transfer(2)A-B:15(1)", instructions.Instructions[10].Raw())
 68	assert.Equal(t, "Type: Transfer, From: A, To: B, Amount: 15, Fee: 1, TokenID: 2\n", instructions.Instructions[10].String())
 69	assert.Equal(t, "Exit(1)A:5", instructions.Instructions[19].Raw())
 70	assert.Equal(t, "Type: Exit, From: A, Amount: 5, TokenID: 1\n", instructions.Instructions[19].String())
 71}
 72
 73func TestParsePoolTxs(t *testing.T) {
 74	s := `
 75		PoolTransfer(1) A-B: 6 (1)
 76		PoolTransfer(2) A-B: 3 (3)
 77		PoolTransfer(1) B-D: 3 (1)
 78		PoolTransfer(1) C-D: 3 (1)
 79		Exit(1) A: 5
 80	`
 81
 82	parser := NewParser(strings.NewReader(s))
 83	instructions, err := parser.Parse()
 84	assert.Nil(t, err)
 85	assert.Equal(t, 5, len(instructions.Instructions))
 86	assert.Equal(t, 6, len(instructions.Accounts))
 87	assert.Equal(t, 2, len(instructions.TokenIDs))
 88
 89	if debug {
 90		fmt.Println(instructions)
 91		for _, instruction := range instructions.Instructions {
 92			fmt.Println(instruction.Raw())
 93		}
 94	}
 95
 96	assert.Equal(t, "Transfer(1)A-B:6(1)", instructions.Instructions[0].Raw())
 97	assert.Equal(t, "Transfer(2)A-B:3(3)", instructions.Instructions[1].Raw())
 98	assert.Equal(t, "Transfer(1)B-D:3(1)", instructions.Instructions[2].Raw())
 99	assert.Equal(t, "Transfer(1)C-D:3(1)", instructions.Instructions[3].Raw())
100	assert.Equal(t, "Exit(1)A:5", instructions.Instructions[4].Raw())
101}
102
103func TestParseErrors(t *testing.T) {
104	s := "Deposit(1) A:: 10"
105	parser := NewParser(strings.NewReader(s))
106	_, err := parser.Parse()
107	assert.Equal(t, "error parsing line 0: Deposit(1)A:: 10, err: strconv.Atoi: parsing \":\": invalid syntax", err.Error())
108
109	s = "Deposit(1) A: 10 20"
110	parser = NewParser(strings.NewReader(s))
111	_, err = parser.Parse()
112	assert.Equal(t, "error parsing line 1: 20, err: Unexpected tx type: 20", err.Error())
113
114	s = "Transfer(1) A B: 10"
115	parser = NewParser(strings.NewReader(s))
116	_, err = parser.Parse()
117	assert.Equal(t, "error parsing line 0: Transfer(1)AB: 10, err: Expected ':', found 'B'", err.Error())
118
119	s = "Transfer(1) A-B: 10 (255)"
120	parser = NewParser(strings.NewReader(s))
121	_, err = parser.Parse()
122	assert.Nil(t, err)
123	s = "Transfer(1) A-B: 10 (256)"
124	parser = NewParser(strings.NewReader(s))
125	_, err = parser.Parse()
126	assert.Equal(t, "error parsing line 0: Transfer(1)A-B:10(256), err: Fee 256 can not be bigger than 255", err.Error())
127
128	s = "> btch"
129	parser = NewParser(strings.NewReader(s))
130	_, err = parser.Parse()
131	assert.Equal(t, "error parsing line 0: >, err: Unexpected '> btch', expected '> batch' or '> block'", err.Error())
132}