Skip to content

Commit

Permalink
add tests for ternary operator
Browse files Browse the repository at this point in the history
  • Loading branch information
Gusarich committed Nov 28, 2023
1 parent ec8b087 commit 2e1789a
Show file tree
Hide file tree
Showing 14 changed files with 1,096 additions and 0 deletions.
34 changes: 34 additions & 0 deletions src/test/feature-ternary.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { beginCell, toNano } from 'ton-core';
import { ContractSystem } from '@tact-lang/emulator';
import { __DANGER_resetNodeId } from '../grammar/ast';
import { TernaryTester } from './features/output/ternary_TernaryTester';

describe('feature-ternary', () => {
beforeEach(() => {
__DANGER_resetNodeId();
});
it('should implement ternary operator correctly', async () => {

// Init
let system = await ContractSystem.create();
let treasure = system.treasure('treasure');
let contract = system.open(await TernaryTester.fromInit());
await contract.send(treasure, { value: toNano('10') }, null);
await system.run();

// Check methods
expect(await contract.getTest1(123n)).toEqual(1n);
expect(await contract.getTest1(5n)).toEqual(2n);

expect(await contract.getTest2(123n)).toEqual(246n);
expect(await contract.getTest2(5n)).toEqual(15n);

expect(await contract.getTest3(2n, 2n)).toEqual(1n);
expect(await contract.getTest3(2n, 3n)).toEqual(2n);

expect(await contract.getTest4(123n, 456n)).toEqual(1n);
expect(await contract.getTest4(123n, 5n)).toEqual(2n);
expect(await contract.getTest4(5n, 789n)).toEqual(3n);
expect(await contract.getTest4(5n, 5n)).toEqual(4n);
});
});
1 change: 1 addition & 0 deletions src/test/features/output/ternary_TernaryTester.abi
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"TernaryTester","types":[{"name":"StateInit","header":null,"fields":[{"name":"code","type":{"kind":"simple","type":"cell","optional":false}},{"name":"data","type":{"kind":"simple","type":"cell","optional":false}}]},{"name":"Context","header":null,"fields":[{"name":"bounced","type":{"kind":"simple","type":"bool","optional":false}},{"name":"sender","type":{"kind":"simple","type":"address","optional":false}},{"name":"value","type":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"raw","type":{"kind":"simple","type":"slice","optional":false}}]},{"name":"SendParameters","header":null,"fields":[{"name":"bounce","type":{"kind":"simple","type":"bool","optional":false}},{"name":"to","type":{"kind":"simple","type":"address","optional":false}},{"name":"value","type":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"mode","type":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"body","type":{"kind":"simple","type":"cell","optional":true}},{"name":"code","type":{"kind":"simple","type":"cell","optional":true}},{"name":"data","type":{"kind":"simple","type":"cell","optional":true}}]}],"receivers":[{"receiver":"internal","message":{"kind":"empty"}}],"getters":[{"name":"test1","arguments":[{"name":"a","type":{"kind":"simple","type":"int","optional":false,"format":257}}],"returnType":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"test2","arguments":[{"name":"a","type":{"kind":"simple","type":"int","optional":false,"format":257}}],"returnType":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"test3","arguments":[{"name":"a","type":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"b","type":{"kind":"simple","type":"int","optional":false,"format":257}}],"returnType":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"test4","arguments":[{"name":"a","type":{"kind":"simple","type":"int","optional":false,"format":257}},{"name":"b","type":{"kind":"simple","type":"int","optional":false,"format":257}}],"returnType":{"kind":"simple","type":"int","optional":false,"format":257}}],"errors":{"2":{"message":"Stack undeflow"},"3":{"message":"Stack overflow"},"4":{"message":"Integer overflow"},"5":{"message":"Integer out of expected range"},"6":{"message":"Invalid opcode"},"7":{"message":"Type check error"},"8":{"message":"Cell overflow"},"9":{"message":"Cell underflow"},"10":{"message":"Dictionary error"},"13":{"message":"Out of gas error"},"32":{"message":"Method ID not found"},"34":{"message":"Action is invalid or not supported"},"37":{"message":"Not enough TON"},"38":{"message":"Not enough extra-currencies"},"128":{"message":"Null reference exception"},"129":{"message":"Invalid serialization prefix"},"130":{"message":"Invalid incoming message"},"131":{"message":"Constraints error"},"132":{"message":"Access denied"},"133":{"message":"Contract stopped"},"134":{"message":"Invalid argument"},"135":{"message":"Code of a contract was not found"},"136":{"message":"Invalid address"},"137":{"message":"Masterchain support is not enabled for this contract"}},"interfaces":["org.ton.introspection.v0","org.ton.abi.ipfs.v0","org.ton.deploy.lazy.v0","org.ton.debug.v0","org.ton.chain.workchain.v0"]}
Binary file not shown.
146 changes: 146 additions & 0 deletions src/test/features/output/ternary_TernaryTester.code.fc
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
#pragma version =0.4.3;
#pragma allow-post-modification;
#pragma compute-asm-ltr;

