Add tests for opcodes
Add tests similar to the opcodes tests in tezos. https://gitlab.com/nomadic-labs/tezos/-/tree/master/tests_python/contracts/opcodes
Sub-issue of #11 (closed) and #16
Check coverage
, and arvid@coverage
bruno@coverage
branches.
-
Control structures
-
APPLY: ty1 : lambda ( pair ty1 ty2 ) ty3 : A — lambda ty2 ty3 : A
/ (Albert: NYI ) -
EXEC: ty1 : lambda ty1 ty2 : A — ty2 : A
/ (Albert: NYI ) -
FAILWITH: ty1 : A — B
/ (Albert:failwith arg
) -
IF code1 code2: bool : A — B
/ (Albert:match b with ∣ True u -> code1 ∣ False u -> code2
) -
IF_CONS code1 code2: list ty1 : A — B
/ (Albert:match l with [] -> code1 ∣ x :: ll -> code2
) -
IF_LEFT code1 code2: or ty1 ty2 : A — B
/ (Albert:match o with ∣ Left vl -> code1 ∣ Right vr -> code2
) -
IF_NONE code1 code2: option ty1 : A — B
/ (Albert:match m with ∣ None u -> code1 ∣ Some v -> code2
) -
ITER code: list ty1 : A — A
/ (Albert: NYI ) -
ITER code: set cty : A — A
/ (Albert: NYI ) -
ITER code: map kty vty : A — A
/ (Albert: NYI ) -
LAMBDA ty1 ty2 code: A — lambda ty1 ty2 : A
/ (Albert: NYI ) -
LOOP code: bool : A — A
/ (Albert:loop b do code done
) -
LOOP_LEFT code: or ty1 ty2 : A — ty2 : A
/ (Albert:loop_left v in var do code done
) -
code1 ; code2: A — C
/ (Albert:code1 ; code2
) -
Stack manipulation
-
DIG n: A @ ( ty1 : B ) — ty1 : ( A @ B )
/ (Albert: - ) -
DIP n code: A @ B — A @ C
/ (Albert: - ) -
DROP n: A @ B — B
/ (Albert:drop v
) -
DUG n: ty1 : ( A @ B ) — A @ ( ty1 : B )
/ (Albert: - ) -
DUP: ty1 : A — ty1 : ty1 : A
/ (Albert:(v1, v2)
dup v= ) -
PUSH ty1 x: A — ty1 : A
/ (Albert: - ) -
SWAP: ty1 : ty2 : A — ty2 : ty1 : A
/ (Albert: - )
-
-
Arithmetic operations
-
ABS: int : A — nat : A
/ (Albert:x
abs x1= ) -
ADD: nat : nat : A — nat : A
/ (Albert:x
x1 + x2= ) -
ADD: nat : int : A — int : A
/ (Albert:x
x1 + x2= ) -
ADD: int : nat : A — int : A
/ (Albert:x
x1 + x2= ) -
ADD: int : int : A — int : A
/ (Albert:x
x1 + x2= ) -
ADD: timestamp : int : A — timestamp : A
/ (Albert:x
x1 + x2= ) -
ADD: int : timestamp : A — timestamp : A
/ (Albert:x
x1 + x2= ) -
ADD: mutez : mutez : A — mutez : A
/ (Albert:x
x1 + x2= ) -
COMPARE: cty : cty : A — int : A
/ (Albert: - ) -
EDIV: nat : nat : A — option ( pair nat nat ) : A
/ (Albert:{quotient
q; remainderr}
x1 /mod x2= ) -
EDIV: nat : int : A — option ( pair int nat ) : A
/ (Albert:{quotient
q; remainderr}
x1 /mod x2= ) -
EDIV: int : nat : A — option ( pair int nat ) : A
/ (Albert:{quotient
q; remainderr}
x1 /mod x2= ) -
EDIV: int : int : A — option ( pair int nat ) : A
/ (Albert:{quotient
q; remainderr}
x1 /mod x2= ) -
EDIV: mutez : nat : A — option ( pair mutez mutez ) : A
/ (Albert:{quotient
q; remainderr}
x1 /mod x2= ) -
EDIV: mutez : mutez : A — option ( pair nat mutez ) : A
/ (Albert:{quotient
q; remainderr}
x1 /mod x2= ) -
EQ: int : A — bool : A
/ (Albert: `b = x == y ) -
GE: int : A — bool : A
/ (Albert:b = x >
y ) -
GT: int : A — bool : A
/ (Albert: `b = x > y ) -
INT: nat : A — int : A
/ (Albert:i = int n
) -
ISNAT: int : A — option nat : A
/ (Albert:b
is_nat i= ) -
LE: int : A — bool : A
/ (Albert: bx <
y ) -
LSL: nat : nat : A — nat : A
/ (Albert:n
n1 << n2= ) -
LSR: nat : nat : A — nat : A
/ (Albert:n
n1 >> n2= ) -
LT: int : A — bool : A
/ (Albert:b
x < y= ) -
MUL: nat : nat : A — nat : A
/ (Albert:x
x1 * x2= ) -
MUL: nat : int : A — int : A
/ (Albert:x
x1 * x2= ) -
MUL: int : nat : A — int : A
/ (Albert:x
x1 * x2= ) -
MUL: int : int : A — int : A
/ (Albert:x
x1 * x2= ) -
MUL: mutez : nat : A — mutez : A
/ (Albert:x
x1 * x2= ) -
MUL: nat : mutez : A — mutez : A
/ (Albert:x
x1 * x2= ) -
NEG: nat : A — int : A
/ (Albert: NYI ) -
NEG: int : A — int : A
/ (Albert: NYI ) -
NEQ: int : A — bool : A
/ (Albert: bx !
y ) -
SUB: nat : nat : A — int : A
/ (Albert:x
x1 - x2= ) -
SUB: nat : int : A — int : A
/ (Albert:x
x1 - x2= ) -
SUB: int : nat : A — int : A
/ (Albert:x
x1 - x2= ) -
SUB: int : int : A — int : A
/ (Albert:x
x1 - x2= ) -
SUB: timestamp : int : A — timestamp : A
/ (Albert:x
x1 - x2= ) -
SUB: timestamp : timestamp : A — int : A
/ (Albert:x
x1 - x2= ) -
SUB: mutez : mutez : A — mutez : A
/ (Albert:x
x1 - x2= )
-
-
Boolean operations
-
AND: bool : bool : A — bool : A
/ (Albert: ) -
AND: nat : nat : A — nat : A
/ (Albert: ) -
AND: int : nat : A — nat : A
/ (Albert: ) -
NOT: bool : A — bool : A
/ (Albert:not_b = ~ b
) -
NOT: nat : A — int : A
/ (Albert: ) -
NOT: int : A — int : A
/ (Albert: ) -
OR: bool : bool : A — bool : A
/ (Albert: ) -
OR: nat : nat : A — nat : A
/ (Albert: ) -
XOR: bool : bool : A — bool : A
/ (Albert: ) -
XOR: nat : nat : A — nat : A
/ (Albert: )
-
-
Cryptographic operations
-
BLAKE2B: bytes : A — bytes : A
/ (Albert: ) -
CHECK_SIGNATURE: key : signature : bytes : A — bool : A
/ (Albert: ) -
HASH_KEY: key : A — key_hash : A
/ (Albert: ) -
SHA256: bytes : A — bytes : A
/ (Albert: ) -
SHA512: bytes : A — bytes : A
/ (Albert: )
-
-
Blockchain operations
-
ADDRESS: contract ty1 : A — address : A
/ (Albert: ) -
AMOUNT: A — mutez : A
/ (Albert: ) -
BALANCE: A — mutez : A
/ (Albert: ) -
CHAIN_ID: A — chain_id : A
/ (Albert: ) -
CONTRACT ty: address : A — option ( contract ty1 ) : A
/ (Albert: ) -
CREATE_CONTRACT ty1 ty2 code: option key_hash : mutez : ty1 : A — operation : address : A
/ (Albert: ) -
IMPLICIT_ACCOUNT: key_hash : A — contract unit : A
/ (Albert: ) -
NOW: A — timestamp : A
/ (Albert: ) -
SELF: A — contract ty : A
/ (Albert: ) -
SENDER: A — address : A
/ (Albert: ) -
SET_DELEGATE: option key_hash : A — operation : A
/ (Albert: ) -
SOURCE: A — address : A
/ (Albert: ) -
TRANSFER_TOKENS: ty1 : mutez : contract ty1 : A — operation : A
/ (Albert: )
-
-
Operations on data structures
-
CAR: pair ty1 ty2 : A — ty1 : A
/ (Albert: ) -
CDR: pair ty1 ty2 : A — ty2 : A
/ (Albert: ) -
CONCAT: string : string : A — string : A
/ (Albert: ) -
CONCAT: list string : A — string : A
/ (Albert: ) -
CONCAT: bytes : bytes : A — bytes : A
/ (Albert: ) -
CONCAT: list bytes : A — bytes : A
/ (Albert: ) -
CONS: ty1 : list ty1 : A — list ty1 : A
/ (Albert: x1; l
([] : list int); l = x :: l; // makes a singleton list. ) -
EMPTY_BIG_MAP kty vty: A — big_map kty vty : A
/ (Albert: ) -
EMPTY_MAP kty vty: A — map kty vty : A
/ (Albert: ) -
EMPTY_SET cty: A — set cty : A
/ (Albert: ) -
GET: kty : map kty vty : A — option vty : A
/ (Albert: ) -
GET: kty : big_map kty vty : A — option vty : A
/ (Albert: ) -
LEFT ty2: ty1 : A — or ty1 ty2 : A
/ (Albert: ) -
MAP code: list ty1 : A — list ty2 : A
/ (Albert: ) -
MAP code: map kty ty1 : A — map kty ty2 : A
/ (Albert: ) -
MEM: cty : set cty : A — bool : A
/ (Albert: ) -
MEM: kty : map kty vty : A — bool : A
/ (Albert: ) -
MEM: kty : big_map kty vty : A — bool : A
/ (Albert: ) -
NIL ty1: A — list ty1 : A
/ (Albert: ) -
NONE ty1: A — option ty1 : A
/ (Albert: ) -
PACK: ty1 : A — bytes : A
/ (Albert: ) -
PAIR: ty1 : ty2 : A — pair ty1 ty2 : A
/ (Albert: p{ car
1 ; cdr = true} // creates a pair (int * bool) ) -
RIGHT ty1: ty2 : A — or ty1 ty2 : A
/ (Albert: ) -
SIZE: set cty : A — nat : A
/ (Albert: ) -
SIZE: map kty vty : A — nat : A
/ (Albert: ) -
SIZE: list ty1 : A — nat : A
/ (Albert: ) -
SIZE: string : A — nat : A
/ (Albert: ) -
SIZE: bytes : A — nat : A
/ (Albert: ) -
SLICE: nat : nat : string : A — option string : A
/ (Albert: ) -
SLICE: nat : nat : bytes : A — option bytes : A
/ (Albert: ) -
SOME: ty1 : A — option ty1 : A
/ (Albert: ) -
UNIT: A — unit : A
/ (Albert: val = {} // empty records translate to unit ) -
UNPACK ty1: bytes : A — option ty1 : A
/ (Albert: ) -
UPDATE: cty : bool : set cty : A — set cty : A
/ (Albert: ) -
UPDATE: kty : option vty : map kty vty : A — map kty vty : A
/ (Albert: ) -
UPDATE: kty : option vty : big_map kty vty : A — big_map kty vty : A
/ (Albert: )
-
-
Misc
-
#
,//
|//
| -
(* ... *)
/ (Albert: ) -
- / (Albert: type my_amount
nat= ) -
- / (Albert: )
-
-
Sum types
-
- | type number
[ Int : int ∣ Nat : nat]= |
-
-
Records
-
- / (Albert: type point
{ x : int ; y : int }= )
-
-
Functions
-
- / (Albert: def my_function : { arg1 : ty1 ; arg2 : ty2 ; ... } -> { out1 : ty3 ; out2 : ty4 ; ... }
body= ) -
- / (Albert: my_function { arg1
val1 ; arg2val2; ... }
)
-
-
Literals
-
int -
nat -
tez -
timestamp -
list -
unit -
address -
bytes -
string -
mutez - ...
-