| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- // SPDX-License-Identifier: Apache-2.0
- use crate::build_solidity;
- use soroban_sdk::{IntoVal, Val};
- #[test]
- fn math() {
- let runtime = build_solidity(
- r#"contract math {
- function max(uint64 a, uint64 b) public returns (uint64) {
- if (a > b) {
- return a;
- } else {
- return b;
- }
- }
- }"#,
- |_| {},
- );
- let arg: Val = 5_u64.into_val(&runtime.env);
- let arg2: Val = 4_u64.into_val(&runtime.env);
- let addr = runtime.contracts.last().unwrap();
- let res = runtime.invoke_contract(addr, "max", vec![arg, arg2]);
- let expected: Val = 5_u64.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- }
- #[test]
- fn math_same_name() {
- let src = build_solidity(
- r#"contract math {
- function max(uint64 a, uint64 b) public returns (uint64) {
- if (a > b) {
- return a;
- } else {
- return b;
- }
- }
-
- function max(uint64 a, uint64 b, uint64 c) public returns (uint64) {
- if (a > b) {
- if (a > c) {
- return a;
- } else {
- return c;
- }
- } else {
- if (b > c) {
- return b;
- } else {
- return c;
- }
- }
- }
- }
- "#,
- |_| {},
- );
- let addr = src.contracts.last().unwrap();
- let arg1: Val = 5_u64.into_val(&src.env);
- let arg2: Val = 4_u64.into_val(&src.env);
- let res = src.invoke_contract(addr, "max_uint64_uint64", vec![arg1, arg2]);
- let expected: Val = 5_u64.into_val(&src.env);
- assert!(expected.shallow_eq(&res));
- let arg1: Val = 5_u64.into_val(&src.env);
- let arg2: Val = 4_u64.into_val(&src.env);
- let arg3: Val = 6_u64.into_val(&src.env);
- let res = src.invoke_contract(addr, "max_uint64_uint64_uint64", vec![arg1, arg2, arg3]);
- let expected: Val = 6_u64.into_val(&src.env);
- assert!(expected.shallow_eq(&res));
- }
- #[test]
- fn i128_ops() {
- let runtime = build_solidity(
- r#"contract math {
- function add(int128 a, int128 b) public returns (int128) {
- return a + b;
- }
- function sub(int128 a, int128 b) public returns (int128) {
- return a - b;
- }
- function mul(int128 a, int128 b) public returns (int128) {
- return a * b;
- }
- function div(int128 a, int128 b) public returns (int128) {
- return a / b;
- }
- function mod(int128 a, int128 b) public returns (int128) {
- return a % b;
- }
- }"#,
- |_| {},
- );
- let arg: Val = 5_i128.into_val(&runtime.env);
- let arg2: Val = 4_i128.into_val(&runtime.env);
- let addr = runtime.contracts.last().unwrap();
- let res = runtime.invoke_contract(addr, "add", vec![arg, arg2]);
- let expected: Val = 9_i128.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "sub", vec![arg, arg2]);
- let expected: Val = 1_i128.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "mul", vec![arg, arg2]);
- let expected: Val = 20_i128.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "div", vec![arg, arg2]);
- let expected: Val = 1_i128.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "mod", vec![arg, arg2]);
- let expected: Val = 1_i128.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- }
- #[test]
- fn u128_ops() {
- let runtime = build_solidity(
- r#"contract math {
- function add(uint128 a, uint128 b) public returns (uint128) {
- return a + b;
- }
- function sub(uint128 a, uint128 b) public returns (uint128) {
- return a - b;
- }
- function mul(uint128 a, uint128 b) public returns (uint128) {
- return a * b;
- }
- function div(uint128 a, uint128 b) public returns (uint128) {
- return a / b;
- }
- function mod(uint128 a, uint128 b) public returns (uint128) {
- return a % b;
- }
- }"#,
- |_| {},
- );
- let arg: Val = 5_u128.into_val(&runtime.env);
- let arg2: Val = 4_u128.into_val(&runtime.env);
- let addr = runtime.contracts.last().unwrap();
- let res = runtime.invoke_contract(addr, "add", vec![arg, arg2]);
- let expected: Val = 9_u128.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "sub", vec![arg, arg2]);
- let expected: Val = 1_u128.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "mul", vec![arg, arg2]);
- let expected: Val = 20_u128.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "div", vec![arg, arg2]);
- let expected: Val = 1_u128.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "mod", vec![arg, arg2]);
- let expected: Val = 1_u128.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- }
- #[test]
- fn bool_roundtrip() {
- let runtime = build_solidity(
- r#"
- contract test {
- function flip(bool x) public returns (bool) {
- return !x;
- }
- }"#,
- |_| {},
- );
- let addr = runtime.contracts.last().unwrap();
- let arg_true: Val = true.into_val(&runtime.env);
- let res = runtime.invoke_contract(addr, "flip", vec![arg_true]);
- let expected: Val = false.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- }
- #[test]
- fn u32_roundtrip() {
- let runtime = build_solidity(
- r#"
- contract test {
- function id(uint32 x) public returns (uint32) {
- return x;
- }
- }"#,
- |_| {},
- );
- let addr = runtime.contracts.last().unwrap();
- let arg: Val = (42_u32).into_val(&runtime.env);
- let res = runtime.invoke_contract(addr, "id", vec![arg]);
- let expected: Val = (42_u32).into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- }
- #[test]
- fn u32_ops() {
- let runtime = build_solidity(
- r#"contract math {
- function add(uint32 a, uint32 b) public returns (uint32) {
- return a + b;
- }
- function sub(uint32 a, uint32 b) public returns (uint32) {
- return a - b;
- }
- function mul(uint32 a, uint32 b) public returns (uint32) {
- return a * b;
- }
- function div(uint32 a, uint32 b) public returns (uint32) {
- return a / b;
- }
- function mod(uint32 a, uint32 b) public returns (uint32) {
- return a % b;
- }
- }"#,
- |_| {},
- );
- let arg: Val = 5_u32.into_val(&runtime.env);
- let arg2: Val = 4_u32.into_val(&runtime.env);
- let addr = runtime.contracts.last().unwrap();
- let res = runtime.invoke_contract(addr, "add", vec![arg, arg2]);
- let expected: Val = 9_u32.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "sub", vec![arg, arg2]);
- let expected: Val = 1_u32.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "mul", vec![arg, arg2]);
- let expected: Val = 20_u32.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "div", vec![arg, arg2]);
- let expected: Val = 1_u32.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "mod", vec![arg, arg2]);
- let expected: Val = 1_u32.into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- }
- #[test]
- fn i32_roundtrip() {
- let runtime = build_solidity(
- r#"
- contract test {
- function id(int32 x) public returns (int32) {
- return x;
- }
- }"#,
- |_| {},
- );
- let addr = runtime.contracts.last().unwrap();
- let arg: Val = (42_i32).into_val(&runtime.env);
- let res = runtime.invoke_contract(addr, "id", vec![arg]);
- let expected: Val = (42_i32).into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- }
- #[test]
- fn i32_ops() {
- let runtime = build_solidity(
- r#"contract math {
- function add(int32 a, int32 b) public returns (int32) {
- return a + b;
- }
- function sub(int32 a, int32 b) public returns (int32) {
- return a - b;
- }
- function mul(int32 a, int32 b) public returns (int32) {
- return a * b;
- }
- function div(int32 a, int32 b) public returns (int32) {
- return a / b;
- }
- function mod(int32 a, int32 b) public returns (int32) {
- return a % b;
- }
- }"#,
- |_| {},
- );
- let addr = runtime.contracts.last().unwrap();
- let arg: Val = (5_i32).into_val(&runtime.env);
- let arg2: Val = (4_i32).into_val(&runtime.env);
- let res = runtime.invoke_contract(addr, "add", vec![arg, arg2]);
- let expected: Val = (9_i32).into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "sub", vec![arg, arg2]);
- let expected: Val = (1_i32).into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "mul", vec![arg, arg2]);
- let expected: Val = (20_i32).into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "div", vec![arg, arg2]);
- let expected: Val = (1_i32).into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "mod", vec![arg, arg2]);
- let expected: Val = (1_i32).into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- }
- #[test]
- fn i64_roundtrip() {
- let runtime = build_solidity(
- r#"
- contract test {
- function id(int64 x) public returns (int64) {
- return x;
- }
- }"#,
- |_| {},
- );
- let addr = runtime.contracts.last().unwrap();
- let arg: Val = (-42_i64).into_val(&runtime.env);
- let res = runtime.invoke_contract(addr, "id", vec![arg]);
- let expected: Val = (-42_i64).into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- }
- #[test]
- fn i64_ops() {
- let runtime = build_solidity(
- r#"contract math {
- function add(int64 a, int64 b) public returns (int64) { return a + b; }
- function sub(int64 a, int64 b) public returns (int64) { return a - b; }
- function mul(int64 a, int64 b) public returns (int64) { return a * b; }
- function div(int64 a, int64 b) public returns (int64) { return a / b; }
- function mod(int64 a, int64 b) public returns (int64) { return a % b; }
- }"#,
- |_| {},
- );
- let addr = runtime.contracts.last().unwrap();
- let a: Val = (5_i64).into_val(&runtime.env);
- let b: Val = (-4_i64).into_val(&runtime.env);
- let res = runtime.invoke_contract(addr, "add", vec![a, b]);
- let expected: Val = (1_i64).into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "sub", vec![a, b]);
- let expected: Val = (9_i64).into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "mul", vec![a, b]);
- let expected: Val = (-20_i64).into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "div", vec![a, b]);
- let expected: Val = (-1_i64).into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- let res = runtime.invoke_contract(addr, "mod", vec![a, b]);
- let expected: Val = (1_i64).into_val(&runtime.env);
- assert!(expected.shallow_eq(&res));
- }
|