#include "ternary_TernaryTester.headers.fc";
#include "ternary_TernaryTester.stdlib.fc";
#include "ternary_TernaryTester.storage.fc";

;;
;; Contract TernaryTester functions
;;

tuple $TernaryTester$_contract_init() impure inline_ref {
tuple $self = null();
return $self;
}

(tuple, int) $TernaryTester$_fun_test1(tuple $self, int $a) impure inline_ref {
var ($self) = $self;
return ($self, (($a == 123) ? 1 : 2));
}

(tuple, int) $TernaryTester$_fun_test2(tuple $self, int $a) impure inline_ref {
var ($self) = $self;
return ($self, (($a == 123) ? ($a * 2) : ($a * 3)));
}

(tuple, int) $TernaryTester$_fun_test3(tuple $self, int $a, int $b) impure inline_ref {
var ($self) = $self;
return ($self, (($a == $b) ? 1 : 2));
}

(tuple, int) $TernaryTester$_fun_test4(tuple $self, int $a, int $b) impure inline_ref {
var ($self) = $self;
return ($self, (($a == 123) ? (($b == 456) ? 1 : 2) : (($b == 789) ? 3 : 4)));
}

;;
;; Receivers of a Contract TernaryTester
;;

((tuple), ()) %$TernaryTester$_internal_empty(tuple $self) impure inline {
var $self = $self;
return ($self, ());
}

;;
;; Get methods of a Contract TernaryTester
;;

_ %test1(int $$a) method_id(70304) {
int $a = $$a;
var self = $TernaryTester$_contract_load();
var res = self~$TernaryTester$_fun_test1($a);
return res;
}

_ %test2(int $$a) method_id(74435) {
int $a = $$a;
var self = $TernaryTester$_contract_load();
var res = self~$TernaryTester$_fun_test2($a);
return res;
}

_ %test3(int $$a, int $$b) method_id(78562) {
int $a = $$a;
int $b = $$b;
var self = $TernaryTester$_contract_load();
var res = self~$TernaryTester$_fun_test3($a, $b);
return res;
}

_ %test4(int $$a, int $$b) method_id(82437) {
int $a = $$a;
int $b = $$b;
var self = $TernaryTester$_contract_load();
var res = self~$TernaryTester$_fun_test4($a, $b);
return res;
}

_ supported_interfaces() method_id {
return (
"org.ton.introspection.v0"H >> 128,
"org.ton.abi.ipfs.v0"H >> 128,
"org.ton.deploy.lazy.v0"H >> 128,
"org.ton.debug.v0"H >> 128,
"org.ton.chain.workchain.v0"H >> 128
);
}

_ get_abi_ipfs() method_id {
return "ipfs://QmTm1azvz3xGNedgaYyb1nvMYZS1Nf9zkvFmYH9qBDg6FC";
}

_ lazy_deployment_completed() method_id {
return get_data().begin_parse().load_int(1);
}

;;
;; Routing of a Contract TernaryTester
;;

(tuple, int) $TernaryTester$_contract_router_internal(tuple self, int msg_bounced, slice in_msg) impure inline_ref {
;; Handle bounced messages
if (msg_bounced) {
return (self, true);
}

;; Parse incoming message
int op = 0;
if (slice_bits(in_msg) >= 32) {
op = in_msg.preload_uint(32);
}


;; Receive empty message
if ((op == 0) & (slice_bits(in_msg) <= 32)) {
self~%$TernaryTester$_internal_empty();
return (self, true);
}

return (self, false);
}

