first.rs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // SPDX-License-Identifier: Apache-2.0
  2. use parity_scale_codec::{Decode, Encode};
  3. use crate::build_solidity;
  4. #[test]
  5. fn simple_solidiy_compile_and_run() {
  6. #[derive(Debug, PartialEq, Eq, Encode, Decode)]
  7. struct FooReturn {
  8. value: u32,
  9. }
  10. // parse
  11. let mut runtime = build_solidity(
  12. "
  13. contract test {
  14. function foo() public returns (uint32) {
  15. return 2;
  16. }
  17. }",
  18. );
  19. runtime.function("foo", Vec::new());
  20. let ret = FooReturn { value: 2 };
  21. assert_eq!(runtime.output(), ret.encode());
  22. }
  23. #[test]
  24. fn flipper() {
  25. // parse
  26. let mut runtime = build_solidity(
  27. "
  28. contract flipper {
  29. bool private value;
  30. constructor(bool initvalue) public {
  31. value = initvalue;
  32. }
  33. function flip() public {
  34. value = !value;
  35. }
  36. function get() public view returns (bool) {
  37. return value;
  38. }
  39. }
  40. ",
  41. );
  42. runtime.function("get", Vec::new());
  43. assert_eq!(runtime.output(), false.encode());
  44. runtime.function("flip", Vec::new());
  45. runtime.function("flip", Vec::new());
  46. runtime.function("flip", Vec::new());
  47. runtime.function("get", Vec::new());
  48. assert_eq!(runtime.output(), true.encode());
  49. }
  50. #[test]
  51. fn contract_storage_initializers() {
  52. #[derive(Debug, PartialEq, Eq, Encode, Decode)]
  53. struct FooReturn {
  54. value: u32,
  55. }
  56. // parse
  57. let mut runtime = build_solidity(
  58. "
  59. contract test {
  60. uint32 a = 100;
  61. uint32 b = 200;
  62. constructor() public {
  63. b = 300;
  64. }
  65. function foo() public returns (uint32) {
  66. return a + b;
  67. }
  68. }",
  69. );
  70. runtime.constructor(0, Vec::new());
  71. runtime.function("foo", Vec::new());
  72. let ret = FooReturn { value: 400 };
  73. assert_eq!(runtime.output(), ret.encode());
  74. }
  75. #[test]
  76. fn contract_constants() {
  77. #[derive(Debug, PartialEq, Eq, Encode, Decode)]
  78. struct FooReturn {
  79. value: u32,
  80. }
  81. // parse
  82. let mut runtime = build_solidity(
  83. "
  84. contract test {
  85. uint32 constant a = 300 + 100;
  86. function foo() public pure returns (uint32) {
  87. uint32 ret = a;
  88. return ret;
  89. }
  90. }",
  91. );
  92. runtime.constructor(0, Vec::new());
  93. runtime.function("foo", Vec::new());
  94. let ret = FooReturn { value: 400 };
  95. assert_eq!(runtime.output(), ret.encode());
  96. }
  97. #[test]
  98. fn large_contract_variables() {
  99. #[derive(Debug, PartialEq, Eq, Encode, Decode)]
  100. struct ValBool(u8);
  101. // parse
  102. let mut runtime = build_solidity("
  103. contract test {
  104. int constant large = 0x7fff0000_7fff0000_7fff0000_7fff0000__7fff0000_7fff0000_7fff0000_7fff0000;
  105. int bar = large + 10;
  106. function foo() public view returns (int) {
  107. return (bar - 10);
  108. }
  109. }",
  110. );
  111. runtime.constructor(0, Vec::new());
  112. runtime.function("foo", Vec::new());
  113. assert_eq!(runtime.output(), b"\x00\x00\xff\x7f\x00\x00\xff\x7f\x00\x00\xff\x7f\x00\x00\xff\x7f\x00\x00\xff\x7f\x00\x00\xff\x7f\x00\x00\xff\x7f\x00\x00\xff\x7f");
  114. }
  115. #[test]
  116. fn assert_ok() {
  117. // parse
  118. let mut runtime = build_solidity(
  119. "
  120. contract test {
  121. function foo() public pure returns (uint32) {
  122. assert(true);
  123. return 0;
  124. }
  125. }",
  126. );
  127. runtime.constructor(0, Vec::new());
  128. runtime.function("foo", Vec::new());
  129. }
  130. #[test]
  131. #[should_panic]
  132. fn assert_not_ok() {
  133. // parse
  134. let mut runtime = build_solidity(
  135. "
  136. contract test {
  137. function foo() public pure returns (uint32) {
  138. assert(false);
  139. return 0;
  140. }
  141. }",
  142. );
  143. runtime.constructor(0, Vec::new());
  144. runtime.function("foo", Vec::new());
  145. }