diff --git a/.gitignore b/.gitignore index 69fabff..9fed2f0 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ node.json artifacts target Scarb.lock +.tool-versions # nile 127.0.0.1.* @@ -26,6 +27,9 @@ build .DS_Store +# Starknet foundry +.snfoundry_cache + # deployment tmp .tmp* diff --git a/Scarb.toml b/Scarb.toml index 0199694..e056317 100644 --- a/Scarb.toml +++ b/Scarb.toml @@ -9,7 +9,11 @@ starknet = ">=2.5.3" alexandria_storage = { git = "https://github.com/keep-starknet-strange/alexandria", tag = "cairo-v2.5.4" } alexandria_numeric = { git = "https://github.com/keep-starknet-strange/alexandria", tag = "cairo-v2.5.4" } openzeppelin = { git = "https://github.com/cloudvenger/cairo-contracts.git", tag = "oz-cairo-2.5.3" } +snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry", tag = "v0.17.1" } + +[scripts] +test = "snforge test" [[target.starknet-contract]] sierra = true -casm = false \ No newline at end of file +casm = true diff --git a/tests/lib.cairo b/tests/lib.cairo new file mode 100644 index 0000000..b9de42c --- /dev/null +++ b/tests/lib.cairo @@ -0,0 +1 @@ +mod test_project; diff --git a/tests/test_project.cairo b/tests/test_project.cairo new file mode 100644 index 0000000..42a8837 --- /dev/null +++ b/tests/test_project.cairo @@ -0,0 +1,80 @@ +// Starknet deps + +use starknet::ContractAddress; + +// External deps + +use openzeppelin::tests::utils::constants as c; +use openzeppelin::utils::serde::SerializedAppend; +use snforge_std as snf; +use snforge_std::{CheatTarget, ContractClassTrait, EventSpy, SpyOn}; +use alexandria_storage::list::{List, ListTrait}; + +// Components + +use carbon_v3::components::absorber::interface::{ + IAbsorber, IAbsorberDispatcher, IAbsorberDispatcherTrait, ICarbonCredits, + ICarbonCreditsDispatcher, ICarbonCreditsDispatcherTrait +}; +use carbon_v3::components::minter::interface::{IMint, IMintDispatcher, IMintDispatcherTrait}; + +// Contracts + +use carbon_v3::contracts::project::{ + Project, IExternalDispatcher as IProjectDispatcher, + IExternalDispatcherTrait as IProjectDispatcherTrait +}; + +/// Deploys a project contract. +fn deploy_project(owner: felt252) -> (ContractAddress, EventSpy) { + let contract = snf::declare('Project'); + let uri: ByteArray = "uri"; + let mut calldata: Array = array![]; + calldata.append_serde(uri.into()); + calldata.append_serde(c::OWNER()); + let contract_address = contract.deploy(@calldata).unwrap(); + + let mut spy = snf::spy_events(SpyOn::One(contract_address)); + + (contract_address, spy) +} + +/// Sets up the project contract. +fn setup_project( + contract_address: ContractAddress, + ton_equivalent: u64, + project_value: u256, + times: Span, + absorptions: Span +) { + let project = IAbsorberDispatcher { contract_address }; + + project.set_absorptions(times, absorptions); + project.set_project_value(project_value); + snf::store( + contract_address, + selector!("Absorber_ton_equivalent"), + array![ton_equivalent.into()].span(), + ); // Only way to set ton equivalent for the moment (TO CHANGE) +} + +#[test] +fn test_constructor_ok() { + let (_project_address, _spy) = deploy_project(c::OWNER().into()); +} + +#[test] +fn test_is_setup() { + let (project_address, _) = deploy_project(c::OWNER().into()); + let project = IAbsorberDispatcher { contract_address: project_address }; + + setup_project( + project_address, + 1000000, + 121099000000, + array![21, 674579600, 1706115600, 1737738000].span(), + array![21, 29609535, 47991466, 88828605].span(), + ); + + assert(project.is_setup(), 'Error during setup'); +}