7 "github.com/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) {
117 want: []byte{byte(OP_0)},
119 data: make([]byte, 255),
120 want: append([]byte{byte(OP_PUSHDATA1), 0xff}, make([]byte, 255)...),
122 data: make([]byte, 1<<8),
123 want: append([]byte{byte(OP_PUSHDATA2), 0, 1}, make([]byte, 1<<8)...),
125 data: make([]byte, 1<<16),
126 want: append([]byte{byte(OP_PUSHDATA4), 0, 0, 1, 0}, make([]byte, 1<<16)...),
129 for i := 1; i <= 75; i++ {
130 cases = append(cases, test{
131 data: make([]byte, i),
132 want: append([]byte{byte(OP_DATA_1) - 1 + byte(i)}, make([]byte, i)...),
136 for _, c := range cases {
137 got := PushdataBytes(c.data)
143 if !bytes.Equal(got, c.want) {
144 t.Errorf("PushdataBytes(%x...) = %x...[%d] want %x...[%d]", c.data[:dl], got[:dl], len(got), c.want[:dl], len(c.want))
149 func TestPushdataInt64(t *testing.T) {
156 want: []byte{byte(OP_0)},
159 want: []byte{byte(OP_DATA_1), 0x11},
162 want: []byte{byte(OP_DATA_1), 0xff},
165 want: []byte{byte(OP_DATA_2), 0x00, 0x01},
168 want: []byte{byte(OP_DATA_8), 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
171 want: []byte{byte(OP_DATA_8), 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
174 for i := 1; i <= 16; i++ {
175 cases = append(cases, test{
177 want: []byte{byte(OP_1) - 1 + byte(i)},
181 for _, c := range cases {
182 got := PushdataInt64(c.num)
184 if !bytes.Equal(got, c.want) {
185 t.Errorf("PushdataInt64(%d) = %x want %x", c.num, got, c.want)