TestOpcodeDisasm tests the print function for all opcodes in both the oneline and full modes to ensure it provides the expected disassembly.
(t *testing.T)
| 36 | // TestOpcodeDisasm tests the print function for all opcodes in both the oneline |
| 37 | // and full modes to ensure it provides the expected disassembly. |
| 38 | func TestOpcodeDisasm(t *testing.T) { |
| 39 | t.Parallel() |
| 40 | |
| 41 | // First, test the oneline disassembly. |
| 42 | |
| 43 | // The expected strings for the data push opcodes are replaced in the |
| 44 | // test loops below since they involve repeating bytes. Also, the |
| 45 | // OP_NOP# and OP_UNKNOWN# are replaced below too, since it's easier |
| 46 | // than manually listing them here. |
| 47 | oneBytes := []byte{0x01} |
| 48 | oneStr := "01" |
| 49 | expectedStrings := [256]string{0x00: "0", 0x4f: "-1", |
| 50 | 0x50: "OP_RESERVED", 0x61: "OP_NOP", 0x62: "OP_VER", |
| 51 | 0x63: "OP_IF", 0x64: "OP_NOTIF", 0x65: "OP_VERIF", |
| 52 | 0x66: "OP_VERNOTIF", 0x67: "OP_ELSE", 0x68: "OP_ENDIF", |
| 53 | 0x69: "OP_VERIFY", 0x6a: "OP_RETURN", 0x6b: "OP_TOALTSTACK", |
| 54 | 0x6c: "OP_FROMALTSTACK", 0x6d: "OP_2DROP", 0x6e: "OP_2DUP", |
| 55 | 0x6f: "OP_3DUP", 0x70: "OP_2OVER", 0x71: "OP_2ROT", |
| 56 | 0x72: "OP_2SWAP", 0x73: "OP_IFDUP", 0x74: "OP_DEPTH", |
| 57 | 0x75: "OP_DROP", 0x76: "OP_DUP", 0x77: "OP_NIP", |
| 58 | 0x78: "OP_OVER", 0x79: "OP_PICK", 0x7a: "OP_ROLL", |
| 59 | 0x7b: "OP_ROT", 0x7c: "OP_SWAP", 0x7d: "OP_TUCK", |
| 60 | 0x7e: "OP_CAT", 0x7f: "OP_SUBSTR", 0x80: "OP_LEFT", |
| 61 | 0x81: "OP_RIGHT", 0x82: "OP_SIZE", 0x83: "OP_INVERT", |
| 62 | 0x84: "OP_AND", 0x85: "OP_OR", 0x86: "OP_XOR", |
| 63 | 0x87: "OP_EQUAL", 0x88: "OP_EQUALVERIFY", 0x89: "OP_RESERVED1", |
| 64 | 0x8a: "OP_RESERVED2", 0x8b: "OP_1ADD", 0x8c: "OP_1SUB", |
| 65 | 0x8d: "OP_2MUL", 0x8e: "OP_2DIV", 0x8f: "OP_NEGATE", |
| 66 | 0x90: "OP_ABS", 0x91: "OP_NOT", 0x92: "OP_0NOTEQUAL", |
| 67 | 0x93: "OP_ADD", 0x94: "OP_SUB", 0x95: "OP_MUL", 0x96: "OP_DIV", |
| 68 | 0x97: "OP_MOD", 0x98: "OP_LSHIFT", 0x99: "OP_RSHIFT", |
| 69 | 0x9a: "OP_BOOLAND", 0x9b: "OP_BOOLOR", 0x9c: "OP_NUMEQUAL", |
| 70 | 0x9d: "OP_NUMEQUALVERIFY", 0x9e: "OP_NUMNOTEQUAL", |
| 71 | 0x9f: "OP_LESSTHAN", 0xa0: "OP_GREATERTHAN", |
| 72 | 0xa1: "OP_LESSTHANOREQUAL", 0xa2: "OP_GREATERTHANOREQUAL", |
| 73 | 0xa3: "OP_MIN", 0xa4: "OP_MAX", 0xa5: "OP_WITHIN", |
| 74 | 0xa6: "OP_RIPEMD160", 0xa7: "OP_SHA1", 0xa8: "OP_SHA256", |
| 75 | 0xa9: "OP_HASH160", 0xaa: "OP_HASH256", 0xab: "OP_CODESEPARATOR", |
| 76 | 0xac: "OP_CHECKSIG", 0xad: "OP_CHECKSIGVERIFY", |
| 77 | 0xae: "OP_CHECKMULTISIG", 0xaf: "OP_CHECKMULTISIGVERIFY", |
| 78 | 0xfa: "OP_SMALLINTEGER", 0xfb: "OP_PUBKEYS", |
| 79 | 0xfd: "OP_PUBKEYHASH", 0xfe: "OP_PUBKEY", |
| 80 | 0xff: "OP_INVALIDOPCODE", 0xba: "OP_CHECKSIGADD", |
| 81 | } |
| 82 | for opcodeVal, expectedStr := range expectedStrings { |
| 83 | var data []byte |
| 84 | switch { |
| 85 | // OP_DATA_1 through OP_DATA_65 display the pushed data. |
| 86 | case opcodeVal >= 0x01 && opcodeVal < 0x4c: |
| 87 | data = bytes.Repeat(oneBytes, opcodeVal) |
| 88 | expectedStr = strings.Repeat(oneStr, opcodeVal) |
| 89 | |
| 90 | // OP_PUSHDATA1. |
| 91 | case opcodeVal == 0x4c: |
| 92 | data = bytes.Repeat(oneBytes, 1) |
| 93 | expectedStr = strings.Repeat(oneStr, 1) |
| 94 | |
| 95 | // OP_PUSHDATA2. |
nothing calls this directly
no test coverage detected
searching dependent graphs…