6 "github.com/vapor/testutil"
9 func TestBitwiseOps(t *testing.T) {
10 type testStruct struct {
12 startVM *virtualMachine
14 wantVM *virtualMachine
16 cases := []testStruct{{
18 startVM: &virtualMachine{
20 dataStack: [][]byte{{255}},
22 wantVM: &virtualMachine{
24 dataStack: [][]byte{{0}},
28 startVM: &virtualMachine{
30 dataStack: [][]byte{{255, 0}},
32 wantVM: &virtualMachine{
34 dataStack: [][]byte{{0, 255}},
38 startVM: &virtualMachine{
40 dataStack: [][]byte{{0xff}, {0x80}},
42 wantVM: &virtualMachine{
45 dataStack: [][]byte{{0x80}},
49 startVM: &virtualMachine{
51 dataStack: [][]byte{{0xff}, {0x80, 0xff}},
53 wantVM: &virtualMachine{
56 dataStack: [][]byte{{0x80}},
60 startVM: &virtualMachine{
62 dataStack: [][]byte{{0x80, 0xff}, {0xff}},
64 wantVM: &virtualMachine{
67 dataStack: [][]byte{{0x80}},
71 startVM: &virtualMachine{
73 dataStack: [][]byte{{0xff}, {0x80}},
75 wantVM: &virtualMachine{
78 dataStack: [][]byte{{0xff}},
82 startVM: &virtualMachine{
84 dataStack: [][]byte{{0xff}, {0x80, 0x10}},
86 wantVM: &virtualMachine{
89 dataStack: [][]byte{{0xff, 0x10}},
93 startVM: &virtualMachine{
95 dataStack: [][]byte{{0xff, 0x10}, {0x80}},
97 wantVM: &virtualMachine{
100 dataStack: [][]byte{{0xff, 0x10}},
104 startVM: &virtualMachine{
106 dataStack: [][]byte{{0xff}, {0x80}},
108 wantVM: &virtualMachine{
111 dataStack: [][]byte{{0x7f}},
115 startVM: &virtualMachine{
117 dataStack: [][]byte{{0xff}, {0x80, 0x10}},
119 wantVM: &virtualMachine{
122 dataStack: [][]byte{{0x7f, 0x10}},
126 startVM: &virtualMachine{
128 dataStack: [][]byte{{0xff, 0x10}, {0x80}},
130 wantVM: &virtualMachine{
133 dataStack: [][]byte{{0x7f, 0x10}},
137 startVM: &virtualMachine{
139 dataStack: [][]byte{{0xff}, {0xff}},
141 wantVM: &virtualMachine{
144 dataStack: [][]byte{{1}},
148 startVM: &virtualMachine{
150 dataStack: [][]byte{{0xff, 0x10}, {0xff, 0x10}},
152 wantVM: &virtualMachine{
155 dataStack: [][]byte{{1}},
159 startVM: &virtualMachine{
161 dataStack: [][]byte{{0xff}, {0x80}},
163 wantVM: &virtualMachine{
166 dataStack: [][]byte{{}},
170 startVM: &virtualMachine{
172 dataStack: [][]byte{{0xff}, {0xff, 0x80}},
174 wantVM: &virtualMachine{
177 dataStack: [][]byte{{}},
181 startVM: &virtualMachine{
183 dataStack: [][]byte{{0xff, 0x80}, {0xff}},
185 wantVM: &virtualMachine{
188 dataStack: [][]byte{{}},
192 startVM: &virtualMachine{
194 dataStack: [][]byte{{0xff}, {0xff}},
196 wantVM: &virtualMachine{
199 dataStack: [][]byte{},
203 startVM: &virtualMachine{
205 dataStack: [][]byte{{0xff, 0x10}, {0xff, 0x10}},
207 wantVM: &virtualMachine{
210 dataStack: [][]byte{},
214 startVM: &virtualMachine{
216 dataStack: [][]byte{{0xff}, {0x80}},
218 wantErr: ErrVerifyFailed,
221 startVM: &virtualMachine{
223 dataStack: [][]byte{{0xff}, {0xff, 0x80}},
225 wantErr: ErrVerifyFailed,
228 startVM: &virtualMachine{
230 dataStack: [][]byte{{0xff, 0x80}, {0xff}},
232 wantErr: ErrVerifyFailed,
235 bitops := []Op{OP_INVERT, OP_AND, OP_OR, OP_XOR, OP_EQUAL, OP_EQUALVERIFY}
236 for _, op := range bitops {
237 cases = append(cases, testStruct{
239 startVM: &virtualMachine{
241 dataStack: [][]byte{{0xff}, {0xff}},
243 wantErr: ErrRunLimitExceeded,
246 startVM: &virtualMachine{
248 dataStack: [][]byte{{0xff}, {0xff}},
250 wantErr: ErrRunLimitExceeded,
254 for i, c := range cases {
255 err := ops[c.op].fn(c.startVM)
257 if err != c.wantErr {
258 t.Errorf("case %d, op %s: got err = %v want %v", i, ops[c.op].name, err, c.wantErr)
261 if c.wantErr != nil {
265 if !testutil.DeepEqual(c.startVM, c.wantVM) {
266 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)