From 7dbc2d4f258e0edaccbf156ccd1268c571202879 Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Wed, 10 Jun 2020 23:26:37 +0300 Subject: [PATCH] test(abigen): re-enable tests --- ethers-contract/Cargo.toml | 2 +- .../ethers-contract-derive/src/abigen.rs | 130 ++++++++---------- .../ethers-contract-derive/src/lib.rs | 21 ++- 3 files changed, 71 insertions(+), 82 deletions(-) diff --git a/ethers-contract/Cargo.toml b/ethers-contract/Cargo.toml index f7cf2096..231f0957 100644 --- a/ethers-contract/Cargo.toml +++ b/ethers-contract/Cargo.toml @@ -15,7 +15,7 @@ ethers-core = { version = "0.1.0", path = "../ethers-core" } serde = { version = "1.0.110", default-features = false } rustc-hex = { version = "2.1.0", default-features = false } thiserror = { version = "1.0.19", default-features = false } -once_cell = "1.4.0" +once_cell = { version = "1.4.0", default-features = false } tokio = { version = "0.2.21", default-features = false } [dev-dependencies] diff --git a/ethers-contract/ethers-contract-derive/src/abigen.rs b/ethers-contract/ethers-contract-derive/src/abigen.rs index c479bb57..afc98400 100644 --- a/ethers-contract/ethers-contract-derive/src/abigen.rs +++ b/ethers-contract/ethers-contract-derive/src/abigen.rs @@ -107,13 +107,13 @@ impl Parse for Parameter { if !signatures.insert(method.signature.clone()) { return Err(ParseError::new( method.span(), - "duplicate method signature in `ethcontract::contract!` macro invocation", + "duplicate method signature in `abigen!` macro invocation", )); } if !aliases.insert(method.alias.clone()) { return Err(ParseError::new( method.span(), - "duplicate method alias in `ethcontract::contract!` macro invocation", + "duplicate method alias in `abigen!` macro invocation", )); } methods.push(method.into_inner()) @@ -206,13 +206,13 @@ mod tests { }}; } - // macro_rules! contract_args { - // ($($arg:tt)*) => { - // contract_args_result!($($arg)*) - // .expect("failed to parse contract args") - // .into_inner() - // }; - // } + macro_rules! contract_args { + ($($arg:tt)*) => { + contract_args_result!($($arg)*) + .expect("failed to parse contract args") + .into_inner() + }; + } macro_rules! contract_args_err { ($($arg:tt)*) => { @@ -229,77 +229,69 @@ mod tests { } } - // #[test] - // fn parse_contract_args() { - // let args = contract_args!("path/to/artifact.json"); - // assert_eq!(args.artifact_path, "path/to/artifact.json"); - // } + #[test] + fn parse_contract_args() { + let args = contract_args!(TestContract, "path/to/abi.json"); + assert_eq!(args.name, "TestContract"); + assert_eq!(args.abi, "path/to/abi.json"); + } - // #[test] - // fn crate_parameter_accepts_keywords() { - // let args = contract_args!("artifact.json", crate = crate); - // assert_eq!(args.parameters, &[Parameter::Crate("crate".into())]); - // } + #[test] + fn parse_contract_args_with_defaults() { + let args = contract_args!(TestContract, "[{}]"); + assert_eq!( + args, + ContractArgs { + name: "TestContract".to_string(), + abi: "[{}]".to_string(), + parameters: vec![], + }, + ); + } - // TODO: Re-enable these tests once we figure out which syntax we prefer for the macro - // #[test] - // fn parse_contract_args_with_defaults() { - // let args = contract_args!("artifact.json"); - // assert_eq!( - // args, - // ContractArgs { - // visibility: None, - // parameters: vec![], - // }, - // ); - // } - - // #[test] - // fn parse_contract_args_with_parameters() { - // let args = contract_args!( - // pub(crate) "artifact.json", - // crate = foobar, - // mod = contract, - // contract = Contract, - // methods { - // myMethod(uint256, bool) as my_renamed_method; - // myOtherMethod() as my_other_renamed_method; - // }, - // event_derives (Asdf, a::B, a::b::c::D) - // ); - // assert_eq!( - // args, - // ContractArgs { - // visibility: Some(quote!(pub(crate)).to_string()), - // parameters: vec![ - // Parameter::Crate("foobar".into()), - // Parameter::Mod("contract".into()), - // // Parameter::Contract("Contract".into()), - // Parameter::Methods(vec![ - // method("myMethod(uint256,bool)", "my_renamed_method"), - // method("myOtherMethod()", "my_other_renamed_method"), - // ]), - // Parameter::EventDerives(vec![ - // "Asdf".into(), - // "a :: B".into(), - // "a :: b :: c :: D".into() - // ]) - // ], - // }, - // ); - // } + #[test] + fn parse_contract_args_with_parameters() { + let args = contract_args!( + TestContract, + "abi.json", + methods { + myMethod(uint256, bool) as my_renamed_method; + myOtherMethod() as my_other_renamed_method; + }, + event_derives (Asdf, a::B, a::b::c::D) + ); + assert_eq!( + args, + ContractArgs { + name: "TestContract".to_string(), + abi: "abi.json".to_string(), + parameters: vec![ + // Parameter::Contract("Contract".into()), + Parameter::Methods(vec![ + method("myMethod(uint256,bool)", "my_renamed_method"), + method("myOtherMethod()", "my_other_renamed_method"), + ]), + Parameter::EventDerives(vec![ + "Asdf".into(), + "a :: B".into(), + "a :: b :: c :: D".into() + ]) + ], + }, + ); + } #[test] fn duplicate_method_rename_error() { contract_args_err!( - "artifact.json", + "abi.json", methods { myMethod(uint256) as my_method_1; myMethod(uint256) as my_method_2; } ); contract_args_err!( - "artifact.json", + "abi.json", methods { myMethod1(uint256) as my_method; myMethod2(uint256) as my_method; @@ -310,7 +302,7 @@ mod tests { #[test] fn method_invalid_method_parameter_type() { contract_args_err!( - "artifact.json", + "abi.json", methods { myMethod(invalid) as my_method; } diff --git a/ethers-contract/ethers-contract-derive/src/lib.rs b/ethers-contract/ethers-contract-derive/src/lib.rs index 31badd61..4e96dfe4 100644 --- a/ethers-contract/ethers-contract-derive/src/lib.rs +++ b/ethers-contract/ethers-contract-derive/src/lib.rs @@ -15,19 +15,19 @@ use syn::{parse::Error, parse_macro_input}; /// an Ethereum contract ABI or a path. Note that this path is rooted in /// the crate's root `CARGO_MANIFEST_DIR`. /// -/// ```ignore +/// # Examples +/// +/// ```no_run +/// // ABI Path /// abigen!(MyContract, "MyContract.json"); -/// ``` /// -/// Alternatively, other sources may be used, for full details consult the -/// `ethcontract-generate::source` documentation. Some basic examples: -/// -/// ```ignore /// // HTTP(S) source /// abigen!(MyContract, "https://my.domain.local/path/to/contract.json") +/// /// // Etherscan.io /// abigen!(MyContract, "etherscan:0x0001020304050607080910111213141516171819"); /// abigen!(MyContract, "https://etherscan.io/address/0x0001020304050607080910111213141516171819"); +/// /// // npmjs /// abigen!(MyContract, "npm:@org/package@1.0.0/path/to/contract.json") /// ``` @@ -45,19 +45,16 @@ use syn::{parse::Error, parse_macro_input}; /// - `event_derives`: A list of additional derives that should be added to /// contract event structs and enums. /// -/// ```ignore +/// ```no_run /// abigen!( -/// MyContractInstance, -/// "build/contracts/MyContract.json", +/// MyContract, +/// "path/to/MyContract.json", /// methods { /// myMethod(uint256,bool) as my_renamed_method; /// }, /// event_derives (serde::Deserialize, serde::Serialize), /// ); /// ``` -/// -/// See [`ethers-contract-abigen`](ethers-contract-abigen) module level documentation for additional -/// information. #[proc_macro] pub fn abigen(input: TokenStream) -> TokenStream { let args = parse_macro_input!(input as Spanned);