strings.rs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // SPDX-License-Identifier: Apache-2.0
  2. use crate::{build_solidity, BorshToken};
  3. use num_bigint::BigInt;
  4. use num_traits::{One, Zero};
  5. #[test]
  6. fn storage_string_length() {
  7. let mut vm = build_solidity(
  8. r#"
  9. contract Testing {
  10. string st;
  11. function setString(string input) public {
  12. st = input;
  13. }
  14. function getLength() public view returns (uint32) {
  15. return st.length;
  16. }
  17. }
  18. "#,
  19. );
  20. vm.constructor(&[]);
  21. let _ = vm.function(
  22. "setString",
  23. &[BorshToken::String("coffee_tastes_good".to_string())],
  24. );
  25. let returns = vm.function("getLength", &[]).unwrap();
  26. assert_eq!(
  27. returns,
  28. BorshToken::Uint {
  29. width: 32,
  30. value: BigInt::from(18u8),
  31. }
  32. );
  33. }
  34. #[test]
  35. fn load_string_vector() {
  36. let mut vm = build_solidity(
  37. r#"
  38. contract Testing {
  39. string[] string_vec;
  40. function testLength() public returns (uint32, uint32, uint32) {
  41. string_vec.push("tea");
  42. string_vec.push("coffe");
  43. string_vec.push("sixsix");
  44. string[] memory rr = string_vec;
  45. return (rr[0].length, rr[1].length, rr[2].length);
  46. }
  47. function getString(uint32 index) public view returns (string memory) {
  48. string[] memory rr = string_vec;
  49. return rr[index];
  50. }
  51. }
  52. "#,
  53. );
  54. vm.constructor(&[]);
  55. let returns = vm.function("testLength", &[]).unwrap().unwrap_tuple();
  56. assert_eq!(
  57. returns[0],
  58. BorshToken::Uint {
  59. width: 32,
  60. value: BigInt::from(3u8),
  61. }
  62. );
  63. assert_eq!(
  64. returns[1],
  65. BorshToken::Uint {
  66. width: 32,
  67. value: BigInt::from(5u8),
  68. }
  69. );
  70. assert_eq!(
  71. returns[2],
  72. BorshToken::Uint {
  73. width: 32,
  74. value: BigInt::from(6u8),
  75. }
  76. );
  77. let returns = vm
  78. .function(
  79. "getString",
  80. &[BorshToken::Uint {
  81. width: 32,
  82. value: BigInt::zero(),
  83. }],
  84. )
  85. .unwrap();
  86. assert_eq!(returns, BorshToken::String("tea".to_string()));
  87. let returns = vm
  88. .function(
  89. "getString",
  90. &[BorshToken::Uint {
  91. width: 32,
  92. value: BigInt::one(),
  93. }],
  94. )
  95. .unwrap();
  96. assert_eq!(returns, BorshToken::String("coffe".to_string()));
  97. let returns = vm
  98. .function(
  99. "getString",
  100. &[BorshToken::Uint {
  101. width: 32,
  102. value: BigInt::from(2u8),
  103. }],
  104. )
  105. .unwrap();
  106. assert_eq!(returns, BorshToken::String("sixsix".to_string()));
  107. }