6 "github.com/vapor/testutil"
9 func TestSpliceOps(t *testing.T) {
10 type testStruct struct {
12 startVM *virtualMachine
14 wantVM *virtualMachine
16 cases := []testStruct{{
18 startVM: &virtualMachine{
20 dataStack: [][]byte{[]byte("hello"), []byte("world")},
22 wantVM: &virtualMachine{
25 dataStack: [][]byte{[]byte("helloworld")},
29 startVM: &virtualMachine{
31 dataStack: [][]byte{[]byte("hello"), []byte("world")},
33 wantErr: ErrRunLimitExceeded,
36 startVM: &virtualMachine{
38 dataStack: [][]byte{[]byte("helloworld"), {3}, {5}},
40 wantVM: &virtualMachine{
43 dataStack: [][]byte{[]byte("lowor")},
47 startVM: &virtualMachine{
49 dataStack: [][]byte{[]byte("helloworld"), {3}, Int64Bytes(-1)},
54 startVM: &virtualMachine{
56 dataStack: [][]byte{[]byte("helloworld"), Int64Bytes(-1), {5}},
61 startVM: &virtualMachine{
63 dataStack: [][]byte{[]byte("helloworld"), {6}, {5}},
68 startVM: &virtualMachine{
70 dataStack: [][]byte{[]byte("helloworld"), {3}, {5}},
72 wantErr: ErrRunLimitExceeded,
75 startVM: &virtualMachine{
77 dataStack: [][]byte{[]byte("helloworld"), {5}},
79 wantVM: &virtualMachine{
82 dataStack: [][]byte{[]byte("hello")},
86 startVM: &virtualMachine{
88 dataStack: [][]byte{[]byte("helloworld"), Int64Bytes(-1)},
93 startVM: &virtualMachine{
95 dataStack: [][]byte{[]byte("helloworld"), {11}},
100 startVM: &virtualMachine{
102 dataStack: [][]byte{[]byte("helloworld"), {5}},
104 wantErr: ErrRunLimitExceeded,
107 startVM: &virtualMachine{
109 dataStack: [][]byte{[]byte("helloworld"), {5}},
111 wantVM: &virtualMachine{
114 dataStack: [][]byte{[]byte("world")},
118 startVM: &virtualMachine{
120 dataStack: [][]byte{[]byte("helloworld"), Int64Bytes(-1)},
122 wantErr: ErrBadValue,
125 startVM: &virtualMachine{
127 dataStack: [][]byte{[]byte("helloworld"), {11}},
129 wantErr: ErrBadValue,
132 startVM: &virtualMachine{
134 dataStack: [][]byte{[]byte("helloworld"), {5}},
136 wantErr: ErrRunLimitExceeded,
139 startVM: &virtualMachine{
141 dataStack: [][]byte{[]byte("helloworld")},
143 wantVM: &virtualMachine{
146 dataStack: [][]byte{[]byte("helloworld"), {10}},
150 startVM: &virtualMachine{
152 dataStack: [][]byte{{0xff}, {0xab, 0xcd}},
154 wantVM: &virtualMachine{
157 dataStack: [][]byte{{0xff, 0x02, 0xab, 0xcd}},
161 startVM: &virtualMachine{
163 dataStack: [][]byte{{0xff}, {0xab, 0xcd}},
165 wantErr: ErrRunLimitExceeded,
168 spliceops := []Op{OP_CAT, OP_SUBSTR, OP_LEFT, OP_RIGHT, OP_CATPUSHDATA, OP_SIZE}
169 for _, op := range spliceops {
170 cases = append(cases, testStruct{
172 startVM: &virtualMachine{runLimit: 0},
173 wantErr: ErrRunLimitExceeded,
177 for i, c := range cases {
178 err := ops[c.op].fn(c.startVM)
180 if err != c.wantErr {
181 t.Errorf("case %d, op %s: got err = %v want %v", i, ops[c.op].name, err, c.wantErr)
184 if c.wantErr != nil {
188 if !testutil.DeepEqual(c.startVM, c.wantVM) {
189 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)