7 "github.com/vapor/errors"
8 "github.com/vapor/protocol/bc"
9 "github.com/vapor/protocol/bc/types"
10 "github.com/vapor/protocol/vm"
13 func TestCheckOutput(t *testing.T) {
14 tx := types.NewTx(types.TxData{
15 Inputs: []*types.TxInput{
16 types.NewSpendInput(nil, bc.Hash{}, bc.NewAssetID([32]byte{1}), 5, 1, []byte("spendprog")),
18 Outputs: []*types.TxOutput{
19 types.NewIntraChainOutput(bc.NewAssetID([32]byte{3}), 8, []byte("wrongprog")),
20 types.NewIntraChainOutput(bc.NewAssetID([32]byte{3}), 8, []byte("controlprog")),
21 types.NewIntraChainOutput(bc.NewAssetID([32]byte{2}), 8, []byte("controlprog")),
22 types.NewIntraChainOutput(bc.NewAssetID([32]byte{2}), 7, []byte("controlprog")),
23 types.NewIntraChainOutput(bc.NewAssetID([32]byte{2}), 7, []byte("controlprog")),
27 txCtx := &entryContext{
28 entry: tx.Tx.Entries[tx.Tx.InputIDs[0]],
29 entries: tx.Tx.Entries,
33 // args to CheckOutput
46 assetID: append([]byte{2}, make([]byte, 31)...),
48 code: []byte("controlprog"),
54 assetID: append([]byte{2}, make([]byte, 31)...),
56 code: []byte("controlprog"),
62 assetID: append([]byte{9}, make([]byte, 31)...),
64 code: []byte("missingprog"),
70 assetID: append([]byte{2}, make([]byte, 31)...),
72 code: []byte("controlprog"),
73 wantErr: vm.ErrBadValue,
77 for i, test := range cases {
78 t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) {
79 gotOk, err := txCtx.checkOutput(test.index, test.amount, test.assetID, test.vmVersion, test.code, false)
80 if g := errors.Root(err); g != test.wantErr {
81 t.Errorf("checkOutput(%v, %v, %x, %v, %x) err = %v, want %v", test.index, test.amount, test.assetID, test.vmVersion, test.code, g, test.wantErr)
84 if gotOk != test.wantOk {
85 t.Errorf("checkOutput(%v, %v, %x, %v, %x) ok = %t, want %v", test.index, test.amount, test.assetID, test.vmVersion, test.code, gotOk, test.wantOk)