7 "github.com/bytom/bytom/testutil"
10 func TestPushdataOps(t *testing.T) {
11 type testStruct struct {
13 startVM *virtualMachine
15 wantVM *virtualMachine
17 cases := []testStruct{{
19 startVM: &virtualMachine{
21 dataStack: [][]byte{},
23 wantVM: &virtualMachine{
25 dataStack: [][]byte{{}},
29 startVM: &virtualMachine{
31 dataStack: [][]byte{},
33 wantErr: ErrRunLimitExceeded,
36 startVM: &virtualMachine{
38 dataStack: [][]byte{},
40 wantVM: &virtualMachine{
42 dataStack: [][]byte{Int64Bytes(-1)},
46 startVM: &virtualMachine{
48 dataStack: [][]byte{},
50 wantErr: ErrRunLimitExceeded,
53 pushdataops := []Op{OP_PUSHDATA1, OP_PUSHDATA2, OP_PUSHDATA4}
54 for i := 1; i <= 75; i++ {
55 pushdataops = append(pushdataops, Op(i))
57 for _, op := range pushdataops {
58 cases = append(cases, testStruct{
60 startVM: &virtualMachine{
62 dataStack: [][]byte{},
65 wantVM: &virtualMachine{
67 dataStack: [][]byte{[]byte("data")},
72 startVM: &virtualMachine{
74 dataStack: [][]byte{},
77 wantErr: ErrRunLimitExceeded,
81 pushops := append(pushdataops, OP_FALSE, OP_1NEGATE, OP_NOP)
82 for _, op := range pushops {
83 cases = append(cases, testStruct{
85 startVM: &virtualMachine{
87 dataStack: [][]byte{},
89 wantErr: ErrRunLimitExceeded,
93 for i, c := range cases {
94 err := ops[c.op].fn(c.startVM)
97 t.Errorf("case %d, op %s: got err = %v want %v", i, ops[c.op].name, err, c.wantErr)
100 if c.wantErr != nil {
104 if !testutil.DeepEqual(c.startVM, c.wantVM) {
105 t.Errorf("case %d, op %s: unexpected vm result\n\tgot: %+v\n\twant: %+v\n", i, ops[c.op].name, c.startVM, c.wantVM)
110 func TestPushDataBytes(t *testing.T) {
118 want: []byte{byte(OP_0)},
121 data: make([]byte, 255),
122 want: append([]byte{byte(OP_PUSHDATA1), 0xff}, make([]byte, 255)...),
125 data: make([]byte, 1<<8),
126 want: append([]byte{byte(OP_PUSHDATA2), 0, 1}, make([]byte, 1<<8)...),
129 data: make([]byte, 1<<16),
130 want: append([]byte{byte(OP_PUSHDATA4), 0, 0, 1, 0}, make([]byte, 1<<16)...),
133 data: make([]byte, 1<<16),
134 want: append([]byte{byte(OP_PUSHDATA4), 0, 0, 1, 0}, make([]byte, 1<<16)...),
138 for i := 1; i <= 75; i++ {
139 cases = append(cases, test{
140 data: make([]byte, i),
141 want: append([]byte{byte(OP_DATA_1) - 1 + byte(i)}, make([]byte, i)...),
145 for _, c := range cases {
146 got := PushDataBytes(c.data)
152 if !bytes.Equal(got, c.want) {
153 t.Errorf("PushDataBytes(%x...) = %x...[%d] want %x...[%d]", c.data[:dl], got[:dl], len(got), c.want[:dl], len(c.want))
158 func TestPushdataInt64(t *testing.T) {
165 want: []byte{byte(OP_0)},
168 want: []byte{byte(OP_DATA_1), 0x11},
171 want: []byte{byte(OP_DATA_1), 0xff},
174 want: []byte{byte(OP_DATA_2), 0x00, 0x01},
177 want: []byte{byte(OP_DATA_8), 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
180 want: []byte{byte(OP_DATA_8), 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
183 for i := 1; i <= 16; i++ {
184 cases = append(cases, test{
186 want: []byte{byte(OP_1) - 1 + byte(i)},
190 for _, c := range cases {
191 got := PushDataInt64(c.num)
193 if !bytes.Equal(got, c.want) {
194 t.Errorf("PushDataInt64(%d) = %x want %x", c.num, got, c.want)