math.rs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. // SPDX-License-Identifier: Apache-2.0
  2. use crate::build_solidity;
  3. use soroban_sdk::{IntoVal, Val};
  4. #[test]
  5. fn math() {
  6. let runtime = build_solidity(
  7. r#"contract math {
  8. function max(uint64 a, uint64 b) public returns (uint64) {
  9. if (a > b) {
  10. return a;
  11. } else {
  12. return b;
  13. }
  14. }
  15. }"#,
  16. |_| {},
  17. );
  18. let arg: Val = 5_u64.into_val(&runtime.env);
  19. let arg2: Val = 4_u64.into_val(&runtime.env);
  20. let addr = runtime.contracts.last().unwrap();
  21. let res = runtime.invoke_contract(addr, "max", vec![arg, arg2]);
  22. let expected: Val = 5_u64.into_val(&runtime.env);
  23. assert!(expected.shallow_eq(&res));
  24. }
  25. #[test]
  26. fn math_same_name() {
  27. let src = build_solidity(
  28. r#"contract math {
  29. function max(uint64 a, uint64 b) public returns (uint64) {
  30. if (a > b) {
  31. return a;
  32. } else {
  33. return b;
  34. }
  35. }
  36. function max(uint64 a, uint64 b, uint64 c) public returns (uint64) {
  37. if (a > b) {
  38. if (a > c) {
  39. return a;
  40. } else {
  41. return c;
  42. }
  43. } else {
  44. if (b > c) {
  45. return b;
  46. } else {
  47. return c;
  48. }
  49. }
  50. }
  51. }
  52. "#,
  53. |_| {},
  54. );
  55. let addr = src.contracts.last().unwrap();
  56. let arg1: Val = 5_u64.into_val(&src.env);
  57. let arg2: Val = 4_u64.into_val(&src.env);
  58. let res = src.invoke_contract(addr, "max_uint64_uint64", vec![arg1, arg2]);
  59. let expected: Val = 5_u64.into_val(&src.env);
  60. assert!(expected.shallow_eq(&res));
  61. let arg1: Val = 5_u64.into_val(&src.env);
  62. let arg2: Val = 4_u64.into_val(&src.env);
  63. let arg3: Val = 6_u64.into_val(&src.env);
  64. let res = src.invoke_contract(addr, "max_uint64_uint64_uint64", vec![arg1, arg2, arg3]);
  65. let expected: Val = 6_u64.into_val(&src.env);
  66. assert!(expected.shallow_eq(&res));
  67. }
  68. #[test]
  69. fn i128_ops() {
  70. let runtime = build_solidity(
  71. r#"contract math {
  72. function add(int128 a, int128 b) public returns (int128) {
  73. return a + b;
  74. }
  75. function sub(int128 a, int128 b) public returns (int128) {
  76. return a - b;
  77. }
  78. function mul(int128 a, int128 b) public returns (int128) {
  79. return a * b;
  80. }
  81. function div(int128 a, int128 b) public returns (int128) {
  82. return a / b;
  83. }
  84. function mod(int128 a, int128 b) public returns (int128) {
  85. return a % b;
  86. }
  87. }"#,
  88. |_| {},
  89. );
  90. let arg: Val = 5_i128.into_val(&runtime.env);
  91. let arg2: Val = 4_i128.into_val(&runtime.env);
  92. let addr = runtime.contracts.last().unwrap();
  93. let res = runtime.invoke_contract(addr, "add", vec![arg, arg2]);
  94. let expected: Val = 9_i128.into_val(&runtime.env);
  95. assert!(expected.shallow_eq(&res));
  96. let res = runtime.invoke_contract(addr, "sub", vec![arg, arg2]);
  97. let expected: Val = 1_i128.into_val(&runtime.env);
  98. assert!(expected.shallow_eq(&res));
  99. let res = runtime.invoke_contract(addr, "mul", vec![arg, arg2]);
  100. let expected: Val = 20_i128.into_val(&runtime.env);
  101. assert!(expected.shallow_eq(&res));
  102. let res = runtime.invoke_contract(addr, "div", vec![arg, arg2]);
  103. let expected: Val = 1_i128.into_val(&runtime.env);
  104. assert!(expected.shallow_eq(&res));
  105. let res = runtime.invoke_contract(addr, "mod", vec![arg, arg2]);
  106. let expected: Val = 1_i128.into_val(&runtime.env);
  107. assert!(expected.shallow_eq(&res));
  108. }
  109. #[test]
  110. fn u128_ops() {
  111. let runtime = build_solidity(
  112. r#"contract math {
  113. function add(uint128 a, uint128 b) public returns (uint128) {
  114. return a + b;
  115. }
  116. function sub(uint128 a, uint128 b) public returns (uint128) {
  117. return a - b;
  118. }
  119. function mul(uint128 a, uint128 b) public returns (uint128) {
  120. return a * b;
  121. }
  122. function div(uint128 a, uint128 b) public returns (uint128) {
  123. return a / b;
  124. }
  125. function mod(uint128 a, uint128 b) public returns (uint128) {
  126. return a % b;
  127. }
  128. }"#,
  129. |_| {},
  130. );
  131. let arg: Val = 5_u128.into_val(&runtime.env);
  132. let arg2: Val = 4_u128.into_val(&runtime.env);
  133. let addr = runtime.contracts.last().unwrap();
  134. let res = runtime.invoke_contract(addr, "add", vec![arg, arg2]);
  135. let expected: Val = 9_u128.into_val(&runtime.env);
  136. assert!(expected.shallow_eq(&res));
  137. let res = runtime.invoke_contract(addr, "sub", vec![arg, arg2]);
  138. let expected: Val = 1_u128.into_val(&runtime.env);
  139. assert!(expected.shallow_eq(&res));
  140. let res = runtime.invoke_contract(addr, "mul", vec![arg, arg2]);
  141. let expected: Val = 20_u128.into_val(&runtime.env);
  142. assert!(expected.shallow_eq(&res));
  143. let res = runtime.invoke_contract(addr, "div", vec![arg, arg2]);
  144. let expected: Val = 1_u128.into_val(&runtime.env);
  145. assert!(expected.shallow_eq(&res));
  146. let res = runtime.invoke_contract(addr, "mod", vec![arg, arg2]);
  147. let expected: Val = 1_u128.into_val(&runtime.env);
  148. assert!(expected.shallow_eq(&res));
  149. }
  150. #[test]
  151. fn bool_roundtrip() {
  152. let runtime = build_solidity(
  153. r#"
  154. contract test {
  155. function flip(bool x) public returns (bool) {
  156. return !x;
  157. }
  158. }"#,
  159. |_| {},
  160. );
  161. let addr = runtime.contracts.last().unwrap();
  162. let arg_true: Val = true.into_val(&runtime.env);
  163. let res = runtime.invoke_contract(addr, "flip", vec![arg_true]);
  164. let expected: Val = false.into_val(&runtime.env);
  165. assert!(expected.shallow_eq(&res));
  166. }
  167. #[test]
  168. fn u32_roundtrip() {
  169. let runtime = build_solidity(
  170. r#"
  171. contract test {
  172. function id(uint32 x) public returns (uint32) {
  173. return x;
  174. }
  175. }"#,
  176. |_| {},
  177. );
  178. let addr = runtime.contracts.last().unwrap();
  179. let arg: Val = (42_u32).into_val(&runtime.env);
  180. let res = runtime.invoke_contract(addr, "id", vec![arg]);
  181. let expected: Val = (42_u32).into_val(&runtime.env);
  182. assert!(expected.shallow_eq(&res));
  183. }
  184. #[test]
  185. fn u32_ops() {
  186. let runtime = build_solidity(
  187. r#"contract math {
  188. function add(uint32 a, uint32 b) public returns (uint32) {
  189. return a + b;
  190. }
  191. function sub(uint32 a, uint32 b) public returns (uint32) {
  192. return a - b;
  193. }
  194. function mul(uint32 a, uint32 b) public returns (uint32) {
  195. return a * b;
  196. }
  197. function div(uint32 a, uint32 b) public returns (uint32) {
  198. return a / b;
  199. }
  200. function mod(uint32 a, uint32 b) public returns (uint32) {
  201. return a % b;
  202. }
  203. }"#,
  204. |_| {},
  205. );
  206. let arg: Val = 5_u32.into_val(&runtime.env);
  207. let arg2: Val = 4_u32.into_val(&runtime.env);
  208. let addr = runtime.contracts.last().unwrap();
  209. let res = runtime.invoke_contract(addr, "add", vec![arg, arg2]);
  210. let expected: Val = 9_u32.into_val(&runtime.env);
  211. assert!(expected.shallow_eq(&res));
  212. let res = runtime.invoke_contract(addr, "sub", vec![arg, arg2]);
  213. let expected: Val = 1_u32.into_val(&runtime.env);
  214. assert!(expected.shallow_eq(&res));
  215. let res = runtime.invoke_contract(addr, "mul", vec![arg, arg2]);
  216. let expected: Val = 20_u32.into_val(&runtime.env);
  217. assert!(expected.shallow_eq(&res));
  218. let res = runtime.invoke_contract(addr, "div", vec![arg, arg2]);
  219. let expected: Val = 1_u32.into_val(&runtime.env);
  220. assert!(expected.shallow_eq(&res));
  221. let res = runtime.invoke_contract(addr, "mod", vec![arg, arg2]);
  222. let expected: Val = 1_u32.into_val(&runtime.env);
  223. assert!(expected.shallow_eq(&res));
  224. }
  225. #[test]
  226. fn i32_roundtrip() {
  227. let runtime = build_solidity(
  228. r#"
  229. contract test {
  230. function id(int32 x) public returns (int32) {
  231. return x;
  232. }
  233. }"#,
  234. |_| {},
  235. );
  236. let addr = runtime.contracts.last().unwrap();
  237. let arg: Val = (42_i32).into_val(&runtime.env);
  238. let res = runtime.invoke_contract(addr, "id", vec![arg]);
  239. let expected: Val = (42_i32).into_val(&runtime.env);
  240. assert!(expected.shallow_eq(&res));
  241. }
  242. #[test]
  243. fn i32_ops() {
  244. let runtime = build_solidity(
  245. r#"contract math {
  246. function add(int32 a, int32 b) public returns (int32) {
  247. return a + b;
  248. }
  249. function sub(int32 a, int32 b) public returns (int32) {
  250. return a - b;
  251. }
  252. function mul(int32 a, int32 b) public returns (int32) {
  253. return a * b;
  254. }
  255. function div(int32 a, int32 b) public returns (int32) {
  256. return a / b;
  257. }
  258. function mod(int32 a, int32 b) public returns (int32) {
  259. return a % b;
  260. }
  261. }"#,
  262. |_| {},
  263. );
  264. let addr = runtime.contracts.last().unwrap();
  265. let arg: Val = (5_i32).into_val(&runtime.env);
  266. let arg2: Val = (4_i32).into_val(&runtime.env);
  267. let res = runtime.invoke_contract(addr, "add", vec![arg, arg2]);
  268. let expected: Val = (9_i32).into_val(&runtime.env);
  269. assert!(expected.shallow_eq(&res));
  270. let res = runtime.invoke_contract(addr, "sub", vec![arg, arg2]);
  271. let expected: Val = (1_i32).into_val(&runtime.env);
  272. assert!(expected.shallow_eq(&res));
  273. let res = runtime.invoke_contract(addr, "mul", vec![arg, arg2]);
  274. let expected: Val = (20_i32).into_val(&runtime.env);
  275. assert!(expected.shallow_eq(&res));
  276. let res = runtime.invoke_contract(addr, "div", vec![arg, arg2]);
  277. let expected: Val = (1_i32).into_val(&runtime.env);
  278. assert!(expected.shallow_eq(&res));
  279. let res = runtime.invoke_contract(addr, "mod", vec![arg, arg2]);
  280. let expected: Val = (1_i32).into_val(&runtime.env);
  281. assert!(expected.shallow_eq(&res));
  282. }
  283. #[test]
  284. fn i64_roundtrip() {
  285. let runtime = build_solidity(
  286. r#"
  287. contract test {
  288. function id(int64 x) public returns (int64) {
  289. return x;
  290. }
  291. }"#,
  292. |_| {},
  293. );
  294. let addr = runtime.contracts.last().unwrap();
  295. let arg: Val = (-42_i64).into_val(&runtime.env);
  296. let res = runtime.invoke_contract(addr, "id", vec![arg]);
  297. let expected: Val = (-42_i64).into_val(&runtime.env);
  298. assert!(expected.shallow_eq(&res));
  299. }
  300. #[test]
  301. fn i64_ops() {
  302. let runtime = build_solidity(
  303. r#"contract math {
  304. function add(int64 a, int64 b) public returns (int64) { return a + b; }
  305. function sub(int64 a, int64 b) public returns (int64) { return a - b; }
  306. function mul(int64 a, int64 b) public returns (int64) { return a * b; }
  307. function div(int64 a, int64 b) public returns (int64) { return a / b; }
  308. function mod(int64 a, int64 b) public returns (int64) { return a % b; }
  309. }"#,
  310. |_| {},
  311. );
  312. let addr = runtime.contracts.last().unwrap();
  313. let a: Val = (5_i64).into_val(&runtime.env);
  314. let b: Val = (-4_i64).into_val(&runtime.env);
  315. let res = runtime.invoke_contract(addr, "add", vec![a, b]);
  316. let expected: Val = (1_i64).into_val(&runtime.env);
  317. assert!(expected.shallow_eq(&res));
  318. let res = runtime.invoke_contract(addr, "sub", vec![a, b]);
  319. let expected: Val = (9_i64).into_val(&runtime.env);
  320. assert!(expected.shallow_eq(&res));
  321. let res = runtime.invoke_contract(addr, "mul", vec![a, b]);
  322. let expected: Val = (-20_i64).into_val(&runtime.env);
  323. assert!(expected.shallow_eq(&res));
  324. let res = runtime.invoke_contract(addr, "div", vec![a, b]);
  325. let expected: Val = (-1_i64).into_val(&runtime.env);
  326. assert!(expected.shallow_eq(&res));
  327. let res = runtime.invoke_contract(addr, "mod", vec![a, b]);
  328. let expected: Val = (1_i64).into_val(&runtime.env);
  329. assert!(expected.shallow_eq(&res));
  330. }