OSDN Git Service

Hulk did something
[bytom/vapor.git] / protocol / vm / assemble_test.go
1 package vm
2
3 import (
4         "bytes"
5         "encoding/hex"
6         "testing"
7
8         "github.com/vapor/errors"
9 )
10
11 func TestAssemble(t *testing.T) {
12         cases := []struct {
13                 plain   string
14                 want    []byte
15                 wantErr error
16         }{
17                 {"2 3 ADD 5 NUMEQUAL", mustDecodeHex("525393559c"), nil},
18                 {"0x02 3 ADD 5 NUMEQUAL", mustDecodeHex("01025393559c"), nil},
19                 {"19 14 SUB 5 NUMEQUAL", mustDecodeHex("01135e94559c"), nil},
20                 {"'Hello' 'WORLD' CAT 'HELLOWORLD' EQUAL", mustDecodeHex("0548656c6c6f05574f524c447e0a48454c4c4f574f524c4487"), nil},
21                 {`'H\'E' 'W' CAT 'H\'EW' EQUAL`, mustDecodeHex("0348274501577e044827455787"), nil},
22                 {`'HELLO '  'WORLD' CAT 'HELLO WORLD' EQUAL`, mustDecodeHex("0648454c4c4f2005574f524c447e0b48454c4c4f20574f524c4487"), nil},
23                 {`0x1`, nil, hex.ErrLength},
24                 {`BADTOKEN`, nil, ErrToken},
25                 {`'Unterminated quote`, nil, ErrToken},
26         }
27
28         for _, c := range cases {
29                 got, gotErr := Assemble(c.plain)
30
31                 if errors.Root(gotErr) != c.wantErr {
32                         t.Errorf("Compile(%s) err = %v want %v", c.plain, errors.Root(gotErr), c.wantErr)
33                         continue
34                 }
35
36                 if c.wantErr != nil {
37                         continue
38                 }
39
40                 if !bytes.Equal(got, c.want) {
41                         t.Errorf("Compile(%s) = %x want %x", c.plain, got, c.want)
42                 }
43         }
44 }
45
46 func TestDisassemble(t *testing.T) {
47         cases := []struct {
48                 raw     []byte
49                 want    string
50                 wantErr error
51         }{
52                 {mustDecodeHex("525393559c"), "0x02 0x03 ADD 0x05 NUMEQUAL", nil},
53                 {mustDecodeHex("01135e94559c"), "0x13 0x0e SUB 0x05 NUMEQUAL", nil},
54                 {mustDecodeHex("6300000000"), "$alpha JUMP:$alpha", nil},
55                 {[]byte{0xff}, "NOPxff", nil},
56         }
57
58         for _, c := range cases {
59                 got, gotErr := Disassemble(c.raw)
60
61                 if errors.Root(gotErr) != c.wantErr {
62                         t.Errorf("Decompile(%x) err = %v want %v", c.raw, errors.Root(gotErr), c.wantErr)
63                         continue
64                 }
65
66                 if c.wantErr != nil {
67                         continue
68                 }
69
70                 if got != c.want {
71                         t.Errorf("Decompile(%x) = %s want %s", c.raw, got, c.want)
72                 }
73         }
74 }
75
76 func mustDecodeHex(h string) []byte {
77         bits, err := hex.DecodeString(h)
78         if err != nil {
79                 panic(err)
80         }
81         return bits
82 }