8 "github.com/davecgh/go-spew/spew"
10 "github.com/bytom/bytom/consensus"
11 "github.com/bytom/bytom/protocol/bc"
12 "github.com/bytom/bytom/testutil"
15 func TestMapSpendTx(t *testing.T) {
19 NewSpendInput(nil, testutil.MustDecodeHash("fad5195a0c8e3b590b86a3c0a95e7529565888508aecca96e9aeda633002f409"), *consensus.BTMAssetID, 88, 3, []byte{1}, [][]byte{[]byte{2}}),
22 NewOriginalTxOutput(*consensus.BTMAssetID, 80, []byte{1}, [][]byte{[]byte{2}}),
27 NewIssuanceInput([]byte("nonce"), 254354, []byte("issuanceProgram"), [][]byte{[]byte("arguments1"), []byte("arguments2")}, []byte("assetDefinition")),
30 NewOriginalTxOutput(*consensus.BTMAssetID, 80, []byte{1}, [][]byte{[]byte{2}}),
35 NewIssuanceInput([]byte("nonce"), 254354, []byte("issuanceProgram"), [][]byte{[]byte("arguments1"), []byte("arguments2")}, []byte("assetDefinition")),
36 NewSpendInput(nil, testutil.MustDecodeHash("db7b16ac737440d6e38559996ddabb207d7ce84fbd6f3bfd2525d234761dc863"), *consensus.BTMAssetID, 88, 3, []byte{1}, [][]byte{[]byte{2}}),
39 NewOriginalTxOutput(*consensus.BTMAssetID, 80, []byte{1}, [][]byte{[]byte{2}}),
40 NewOriginalTxOutput(*consensus.BTMAssetID, 80, []byte{1}, [][]byte{[]byte{2}}),
45 for _, txData := range cases {
47 if len(tx.ResultIds) != len(txData.Outputs) {
48 t.Errorf("ResultIds contains %d item(s), expected %d", len(tx.ResultIds), len(txData.Outputs))
51 for i, oldIn := range txData.Inputs {
52 resultEntry, ok := tx.Entries[tx.InputIDs[i]]
54 t.Errorf("entryMap contains nothing for tx.InputIDs[%d] (%x)", i, tx.InputIDs[i].Bytes())
56 switch newInput := resultEntry.(type) {
58 if *newInput.Value.AssetId != oldIn.AssetID() || newInput.Value.Amount != oldIn.Amount() {
59 t.Errorf("tx.InputIDs[%d]'s asset amount is not equal after map'", i)
62 spendOut, err := tx.Output(*newInput.SpentOutputId)
66 if *spendOut.Source.Value != oldIn.AssetAmount() {
67 t.Errorf("tx.InputIDs[%d]'s asset amount is not equal after map'", i)
70 t.Errorf("unexpect input type")
74 for i, oldOut := range txData.Outputs {
75 resultEntry, ok := tx.Entries[*tx.ResultIds[i]]
77 t.Errorf("entryMap contains nothing for header.ResultIds[%d] (%x)", i, tx.ResultIds[i].Bytes())
79 newOut, ok := resultEntry.(*bc.Output)
81 t.Errorf("header.ResultIds[%d] has type %T, expected *Output", i, resultEntry)
84 if *newOut.Source.Value != oldOut.AssetAmount {
85 t.Errorf("header.ResultIds[%d].(*output).Source is %v, expected %v", i, newOut.Source.Value, oldOut.AssetAmount)
87 if newOut.ControlProgram.VmVersion != 1 {
88 t.Errorf("header.ResultIds[%d].(*output).ControlProgram.VMVersion is %d, expected 1", i, newOut.ControlProgram.VmVersion)
90 if !bytes.Equal(newOut.ControlProgram.Code, oldOut.ControlProgram) {
91 t.Errorf("header.ResultIds[%d].(*output).ControlProgram.Code is %x, expected %x", i, newOut.ControlProgram.Code, oldOut.ControlProgram)
93 if !reflect.DeepEqual(newOut.StateData.StateData, oldOut.StateData) {
94 t.Errorf("header.ResultIds[%d].(*output).StateData.StateData is %x, expected %x", i, newOut.StateData.StateData, oldOut.StateData)
101 func TestMapCoinbaseTx(t *testing.T) {
104 NewCoinbaseInput([]byte("TestMapCoinbaseTx")),
106 Outputs: []*TxOutput{
107 NewOriginalTxOutput(*consensus.BTMAssetID, 800000000000, []byte{1}, [][]byte{[]byte{2}}),
110 oldOut := txData.Outputs[0]
113 t.Log(spew.Sdump(tx.Entries))
115 if len(tx.InputIDs) != 1 {
116 t.Errorf("expect to only have coinbase input id")
118 if len(tx.SpentOutputIDs) != 0 {
119 t.Errorf("coinbase tx doesn't spend any utxo")
121 if len(tx.GasInputIDs) != 1 {
122 t.Errorf("coinbase tx should have 1 gas input")
124 if len(tx.ResultIds) != 1 {
125 t.Errorf("expect to only have one output")
128 outEntry, ok := tx.Entries[*tx.ResultIds[0]]
130 t.Errorf("entryMap contains nothing for output")
132 newOut, ok := outEntry.(*bc.Output)
134 t.Errorf("header.ResultIds[0] has type %T, expected *Output", outEntry)
136 if *newOut.Source.Value != oldOut.AssetAmount {
137 t.Errorf("(*output).Source is %v, expected %v", newOut.Source.Value, oldOut.AssetAmount)
140 muxEntry, ok := tx.Entries[*newOut.Source.Ref]
142 t.Errorf("entryMap contains nothing for mux")
144 mux, ok := muxEntry.(*bc.Mux)
146 t.Errorf("muxEntry has type %T, expected *Mux", muxEntry)
148 if *mux.WitnessDestinations[0].Value != *newOut.Source.Value {
149 t.Errorf("(*Mux).Destinations is %v, expected %v", *mux.WitnessDestinations[0].Value, *newOut.Source.Value)
152 coinbaseEntry, ok := tx.Entries[tx.InputIDs[0]]
154 t.Errorf("entryMap contains nothing for coinbase input")
156 coinbase, ok := coinbaseEntry.(*bc.Coinbase)
158 t.Errorf("inputEntry has type %T, expected *Coinbase", coinbaseEntry)
160 if coinbase.WitnessDestination.Value != mux.Sources[0].Value {
161 t.Errorf("(*Coinbase).Destination is %v, expected %v", coinbase.WitnessDestination.Value, *mux.Sources[0].Value)