() recv_internal(int msg_value, cell in_msg_cell, slice in_msg) impure {

;; Context
var cs = in_msg_cell.begin_parse();
var msg_flags = cs~load_uint(4);
var msg_bounced = -(msg_flags & 1);
slice msg_sender_addr = __tact_verify_address(cs~load_msg_addr());
__tact_context = (msg_bounced, msg_sender_addr, msg_value, cs);
__tact_context_sender = msg_sender_addr;

;; Load contract data
var self = $TernaryTester$_contract_load();

;; Handle operation
int handled = self~$TernaryTester$_contract_router_internal(msg_bounced, in_msg);

;; Throw if not handled
throw_unless(130, handled);

;; Persist state
$TernaryTester$_contract_store(self);
}
211 changes: 211 additions & 0 deletions src/test/features/output/ternary_TernaryTester.code.fif
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
PROGRAM{
DECLPROC __tact_verify_address
DECLPROC $TernaryTester$_contract_init
DECLPROC $TernaryTester$_contract_load
DECLPROC $TernaryTester$_contract_store
DECLPROC $TernaryTester$_fun_test1
DECLPROC $TernaryTester$_fun_test2
DECLPROC $TernaryTester$_fun_test3
DECLPROC $TernaryTester$_fun_test4
DECLPROC %$TernaryTester$_internal_empty
70304 DECLMETHOD %test1
74435 DECLMETHOD %test2
78562 DECLMETHOD %test3
82437 DECLMETHOD %test4
113617 DECLMETHOD supported_interfaces
121275 DECLMETHOD get_abi_ipfs
115390 DECLMETHOD lazy_deployment_completed
DECLPROC $TernaryTester$_contract_router_internal
DECLPROC recv_internal
DECLGLOBVAR __tact_context
DECLGLOBVAR __tact_context_sender
DECLGLOBVAR __tact_context_sys
DECLGLOBVAR __tact_randomized
__tact_verify_address PROCINLINE:<{
DUP
SBITS
267 PUSHINT
EQUAL
136 THROWIFNOT
DUP
11 PLDU
DUP
1279 PUSHINT
EQUAL
137 THROWIF
10 PUSHPOW2
EQUAL
136 THROWIFNOT
}>
$TernaryTester$_contract_init PROCREF:<{
PUSHNULL
}>
$TernaryTester$_contract_load PROCREF:<{
c4 PUSH
CTOS
LDREF
SWAP
__tact_context_sys SETGLOB
1 LDI
DROP
IFJMP:<{
PUSHNULL
}>
MYADDR
11 PLDU
10 PUSHPOW2
EQUAL
137 THROWIFNOT
$TernaryTester$_contract_init INLINECALLDICT
}>
$TernaryTester$_contract_store PROCINLINE:<{
DROP
NEWC
__tact_context_sys GETGLOB
SWAP
STREF
TRUE
SWAP
1 STI
ENDC
c4 POP
}>
$TernaryTester$_fun_test1 PROCREF:<{
123 EQINT
IF:<{
1 PUSHINT
}>ELSE<{
2 PUSHINT
}>
}>
$TernaryTester$_fun_test2 PROCREF:<{
DUP
123 EQINT
IF:<{
1 LSHIFT#
}>ELSE<{
3 MULCONST
}>
}>
$TernaryTester$_fun_test3 PROCREF:<{
EQUAL
IF:<{
1 PUSHINT
}>ELSE<{
2 PUSHINT
}>
}>
$TernaryTester$_fun_test4 PROCREF:<{
SWAP
123 EQINT
IF:<{
456 PUSHINT
EQUAL
IF:<{
1 PUSHINT
}>ELSE<{
2 PUSHINT
}>
}>ELSE<{
789 PUSHINT
EQUAL
IF:<{
3 PUSHINT
}>ELSE<{
4 PUSHINT
}>
}>
}>
%$TernaryTester$_internal_empty PROCINLINE:<{
}>
%test1 PROC:<{
$TernaryTester$_contract_load INLINECALLDICT
SWAP
$TernaryTester$_fun_test1 INLINECALLDICT
NIP
}>
%test2 PROC:<{
$TernaryTester$_contract_load INLINECALLDICT
SWAP
$TernaryTester$_fun_test2 INLINECALLDICT
NIP
}>
%test3 PROC:<{
$TernaryTester$_contract_load INLINECALLDICT
-ROT
$TernaryTester$_fun_test3 INLINECALLDICT
NIP
}>
%test4 PROC:<{
$TernaryTester$_contract_load INLINECALLDICT
-ROT
$TernaryTester$_fun_test4 INLINECALLDICT
NIP
}>
supported_interfaces PROC:<{
123515602279859691144772641439386770278 PUSHINT
209801025412363888721030803524359905849 PUSHINT
42980537499636128163026532310500881091 PUSHINT
36993126140238121407019133875791708966 PUSHINT
209474421377847335869795010607481022628 PUSHINT
}>
get_abi_ipfs PROC:<{
x{697066733a2f2f516d546d31617a767a3378474e65646761597962316e764d595a53314e66397a6b76466d59483971424467364643} PUSHSLICE
}>
lazy_deployment_completed PROC:<{
c4 PUSH
CTOS
1 LDI
SWAP
}>
$TernaryTester$_contract_router_internal PROCREF:<{
SWAP
IFJMP:<{
DROP
TRUE
}>
0 PUSHINT
OVER
SBITS
31 GTINT
IF:<{
DROP
DUP
32 PLDU
}>
0 EQINT
SWAP
SBITS
33 LESSINT
AND
IFJMP:<{
%$TernaryTester$_internal_empty INLINECALLDICT
TRUE
}>
FALSE
}>
recv_internal PROC:<{
SWAP
CTOS
4 LDU
SWAP
1 PUSHINT
AND
NEGATE
SWAP
LDMSGADDR
SWAP
__tact_verify_address INLINECALLDICT
s0 s4 s2 PUXCPU
s0 s3 XCHG
4 TUPLE
__tact_context SETGLOB
s0 s2 XCHG
__tact_context_sender SETGLOB
$TernaryTester$_contract_load INLINECALLDICT
-ROT
$TernaryTester$_contract_router_internal INLINECALLDICT
130 THROWIFNOT
$TernaryTester$_contract_store INLINECALLDICT
}>
}END>c
Loading

0 comments on commit 2e1789a

Please sign in to comment.