abi.rs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // SPDX-License-Identifier: Apache-2.0
  2. use crate::{build_wasm, load_abi};
  3. use ink_metadata::{InkProject, TypeSpec};
  4. use once_cell::sync::Lazy;
  5. use scale_info::form::PortableForm;
  6. use std::sync::Mutex;
  7. /// Partially mimicking the ink! "mother" integration test.
  8. static MOTHER: Lazy<Mutex<(InkProject, InkProject)>> = Lazy::new(|| {
  9. let src = r##"
  10. import "substrate";
  11. contract Mother {
  12. enum Status {
  13. NotStarted,
  14. OpeningPeriod
  15. }
  16. struct Auction {
  17. string name;
  18. Hash subject;
  19. uint64[3] terms;
  20. Status status;
  21. bool finalized;
  22. bytes vector;
  23. }
  24. Auction auction;
  25. mapping(address => uint128) balances;
  26. function echo_auction(Auction _auction) public pure returns (Auction) {
  27. return _auction;
  28. }
  29. }"##;
  30. let solang_abi = load_abi(&build_wasm(src, false, false)[0].1);
  31. let ink_str = std::fs::read_to_string("testdata/ink/mother.json").unwrap();
  32. let ink_abi: InkProject = serde_json::from_str(&ink_str).unwrap();
  33. Mutex::new((solang_abi, ink_abi))
  34. });
  35. fn eq_display(a: &TypeSpec<PortableForm>, b: &TypeSpec<PortableForm>) {
  36. assert_eq!(a.display_name(), b.display_name());
  37. }
  38. #[test]
  39. fn environment_matches_ink() {
  40. let mother = MOTHER.lock().unwrap();
  41. let (solang, ink) = (mother.0.spec().environment(), mother.1.spec().environment());
  42. eq_display(solang.timestamp(), ink.timestamp());
  43. eq_display(solang.account_id(), ink.account_id());
  44. eq_display(solang.hash(), ink.hash());
  45. eq_display(solang.balance(), ink.balance());
  46. eq_display(solang.block_number(), ink.block_number());
  47. assert_eq!(solang.max_event_topics(), ink.max_event_topics());
  48. }
  49. #[test]
  50. fn address_type_path_exists() {
  51. let mother = MOTHER.lock().unwrap();
  52. let (solang, ink) = (mother.0.registry(), mother.1.registry());
  53. let ink_address = &ink.types[8].ty.path;
  54. assert!(solang.types.iter().any(|t| &t.ty.path == ink_address));
  55. }
  56. #[test]
  57. fn hash_type_path_exists() {
  58. let mother = MOTHER.lock().unwrap();
  59. let (solang, ink) = (mother.0.registry(), mother.1.registry());
  60. let ink_hash = &ink.types[1].ty.path;
  61. assert!(solang.types.iter().any(|t| &t.ty.path == ink_hash));
  62. }