12 func TestParseOp(t *testing.T) {
19 prog: []byte{byte(OP_ADD)},
20 want: Instruction{Op: OP_ADD, Len: 1},
22 prog: []byte{byte(OP_16)},
23 want: Instruction{Op: OP_16, Data: []byte{16}, Len: 1},
25 prog: []byte{byte(OP_DATA_5), 1, 1, 1, 1, 1},
26 want: Instruction{Op: OP_DATA_5, Data: []byte{1, 1, 1, 1, 1}, Len: 6},
28 prog: []byte{byte(OP_DATA_5), 1, 1, 1, 1, 1, 255},
29 want: Instruction{Op: OP_DATA_5, Data: []byte{1, 1, 1, 1, 1}, Len: 6},
31 prog: []byte{byte(OP_PUSHDATA1), 1, 1},
32 want: Instruction{Op: OP_PUSHDATA1, Data: []byte{1}, Len: 3},
34 prog: []byte{byte(OP_PUSHDATA1), 1, 1, 255},
35 want: Instruction{Op: OP_PUSHDATA1, Data: []byte{1}, Len: 3},
37 prog: []byte{byte(OP_PUSHDATA2), 1, 0, 1},
38 want: Instruction{Op: OP_PUSHDATA2, Data: []byte{1}, Len: 4},
40 prog: []byte{byte(OP_PUSHDATA2), 1, 0, 1, 255},
41 want: Instruction{Op: OP_PUSHDATA2, Data: []byte{1}, Len: 4},
43 prog: []byte{byte(OP_PUSHDATA4), 1, 0, 0, 0, 1},
44 want: Instruction{Op: OP_PUSHDATA4, Data: []byte{1}, Len: 6},
46 prog: []byte{byte(OP_PUSHDATA4), 1, 0, 0, 0, 1, 255},
47 want: Instruction{Op: OP_PUSHDATA4, Data: []byte{1}, Len: 6},
50 wantErr: ErrShortProgram,
52 prog: []byte{byte(OP_0)},
54 wantErr: ErrShortProgram,
56 prog: []byte{byte(OP_DATA_1)},
57 wantErr: ErrShortProgram,
59 prog: []byte{byte(OP_PUSHDATA1)},
60 wantErr: ErrShortProgram,
62 prog: []byte{byte(OP_PUSHDATA1), 1},
63 wantErr: ErrShortProgram,
65 prog: []byte{byte(OP_PUSHDATA2)},
66 wantErr: ErrShortProgram,
68 prog: []byte{byte(OP_PUSHDATA2), 1, 0},
69 wantErr: ErrShortProgram,
71 prog: []byte{byte(OP_PUSHDATA4)},
72 wantErr: ErrShortProgram,
74 prog: []byte{byte(OP_PUSHDATA4), 1, 0, 0, 0},
75 wantErr: ErrShortProgram,
78 prog: []byte{0x6d, 0x6b, 0xaa, 0x20, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30},
79 wantErr: checked.ErrOverflow,
82 for _, c := range cases {
83 t.Run(fmt.Sprintf("%d: %x", c.pc, c.prog), func(t *testing.T) {
84 got, gotErr := ParseOp(c.prog, c.pc)
86 if errors.Root(gotErr) != c.wantErr {
87 t.Errorf("ParseOp(%x, %d) error = %v want %v", c.prog, c.pc, gotErr, c.wantErr)
94 if !testutil.DeepEqual(got, c.want) {
95 t.Errorf("ParseOp(%x, %d) = %+v want %+v", c.prog, c.pc, got, c.want)
101 func TestParseProgram(t *testing.T) {
108 prog: []byte{byte(OP_2), byte(OP_3), byte(OP_ADD), byte(OP_5), byte(OP_NUMEQUAL)},
110 {Op: OP_2, Data: []byte{0x02}, Len: 1},
111 {Op: OP_3, Data: []byte{0x03}, Len: 1},
112 {Op: OP_ADD, Len: 1},
113 {Op: OP_5, Data: []byte{0x05}, Len: 1},
114 {Op: OP_NUMEQUAL, Len: 1},
125 for _, c := range cases {
126 got, gotErr := ParseProgram(c.prog)
128 if errors.Root(gotErr) != c.wantErr {
129 t.Errorf("ParseProgram(%x) error = %v want %v", c.prog, gotErr, c.wantErr)
132 if c.wantErr != nil {
136 if !testutil.DeepEqual(got, c.want) {
137 t.Errorf("ParseProgram(%x) = %+v want %+v", c.prog, got, c.want)