OSDN Git Service

modify MergeSpendAction order by origin action list (#1048)
[bytom/bytom.git] / account / builder_test.go
1 package account
2
3 import (
4         "testing"
5
6         "github.com/bytom/blockchain/txbuilder"
7         "github.com/bytom/protocol/bc"
8 )
9
10 func TestMergeSpendAction(t *testing.T) {
11         testBTM := &bc.AssetID{}
12         if err := testBTM.UnmarshalText([]byte("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")); err != nil {
13                 t.Fatal(err)
14         }
15
16         testAssetID1 := &bc.AssetID{}
17         if err := testAssetID1.UnmarshalText([]byte("50ec80b6bc48073f6aa8fa045131a71213c33f3681203b15ddc2e4b81f1f4730")); err != nil {
18                 t.Fatal(err)
19         }
20
21         testAssetID2 := &bc.AssetID{}
22         if err := testAssetID2.UnmarshalText([]byte("43c6946d092b2959c1a82e90b282c68fca63e66de289048f6acd6cea9383c79c")); err != nil {
23                 t.Fatal(err)
24         }
25
26         cases := []struct {
27                 testActions     []txbuilder.Action
28                 wantActions     []txbuilder.Action
29                 testActionCount int
30                 wantActionCount int
31         }{
32                 {
33                         testActions: []txbuilder.Action{
34                                 txbuilder.Action(&spendAction{
35                                         AssetAmount: bc.AssetAmount{
36                                                 AssetId: testBTM,
37                                                 Amount:  100,
38                                         },
39                                         AccountID: "test_account",
40                                 }),
41                                 txbuilder.Action(&spendAction{
42                                         AssetAmount: bc.AssetAmount{
43                                                 AssetId: testBTM,
44                                                 Amount:  200,
45                                         },
46                                         AccountID: "test_account",
47                                 }),
48                                 txbuilder.Action(&spendAction{
49                                         AssetAmount: bc.AssetAmount{
50                                                 AssetId: testBTM,
51                                                 Amount:  300,
52                                         },
53                                         AccountID: "test_account",
54                                 }),
55                                 txbuilder.Action(&spendAction{
56                                         AssetAmount: bc.AssetAmount{
57                                                 AssetId: testAssetID1,
58                                                 Amount:  300,
59                                         },
60                                         AccountID: "test_account",
61                                 }),
62                         },
63                         wantActions: []txbuilder.Action{
64                                 txbuilder.Action(&spendAction{
65                                         AssetAmount: bc.AssetAmount{
66                                                 AssetId: testBTM,
67                                                 Amount:  600,
68                                         },
69                                         AccountID: "test_account",
70                                 }),
71                                 txbuilder.Action(&spendAction{
72                                         AssetAmount: bc.AssetAmount{
73                                                 AssetId: testAssetID1,
74                                                 Amount:  300,
75                                         },
76                                         AccountID: "test_account",
77                                 }),
78                         },
79                         testActionCount: 4,
80                         wantActionCount: 2,
81                 },
82                 {
83                         testActions: []txbuilder.Action{
84                                 txbuilder.Action(&spendAction{
85                                         AssetAmount: bc.AssetAmount{
86                                                 AssetId: testBTM,
87                                                 Amount:  100,
88                                         },
89                                         AccountID: "test_account",
90                                 }),
91                                 txbuilder.Action(&spendAction{
92                                         AssetAmount: bc.AssetAmount{
93                                                 AssetId: testAssetID1,
94                                                 Amount:  200,
95                                         },
96                                         AccountID: "test_account",
97                                 }),
98                                 txbuilder.Action(&spendAction{
99                                         AssetAmount: bc.AssetAmount{
100                                                 AssetId: testBTM,
101                                                 Amount:  500,
102                                         },
103                                         AccountID: "test_account",
104                                 }),
105                                 txbuilder.Action(&spendAction{
106                                         AssetAmount: bc.AssetAmount{
107                                                 AssetId: testAssetID1,
108                                                 Amount:  300,
109                                         },
110                                         AccountID: "test_account",
111                                 }),
112                         },
113                         wantActions: []txbuilder.Action{
114                                 txbuilder.Action(&spendAction{
115                                         AssetAmount: bc.AssetAmount{
116                                                 AssetId: testBTM,
117                                                 Amount:  600,
118                                         },
119                                         AccountID: "test_account",
120                                 }),
121                                 txbuilder.Action(&spendAction{
122                                         AssetAmount: bc.AssetAmount{
123                                                 AssetId: testAssetID1,
124                                                 Amount:  500,
125                                         },
126                                         AccountID: "test_account",
127                                 }),
128                         },
129                         testActionCount: 4,
130                         wantActionCount: 2,
131                 },
132                 {
133                         testActions: []txbuilder.Action{
134                                 txbuilder.Action(&spendAction{
135                                         AssetAmount: bc.AssetAmount{
136                                                 AssetId: testBTM,
137                                                 Amount:  100,
138                                         },
139                                         AccountID: "test_account",
140                                 }),
141                                 txbuilder.Action(&spendAction{
142                                         AssetAmount: bc.AssetAmount{
143                                                 AssetId: testAssetID1,
144                                                 Amount:  200,
145                                         },
146                                         AccountID: "test_account",
147                                 }),
148                                 txbuilder.Action(&spendAction{
149                                         AssetAmount: bc.AssetAmount{
150                                                 AssetId: testAssetID2,
151                                                 Amount:  300,
152                                         },
153                                         AccountID: "test_account",
154                                 }),
155                                 txbuilder.Action(&spendAction{
156                                         AssetAmount: bc.AssetAmount{
157                                                 AssetId: testAssetID1,
158                                                 Amount:  300,
159                                         },
160                                         AccountID: "test_account",
161                                 }),
162                                 txbuilder.Action(&spendAction{
163                                         AssetAmount: bc.AssetAmount{
164                                                 AssetId: testAssetID2,
165                                                 Amount:  500,
166                                         },
167                                         AccountID: "test_account",
168                                 }),
169                         },
170                         wantActions: []txbuilder.Action{
171                                 txbuilder.Action(&spendAction{
172                                         AssetAmount: bc.AssetAmount{
173                                                 AssetId: testBTM,
174                                                 Amount:  100,
175                                         },
176                                         AccountID: "test_account",
177                                 }),
178                                 txbuilder.Action(&spendAction{
179                                         AssetAmount: bc.AssetAmount{
180                                                 AssetId: testAssetID1,
181                                                 Amount:  500,
182                                         },
183                                         AccountID: "test_account",
184                                 }),
185                                 txbuilder.Action(&spendAction{
186                                         AssetAmount: bc.AssetAmount{
187                                                 AssetId: testAssetID2,
188                                                 Amount:  800,
189                                         },
190                                         AccountID: "test_account",
191                                 }),
192                         },
193                         testActionCount: 5,
194                         wantActionCount: 3,
195                 },
196                 {
197                         testActions: []txbuilder.Action{
198                                 txbuilder.Action(&spendAction{
199                                         AssetAmount: bc.AssetAmount{
200                                                 AssetId: testBTM,
201                                                 Amount:  100,
202                                         },
203                                         AccountID: "test_account",
204                                 }),
205                                 txbuilder.Action(&spendAction{
206                                         AssetAmount: bc.AssetAmount{
207                                                 AssetId: testBTM,
208                                                 Amount:  200,
209                                         },
210                                         AccountID: "test_account1",
211                                 }),
212                                 txbuilder.Action(&spendAction{
213                                         AssetAmount: bc.AssetAmount{
214                                                 AssetId: testBTM,
215                                                 Amount:  500,
216                                         },
217                                         AccountID: "test_account",
218                                 }),
219                                 txbuilder.Action(&spendAction{
220                                         AssetAmount: bc.AssetAmount{
221                                                 AssetId: testAssetID1,
222                                                 Amount:  300,
223                                         },
224                                         AccountID: "test_account1",
225                                 }),
226                         },
227                         wantActions: []txbuilder.Action{
228                                 txbuilder.Action(&spendAction{
229                                         AssetAmount: bc.AssetAmount{
230                                                 AssetId: testBTM,
231                                                 Amount:  600,
232                                         },
233                                         AccountID: "test_account",
234                                 }),
235                                 txbuilder.Action(&spendAction{
236                                         AssetAmount: bc.AssetAmount{
237                                                 AssetId: testBTM,
238                                                 Amount:  200,
239                                         },
240                                         AccountID: "test_account1",
241                                 }),
242                                 txbuilder.Action(&spendAction{
243                                         AssetAmount: bc.AssetAmount{
244                                                 AssetId: testAssetID1,
245                                                 Amount:  300,
246                                         },
247                                         AccountID: "test_account1",
248                                 }),
249                         },
250                         testActionCount: 4,
251                         wantActionCount: 3,
252                 },
253                 {
254                         testActions: []txbuilder.Action{
255                                 txbuilder.Action(&spendUTXOAction{
256                                         OutputID: &bc.Hash{V0: 128},
257                                 }),
258                                 txbuilder.Action(&spendAction{
259                                         AssetAmount: bc.AssetAmount{
260                                                 AssetId: testBTM,
261                                                 Amount:  100,
262                                         },
263                                         AccountID: "test_account",
264                                 }),
265                                 txbuilder.Action(&spendAction{
266                                         AssetAmount: bc.AssetAmount{
267                                                 AssetId: testAssetID1,
268                                                 Amount:  200,
269                                         },
270                                         AccountID: "test_account1",
271                                 }),
272                                 txbuilder.Action(&spendUTXOAction{
273                                         OutputID: &bc.Hash{V0: 256},
274                                 }),
275                                 txbuilder.Action(&spendAction{
276                                         AssetAmount: bc.AssetAmount{
277                                                 AssetId: testAssetID2,
278                                                 Amount:  300,
279                                         },
280                                         AccountID: "test_account2",
281                                 }),
282                         },
283                         wantActions: []txbuilder.Action{
284                                 txbuilder.Action(&spendUTXOAction{
285                                         OutputID: &bc.Hash{V0: 128},
286                                 }),
287                                 txbuilder.Action(&spendAction{
288                                         AssetAmount: bc.AssetAmount{
289                                                 AssetId: testBTM,
290                                                 Amount:  100,
291                                         },
292                                         AccountID: "test_account",
293                                 }),
294                                 txbuilder.Action(&spendAction{
295                                         AssetAmount: bc.AssetAmount{
296                                                 AssetId: testAssetID1,
297                                                 Amount:  200,
298                                         },
299                                         AccountID: "test_account1",
300                                 }),
301                                 txbuilder.Action(&spendUTXOAction{
302                                         OutputID: &bc.Hash{V0: 256},
303                                 }),
304                                 txbuilder.Action(&spendAction{
305                                         AssetAmount: bc.AssetAmount{
306                                                 AssetId: testAssetID2,
307                                                 Amount:  300,
308                                         },
309                                         AccountID: "test_account2",
310                                 }),
311                         },
312                         testActionCount: 5,
313                         wantActionCount: 5,
314                 },
315         }
316
317         for _, c := range cases {
318                 gotActions := MergeSpendAction(c.testActions)
319
320                 gotMap := make(map[string]uint64)
321                 wantMap := make(map[string]uint64)
322                 for _, got := range gotActions {
323                         switch got := got.(type) {
324                         case *spendAction:
325                                 gotKey := got.AssetId.String() + got.AccountID
326                                 gotMap[gotKey] = got.Amount
327                         default:
328                                 continue
329                         }
330                 }
331
332                 for _, want := range c.wantActions {
333                         switch want := want.(type) {
334                         case *spendAction:
335                                 wantKey := want.AssetId.String() + want.AccountID
336                                 wantMap[wantKey] = want.Amount
337                         default:
338                                 continue
339                         }
340                 }
341
342                 for key := range gotMap {
343                         if gotMap[key] != wantMap[key] {
344                                 t.Fatalf("gotMap[%s]=%v, wantMap[%s]=%v", key, gotMap[key], key, wantMap[key])
345                         }
346                 }
347
348                 if len(gotActions) != c.wantActionCount {
349                         t.Fatalf("number of gotActions=%d, wantActions=%d", len(gotActions), c.wantActionCount)
350                 }
351         }
352 }