rational.rs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. // SPDX-License-Identifier: Apache-2.0
  2. use crate::{build_solidity, BorshToken};
  3. use num_bigint::BigInt;
  4. use num_traits::Zero;
  5. #[test]
  6. fn rational() {
  7. let mut vm = build_solidity(
  8. r#"
  9. contract foo {
  10. function test() public returns (uint) {
  11. uint x = .5 * 8;
  12. return x;
  13. }
  14. function test2() public returns (uint) {
  15. uint x = .4 * 8 + 0.8;
  16. return x;
  17. }
  18. }"#,
  19. );
  20. vm.constructor(&[]);
  21. let returns = vm.function("test", &[]).unwrap();
  22. assert_eq!(
  23. returns,
  24. BorshToken::Uint {
  25. width: 256,
  26. value: BigInt::from(4u8)
  27. }
  28. );
  29. let returns = vm.function("test2", &[]).unwrap();
  30. assert_eq!(
  31. returns,
  32. BorshToken::Uint {
  33. width: 256,
  34. value: BigInt::from(4u8)
  35. }
  36. );
  37. let mut vm = build_solidity(
  38. r#"
  39. contract foo {
  40. function test() public returns (uint) {
  41. uint x = 4.8 + 0.2;
  42. return x;
  43. }
  44. }"#,
  45. );
  46. vm.constructor(&[]);
  47. let returns = vm.function("test", &[]).unwrap();
  48. assert_eq!(
  49. returns,
  50. BorshToken::Uint {
  51. width: 256,
  52. value: BigInt::from(5u8)
  53. }
  54. );
  55. let mut vm = build_solidity(
  56. r#"
  57. contract foo {
  58. function test() public returns (uint) {
  59. uint x = 4.8 / 0.2;
  60. return x;
  61. }
  62. }"#,
  63. );
  64. vm.constructor(&[]);
  65. let returns = vm.function("test", &[]).unwrap();
  66. assert_eq!(
  67. returns,
  68. BorshToken::Uint {
  69. width: 256,
  70. value: BigInt::from(24)
  71. }
  72. );
  73. let mut vm = build_solidity(
  74. r#"
  75. contract foo {
  76. function test() public returns (uint) {
  77. uint x = 4.8 % 0.2;
  78. return x;
  79. }
  80. }"#,
  81. );
  82. vm.constructor(&[]);
  83. let returns = vm.function("test", &[]).unwrap();
  84. assert_eq!(
  85. returns,
  86. BorshToken::Uint {
  87. width: 256,
  88. value: BigInt::zero(),
  89. }
  90. );
  91. let mut vm = build_solidity(
  92. r#"
  93. contract foo {
  94. function test() public returns (uint) {
  95. uint x = 5.2 - 1.2;
  96. return x;
  97. }
  98. }"#,
  99. );
  100. vm.constructor(&[]);
  101. let returns = vm.function("test", &[]).unwrap();
  102. assert_eq!(
  103. returns,
  104. BorshToken::Uint {
  105. width: 256,
  106. value: BigInt::from(4u8),
  107. }
  108. );
  109. let mut vm = build_solidity(
  110. r#"
  111. contract foo {
  112. function test() public returns (uint) {
  113. return 1.4 + 1.6;
  114. }
  115. }"#,
  116. );
  117. vm.constructor(&[]);
  118. let returns = vm.function("test", &[]).unwrap();
  119. assert_eq!(
  120. returns,
  121. BorshToken::Uint {
  122. width: 256,
  123. value: BigInt::from(3u8)
  124. }
  125. );
  126. let mut vm = build_solidity(
  127. r#"
  128. contract foo {
  129. function test() public returns (uint) {
  130. return 1.4e4 + 1.6e3;
  131. }
  132. }"#,
  133. );
  134. vm.constructor(&[]);
  135. let returns = vm.function("test", &[]).unwrap();
  136. assert_eq!(
  137. returns,
  138. BorshToken::Uint {
  139. width: 256,
  140. value: BigInt::from(15600u32)
  141. }
  142. );
  143. let mut vm = build_solidity(
  144. r#"
  145. contract foo {
  146. function test(uint64 x) public returns (uint64, uint) {
  147. return (x * 961748941, 2.5 + 3.5 - 1);
  148. }
  149. }"#,
  150. );
  151. vm.constructor(&[]);
  152. let returns = vm
  153. .function(
  154. "test",
  155. &[BorshToken::Uint {
  156. width: 64,
  157. value: BigInt::from(982451653u32),
  158. }],
  159. )
  160. .unwrap()
  161. .unwrap_tuple();
  162. assert_eq!(
  163. returns,
  164. vec![
  165. BorshToken::Uint {
  166. width: 64,
  167. value: BigInt::from(961748941u64 * 982451653u64)
  168. },
  169. BorshToken::Uint {
  170. width: 256,
  171. value: BigInt::from(5u8)
  172. },
  173. ]
  174. );
  175. }