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}