git.delta.rocks / unique-network / refs/commits / efe1d7b29799

difftreelog

NFTPAR-183: Storage Refactoring. Decimal points u32 -> u8. Also extended decimal points limit 4 -> 30.

sotmorskiy2020-12-10parent: #e7d3521.patch.diff
in: master

2 files changed

modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -45,21 +45,25 @@
 
 mod default_weights;
 
+pub const MAX_DECIMAL_POINTS: DecimalPoints = 30;
+
 // Structs
 // #region
 
 pub type CollectionId = u32;
 pub type TokenId = u32;
 
+pub type DecimalPoints = u8;
+
 #[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
 #[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
 pub enum CollectionMode {
     Invalid,
     NFT,
     // decimal points
-    Fungible(u32),
+    Fungible(DecimalPoints),
     // decimal points
-    ReFungible(u32),
+    ReFungible(DecimalPoints),
 }
 
 impl Into<u8> for CollectionMode {
@@ -104,7 +108,7 @@
     pub owner: AccountId,
     pub mode: CollectionMode,
     pub access: AccessMode,
-    pub decimal_points: u32,
+    pub decimal_points: DecimalPoints,
     pub name: Vec<u16>,        // 64 include null escape char
     pub description: Vec<u16>, // 256 include null escape char
     pub token_prefix: Vec<u8>, // 16 include null escape char
@@ -269,7 +273,7 @@
 	pub enum Error for Module<T: Trait> {
         /// Total collections bound exceeded.
         TotalCollectionsLimitExceeded,
-		/// Decimal_points parameter must be lower than 4.
+		/// Decimal_points parameter must be lower than MAX_DECIMAL_POINTS constant, currently it is 30.
         CollectionDecimalPointLimitExceeded, 
         /// Collection name can not be longer than 63 char.
         CollectionNameLimitExceeded, 
@@ -498,7 +502,7 @@
             ensure!(CollectionCount::get() < ChainLimit::get().collection_numbers_limit, Error::<T>::TotalCollectionsLimitExceeded);
 
             // check params
-            ensure!(decimal_points <= 4, Error::<T>::CollectionDecimalPointLimitExceeded);
+            ensure!(decimal_points <= MAX_DECIMAL_POINTS, Error::<T>::CollectionDecimalPointLimitExceeded);
 
             let mut name = collection_name.to_vec();
             name.push(0);
@@ -1461,14 +1465,14 @@
                 let item = FungibleItemType {
                     collection: collection_id,
                     owner,
-                    value: (10 as u128).pow(collection.decimal_points)
+                    value: (10 as u128).pow(collection.decimal_points as u32)
                 };
 
                 Self::add_fungible_item(item)?;
             },
             CreateItemData::ReFungible(data) => {
                 let mut owner_list = Vec::new();
-                let value = (10 as u128).pow(collection.decimal_points);
+                let value = (10 as u128).pow(collection.decimal_points as u32);
                 owner_list.push(Ownership {owner: owner.clone(), fraction: value});
 
                 let item = ReFungibleItemType {
@@ -1982,8 +1986,8 @@
     fn init_collection(item: &CollectionType<T::AccountId>) {
         // check params
         assert!(
-            item.decimal_points <= 4,
-            "decimal_points parameter must be lower than 4"
+            item.decimal_points <= MAX_DECIMAL_POINTS,
+            "decimal_points parameter must be lower than MAX_DECIMAL_POINTS"
         );
         assert!(
             item.name.len() <= 64,
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
before · pallets/nft/src/tests.rs
1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, ApprovePermissions, CollectionMode,5    Ownership, ChainLimits, CreateItemData, CreateNftData, CreateFungibleData, CreateReFungibleData,6    CollectionId, TokenId}; //Err7use frame_support::{assert_noop, assert_ok};8use frame_system::{ RawOrigin };910fn default_collection_numbers_limit() -> u32 {11    1012}1314fn default_limits() {15    assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 16            collection_numbers_limit: default_collection_numbers_limit(),17            account_token_ownership_limit: 10,18            collections_admins_limit: 5,19            custom_data_limit: 2048,20            nft_sponsor_transfer_timeout: 15,21            fungible_sponsor_transfer_timeout: 15,22            refungible_sponsor_transfer_timeout: 15,          23        }));24}2526fn default_nft_data() -> CreateNftData {27    CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }28}2930fn default_fungible_data () -> CreateFungibleData {31    CreateFungibleData { }32}3334fn default_re_fungible_data () -> CreateReFungibleData {35    CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }36}3738fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: CollectionId) -> CollectionId {39    let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();40    let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();41    let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4243    let origin1 = Origin::signed(owner);44    assert_ok!(TemplateModule::create_collection(45            origin1.clone(),46            col_name1.clone(),47            col_desc1.clone(),48            token_prefix1.clone(),49            mode.clone()50        ));5152    let saved_col_name: Vec<u16> = "Test1\0\0".encode_utf16().collect::<Vec<u16>>();53    let saved_description: Vec<u16> = "TestDescription1\0\0".encode_utf16().collect::<Vec<u16>>();54    let saved_prefix: Vec<u8> = b"token_prefix1\0\0".to_vec();55    assert_eq!(TemplateModule::collection(id).owner, owner);56    assert_eq!(TemplateModule::collection(id).name, saved_col_name);57    assert_eq!(TemplateModule::collection(id).mode, *mode);58    assert_eq!(TemplateModule::collection(id).description, saved_description);59    assert_eq!(TemplateModule::collection(id).token_prefix, saved_prefix);60    id61}6263fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {64    create_test_collection_for_owner(&mode, 1, id)65}6667fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {68    let origin1 = Origin::signed(1);69    assert_ok!(TemplateModule::create_item(70            origin1.clone(),71            collection_id,72            1,73            data.clone()74        ));7576}7778// Use cases tests region79// #region80#[test]81fn create_nft_item() {82    new_test_ext().execute_with(|| {83        default_limits();84        let collection_id = create_test_collection(&CollectionMode::NFT, 1);85        86        let data = default_nft_data();87        create_test_item(collection_id, &data.clone().into());88        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);89        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);90    });91}9293// Use cases tests region94// #region95#[test]96fn create_nft_multiple_items() {97    new_test_ext().execute_with(|| {98        default_limits();99        100        create_test_collection(&CollectionMode::NFT, 1);101102        let origin1 = Origin::signed(1);103104        let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];105106        assert_ok!(TemplateModule::create_multiple_items(107            origin1.clone(),108            1,109            1,110            items_data.clone().into_iter().map(|d| { d.into() }).collect()111        ));112        for (index, data) in items_data.iter().enumerate() {113            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).const_data.to_vec(), data.const_data);114            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).variable_data.to_vec(), data.variable_data);115        }116    });117}118119#[test]120fn create_refungible_item() {121    new_test_ext().execute_with(|| {122        default_limits();123        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);124125        let data = default_re_fungible_data();126        create_test_item(collection_id, &data.clone().into());127        assert_eq!(128            TemplateModule::refungible_item_id(collection_id, 1).const_data,129            data.const_data130        );131        assert_eq!(132            TemplateModule::refungible_item_id(collection_id, 1).variable_data,133            data.variable_data134        );135        assert_eq!(136            TemplateModule::refungible_item_id(collection_id, 1).owner[0],137            Ownership {138                owner: 1,139                fraction: 1000140            }141        );142    });143}144145#[test]146fn create_multiple_refungible_items() {147    new_test_ext().execute_with(|| {148        default_limits();149        150        create_test_collection(&CollectionMode::ReFungible(3), 1);151152        let origin1 = Origin::signed(1);153154        let items_data = vec![default_re_fungible_data(), default_re_fungible_data(), default_re_fungible_data()];155156        assert_ok!(TemplateModule::create_multiple_items(157            origin1.clone(),158            1,159            1,160            items_data.clone().into_iter().map(|d| { d.into() }).collect()161        ));162        for (index, data) in items_data.iter().enumerate() {163164            let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId);165            assert_eq!(item.const_data.to_vec(), data.const_data);166            assert_eq!(item.variable_data.to_vec(), data.variable_data);167            assert_eq!(168                item.owner[0],169                Ownership {170                    owner: 1,171                    fraction: 1000172                }173            );174        }175    });176}177178#[test]179fn create_fungible_item() {180    new_test_ext().execute_with(|| {181        default_limits();182        183        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);184185        let data = default_fungible_data();186        create_test_item(collection_id, &data.into());187188        assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);189    });190}191192#[test]193fn create_multiple_fungible_items() {194    new_test_ext().execute_with(|| {195        default_limits();196197        create_test_collection(&CollectionMode::Fungible(3), 1);198199        let origin1 = Origin::signed(1);200201        let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];202203        assert_ok!(TemplateModule::create_multiple_items(204            origin1.clone(),205            1,206            1,207            items_data.clone().into_iter().map(|d| { d.into() }).collect()208        ));209        210        for (index, _) in items_data.iter().enumerate() {211            assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).owner, 1);212        }213        assert_eq!(TemplateModule::balance_count(1, 1), 3000);214        assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);215    });216}217218#[test]219fn transfer_fungible_item() {220    new_test_ext().execute_with(|| {221        default_limits();222        223        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);224225        let origin1 = Origin::signed(1);226        let origin2 = Origin::signed(2);227228        let data = default_fungible_data();229        create_test_item(collection_id, &data.into());230231        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);232        assert_eq!(TemplateModule::balance_count(1, 1), 1000);233        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);234235        // change owner scenario236        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));237        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);238        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);239        assert_eq!(TemplateModule::balance_count(1, 1), 0);240        assert_eq!(TemplateModule::balance_count(1, 2), 1000);241        // assert_eq!(TemplateModule::address_tokens(1, 1), []);242        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);243244        // split item scenario245        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));246        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);247        assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);248        assert_eq!(TemplateModule::balance_count(1, 2), 500);249        assert_eq!(TemplateModule::balance_count(1, 3), 500);250        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);251        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);252253        // split item and new owner has account scenario254        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));255        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);256        assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);257        assert_eq!(TemplateModule::balance_count(1, 2), 300);258        assert_eq!(TemplateModule::balance_count(1, 3), 700);259        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);260        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);261    });262}263264#[test]265fn transfer_refungible_item() {266    new_test_ext().execute_with(|| {267        default_limits();268        269        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);270271        let data = default_re_fungible_data();272        create_test_item(collection_id, &data.clone().into());273274        let origin1 = Origin::signed(1);275        let origin2 = Origin::signed(2);276        assert_eq!(277            TemplateModule::refungible_item_id(collection_id, 1).const_data,278            data.const_data279        );280        assert_eq!(281            TemplateModule::refungible_item_id(collection_id, 1).variable_data,282            data.variable_data283        );284        assert_eq!(285            TemplateModule::refungible_item_id(collection_id, 1).owner[0],286            Ownership {287                owner: 1,288                fraction: 1000289            }290        );291        assert_eq!(TemplateModule::balance_count(1, 1), 1000);292        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);293294        // change owner scenario295        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));296        assert_eq!(297            TemplateModule::refungible_item_id(1, 1).owner[0],298            Ownership {299                owner: 2,300                fraction: 1000301            }302        );303        assert_eq!(TemplateModule::balance_count(1, 1), 0);304        assert_eq!(TemplateModule::balance_count(1, 2), 1000);305        // assert_eq!(TemplateModule::address_tokens(1, 1), []);306        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);307308        // split item scenario309        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));310        assert_eq!(311            TemplateModule::refungible_item_id(1, 1).owner[0],312            Ownership {313                owner: 2,314                fraction: 500315            }316        );317        assert_eq!(318            TemplateModule::refungible_item_id(1, 1).owner[1],319            Ownership {320                owner: 3,321                fraction: 500322            }323        );324        assert_eq!(TemplateModule::balance_count(1, 2), 500);325        assert_eq!(TemplateModule::balance_count(1, 3), 500);326        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);327        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);328329        // split item and new owner has account scenario330        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));331        assert_eq!(332            TemplateModule::refungible_item_id(1, 1).owner[0],333            Ownership {334                owner: 2,335                fraction: 300336            }337        );338        assert_eq!(339            TemplateModule::refungible_item_id(1, 1).owner[1],340            Ownership {341                owner: 3,342                fraction: 700343            }344        );345        assert_eq!(TemplateModule::balance_count(1, 2), 300);346        assert_eq!(TemplateModule::balance_count(1, 3), 700);347        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);348        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);349    });350}351352#[test]353fn transfer_nft_item() {354    new_test_ext().execute_with(|| {355        default_limits();356        357        let collection_id = create_test_collection(&CollectionMode::NFT, 1);358359        let data = default_nft_data();360        create_test_item(collection_id, &data.into());361        assert_eq!(TemplateModule::balance_count(1, 1), 1);362        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);363364        let origin1 = Origin::signed(1);365        // default scenario366        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));367        assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);368        assert_eq!(TemplateModule::balance_count(1, 1), 0);369        assert_eq!(TemplateModule::balance_count(1, 2), 1);370        // assert_eq!(TemplateModule::address_tokens(1, 1), []);371        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);372    });373}374375#[test]376fn nft_approve_and_transfer_from() {377    new_test_ext().execute_with(|| {378        default_limits();379        380        let collection_id = create_test_collection(&CollectionMode::NFT, 1);381382        let data = default_nft_data();383        create_test_item(collection_id, &data.into());384385        let origin1 = Origin::signed(1);386        let origin2 = Origin::signed(2);387388        assert_eq!(TemplateModule::balance_count(1, 1), 1);389        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);390391        // neg transfer392        assert_noop!(TemplateModule::transfer_from(393            origin2.clone(),394            1,395            2,396            1,397            1,398            1), Error::<Test>::NoPermission);399400        // do approve401        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));402        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);403        assert_eq!(404            TemplateModule::approved(1, (1, 1))[0],405            ApprovePermissions {406                approved: 2,407                amount: 100000000408            }409        );410411        assert_ok!(TemplateModule::transfer_from(412            origin2.clone(),413            1,414            2,415            1,416            1,417            1418        ));419        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);420    });421}422423#[test]424fn nft_approve_and_transfer_from_white_list() {425    new_test_ext().execute_with(|| {426        default_limits();427        428        let collection_id = create_test_collection(&CollectionMode::NFT, 1);429430        let origin1 = Origin::signed(1);431        let origin2 = Origin::signed(2);432433        let data = default_nft_data();434        create_test_item(collection_id, &data.clone().into());435436        assert_eq!(TemplateModule::nft_item_id(1, 1).const_data, data.const_data);437        assert_eq!(TemplateModule::balance_count(1, 1), 1);438        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);439440        assert_ok!(TemplateModule::set_mint_permission(441            origin1.clone(),442            1,443            true444        ));445        assert_ok!(TemplateModule::set_public_access_mode(446            origin1.clone(),447            1,448            AccessMode::WhiteList449        ));450        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));451        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));452        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));453454        // do approve455        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));456        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);457        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));458        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);459        assert_eq!(460            TemplateModule::approved(1, (1, 1))[0],461            ApprovePermissions {462                approved: 2,463                amount: 100000000464            }465        );466467        assert_ok!(TemplateModule::transfer_from(468            origin2.clone(),469            1,470            3,471            1,472            1,473            1474        ));475        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);476    });477}478479#[test]480fn refungible_approve_and_transfer_from() {481    new_test_ext().execute_with(|| {482        default_limits();483        484        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);485        486        let origin1 = Origin::signed(1);487        let origin2 = Origin::signed(2);488489        let data = default_re_fungible_data();490        create_test_item(collection_id, &data.into());491492        assert_eq!(TemplateModule::balance_count(1, 1), 1000);493        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);494495        assert_ok!(TemplateModule::set_mint_permission(496            origin1.clone(),497            1,498            true499        ));500        assert_ok!(TemplateModule::set_public_access_mode(501            origin1.clone(),502            1,503            AccessMode::WhiteList504        ));505        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));506        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));507        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));508509        // do approve510        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));511        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);512        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));513        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);514        assert_eq!(515            TemplateModule::approved(1, (1, 1))[0],516            ApprovePermissions {517                approved: 2,518                amount: 100000000519            }520        );521522        assert_ok!(TemplateModule::transfer_from(523            origin2.clone(),524            1,525            3,526            1,527            1,528            100529        ));530        assert_eq!(TemplateModule::balance_count(1, 1), 900);531        assert_eq!(TemplateModule::balance_count(1, 3), 100);532        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);533        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);534535        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);536        assert_eq!(537            TemplateModule::approved(1, (1, 1))[0],538            ApprovePermissions {539                approved: 3,540                amount: 100000000541            }542        );543    });544}545546#[test]547fn fungible_approve_and_transfer_from() {548    new_test_ext().execute_with(|| {549        default_limits();550        551        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);552        553        let data = default_fungible_data();554        create_test_item(collection_id, &data.into());555556        let origin1 = Origin::signed(1);557        let origin2 = Origin::signed(2);558559        assert_eq!(TemplateModule::balance_count(1, 1), 1000);560        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);561562        assert_ok!(TemplateModule::set_mint_permission(563            origin1.clone(),564            1,565            true566        ));567        assert_ok!(TemplateModule::set_public_access_mode(568            origin1.clone(),569            1,570            AccessMode::WhiteList571        ));572        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));573        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));574        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));575576        // do approve577        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));578        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);579        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));580        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);581        assert_eq!(582            TemplateModule::approved(1, (1, 1))[0],583            ApprovePermissions {584                approved: 2,585                amount: 100000000586            }587        );588589        assert_ok!(TemplateModule::transfer_from(590            origin2.clone(),591            1,592            3,593            1,594            1,595            100596        ));597        assert_eq!(TemplateModule::balance_count(1, 1), 900);598        assert_eq!(TemplateModule::balance_count(1, 3), 100);599        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);600        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);601602        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);603        assert_eq!(604            TemplateModule::approved(1, (1, 1))[0],605            ApprovePermissions {606                approved: 3,607                amount: 100000000608            }609        );610611        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));612        assert_ok!(TemplateModule::transfer_from(613            origin2.clone(),614            1,615            3,616            1,617            1,618            900619        ));620        assert_eq!(TemplateModule::balance_count(1, 1), 0);621        assert_eq!(TemplateModule::balance_count(1, 3), 1000);622        // assert_eq!(TemplateModule::address_tokens(1, 1), []);623        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);624625        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);626    });627}628629#[test]630fn change_collection_owner() {631    new_test_ext().execute_with(|| {632        default_limits();633        634        let collection_id = create_test_collection(&CollectionMode::NFT, 1);635        636        let origin1 = Origin::signed(1);637        assert_ok!(TemplateModule::change_collection_owner(638            origin1.clone(),639            collection_id,640            2641        ));642        assert_eq!(TemplateModule::collection(collection_id).owner, 2);643    });644}645646#[test]647fn destroy_collection() {648    new_test_ext().execute_with(|| {649        default_limits();650        651        let collection_id = create_test_collection(&CollectionMode::NFT, 1);652        653        let origin1 = Origin::signed(1);654        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));655    });656}657658#[test]659fn burn_nft_item() {660    new_test_ext().execute_with(|| {661        default_limits();662        663        let collection_id = create_test_collection(&CollectionMode::NFT, 1);664665        let origin1 = Origin::signed(1);666        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));667        668        let data = default_nft_data();669        create_test_item(collection_id, &data.into());670671        // check balance (collection with id = 1, user id = 1)672        assert_eq!(TemplateModule::balance_count(1, 1), 1);673674        // burn item675        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));676        assert_noop!(677            TemplateModule::burn_item(origin1.clone(), 1, 1),678            Error::<Test>::TokenNotFound679        );680681        assert_eq!(TemplateModule::balance_count(1, 1), 0);682    });683}684685#[test]686fn burn_fungible_item() {687    new_test_ext().execute_with(|| {688        default_limits();689        690        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);691        692        let origin1 = Origin::signed(1);693        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));694        695        let data = default_fungible_data();696        create_test_item(collection_id, &data.into());697698        // check balance (collection with id = 1, user id = 1)699        assert_eq!(TemplateModule::balance_count(1, 1), 1000);700701        // burn item702        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));703        assert_noop!(704            TemplateModule::burn_item(origin1.clone(), 1, 1),705            Error::<Test>::TokenNotFound706        );707708        assert_eq!(TemplateModule::balance_count(1, 1), 0);709    });710}711712#[test]713fn burn_refungible_item() {714    new_test_ext().execute_with(|| {715        default_limits();716        717        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);718        let origin1 = Origin::signed(1);719720        assert_ok!(TemplateModule::set_mint_permission(721            origin1.clone(),722            collection_id,723            true724        ));725        assert_ok!(TemplateModule::set_public_access_mode(726            origin1.clone(),727            collection_id,728            AccessMode::WhiteList729        ));730        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));731732        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));733        734        let data = default_re_fungible_data();735        create_test_item(collection_id, &data.into());736737        // check balance (collection with id = 1, user id = 2)738        assert_eq!(TemplateModule::balance_count(1, 1), 1000);739740        // burn item741        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));742        assert_noop!(743            TemplateModule::burn_item(origin1.clone(), 1, 1),744            Error::<Test>::TokenNotFound745        );746747        assert_eq!(TemplateModule::balance_count(1, 1), 0);748    });749}750751#[test]752fn add_collection_admin() {753    new_test_ext().execute_with(|| {754        default_limits();755        756        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);757        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);758        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);759        760        let origin1 = Origin::signed(1);761762        // collection admin763        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));764        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));765766        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);767        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);768    });769}770771#[test]772fn remove_collection_admin() {773    new_test_ext().execute_with(|| {774        default_limits();775        776        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);777        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);778        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);779780        let origin1 = Origin::signed(1);781        let origin2 = Origin::signed(2);782783        // collection admin784        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));785        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));786787        assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);788        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);789790        // remove admin791        assert_ok!(TemplateModule::remove_collection_admin(792            origin2.clone(),793            1,794            3795        ));796        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);797    });798}799800#[test]801fn balance_of() {802    new_test_ext().execute_with(|| {803        default_limits();804        805        let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);806        let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);807        let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);808        809        // check balance before810        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);811        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);812        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);813814        let nft_data = default_nft_data();815        create_test_item(nft_collection_id, &nft_data.into());816        817        let fungible_data = default_fungible_data();818        create_test_item(fungible_collection_id, &fungible_data.into());819        820        let re_fungible_data = default_re_fungible_data();821        create_test_item(re_fungible_collection_id, &re_fungible_data.into());822823        // check balance (collection with id = 1, user id = 1)824        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);825        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);826        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);827        assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);828        assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);829        assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);830    });831}832833#[test]834fn approve() {835    new_test_ext().execute_with(|| {836        default_limits();837        838        let collection_id = create_test_collection(&CollectionMode::NFT, 1);839        840        let data = default_nft_data();841        create_test_item(collection_id, &data.into());842843        let origin1 = Origin::signed(1);844        845        // approve846        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));847        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);848    });849}850851#[test]852fn transfer_from() {853    new_test_ext().execute_with(|| {854        default_limits();855        856        let collection_id = create_test_collection(&CollectionMode::NFT, 1);857        let origin1 = Origin::signed(1);858        let origin2 = Origin::signed(2);859860        let data = default_nft_data();861        create_test_item(collection_id, &data.into());862863        // approve864        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));865        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);866867        assert_ok!(TemplateModule::set_mint_permission(868            origin1.clone(),869            1,870            true871        ));872        assert_ok!(TemplateModule::set_public_access_mode(873            origin1.clone(),874            1,875            AccessMode::WhiteList876        ));877        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));878        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));879        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));880881        assert_ok!(TemplateModule::transfer_from(882            origin2.clone(),883            1,884            2,885            1,886            1,887            1888        ));889890        // after transfer891        assert_eq!(TemplateModule::balance_count(1, 1), 0);892        assert_eq!(TemplateModule::balance_count(1, 2), 1);893    });894}895896// #endregion897898// Coverage tests region899// #region900901#[test]902fn owner_can_add_address_to_white_list() {903    new_test_ext().execute_with(|| {904        default_limits();905        906        let collection_id = create_test_collection(&CollectionMode::NFT, 1);907908        let origin1 = Origin::signed(1);909        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));910        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);911    });912}913914#[test]915fn admin_can_add_address_to_white_list() {916    new_test_ext().execute_with(|| {917        default_limits();918        919        let collection_id = create_test_collection(&CollectionMode::NFT, 1);920        let origin1 = Origin::signed(1);921        let origin2 = Origin::signed(2);922923        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));924        assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));925        assert_eq!(TemplateModule::white_list(collection_id)[0], 3);926    });927}928929#[test]930fn nonprivileged_user_cannot_add_address_to_white_list() {931    new_test_ext().execute_with(|| {932        default_limits();933        934        let collection_id = create_test_collection(&CollectionMode::NFT, 1);935936        let origin2 = Origin::signed(2);937        assert_noop!(938            TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),939            Error::<Test>::NoPermission940        );941    });942}943944#[test]945fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {946    new_test_ext().execute_with(|| {947        default_limits();948949        let origin1 = Origin::signed(1);950951        assert_noop!(952            TemplateModule::add_to_white_list(origin1.clone(), 1, 2),953            Error::<Test>::CollectionNotFound954        );955    });956}957958#[test]959fn nobody_can_add_address_to_white_list_of_deleted_collection() {960    new_test_ext().execute_with(|| {961        default_limits();962        963        let collection_id = create_test_collection(&CollectionMode::NFT, 1);964965        let origin1 = Origin::signed(1);966        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));967        assert_noop!(968            TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),969            Error::<Test>::CollectionNotFound970        );971    });972}973974// If address is already added to white list, nothing happens975#[test]976fn address_is_already_added_to_white_list() {977    new_test_ext().execute_with(|| {978        default_limits();979        980        let collection_id = create_test_collection(&CollectionMode::NFT, 1);981        let origin1 = Origin::signed(1);982        983        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));984        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));985        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);986        assert_eq!(TemplateModule::white_list(collection_id).len(), 1);987    });988}989990#[test]991fn owner_can_remove_address_from_white_list() {992    new_test_ext().execute_with(|| {993        default_limits();994        995        let collection_id = create_test_collection(&CollectionMode::NFT, 1);996997        let origin1 = Origin::signed(1);998        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));999        assert_ok!(TemplateModule::remove_from_white_list(1000            origin1.clone(),1001            collection_id,1002            21003        ));1004        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1005    });1006}10071008#[test]1009fn admin_can_remove_address_from_white_list() {1010    new_test_ext().execute_with(|| {1011        default_limits();1012        1013        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1014        let origin1 = Origin::signed(1);1015        let origin2 = Origin::signed(2);10161017        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));10181019        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));1020        assert_ok!(TemplateModule::remove_from_white_list(1021            origin2.clone(),1022            collection_id,1023            31024        ));1025        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1026    });1027}10281029#[test]1030fn nonprivileged_user_cannot_remove_address_from_white_list() {1031    new_test_ext().execute_with(|| {1032        default_limits();1033        1034        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1035        let origin1 = Origin::signed(1);1036        let origin2 = Origin::signed(2);10371038        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1039        assert_noop!(1040            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1041            Error::<Test>::NoPermission1042        );1043        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1044    });1045}10461047#[test]1048fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1049    new_test_ext().execute_with(|| {1050        default_limits();1051        let origin1 = Origin::signed(1);10521053        assert_noop!(1054            TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1055            Error::<Test>::CollectionNotFound1056        );1057    });1058}10591060#[test]1061fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1062    new_test_ext().execute_with(|| {1063        default_limits();1064        1065        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1066        let origin1 = Origin::signed(1);1067        let origin2 = Origin::signed(2);10681069        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1070        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1071        assert_noop!(1072            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1073            Error::<Test>::CollectionNotFound1074        );1075        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1076    });1077}10781079// If address is already removed from white list, nothing happens1080#[test]1081fn address_is_already_removed_from_white_list() {1082    new_test_ext().execute_with(|| {1083        default_limits();1084        1085        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1086        let origin1 = Origin::signed(1);10871088        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1089        assert_ok!(TemplateModule::remove_from_white_list(1090            origin1.clone(),1091            collection_id,1092            21093        ));1094        assert_ok!(TemplateModule::remove_from_white_list(1095            origin1.clone(),1096            collection_id,1097            21098        ));1099        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1100    });1101}11021103// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1104#[test]1105fn white_list_test_1() {1106    new_test_ext().execute_with(|| {1107        default_limits();1108        1109        let collection_id = create_test_collection(&CollectionMode::NFT, 1);11101111        let origin1 = Origin::signed(1);1112        1113        let data = default_nft_data();1114        create_test_item(collection_id, &data.into());11151116        assert_ok!(TemplateModule::set_public_access_mode(1117            origin1.clone(),1118            collection_id,1119            AccessMode::WhiteList1120        ));1121        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));11221123        assert_noop!(1124            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1125            Error::<Test>::AddresNotInWhiteList1126        );1127    });1128}11291130#[test]1131fn white_list_test_2() {1132    new_test_ext().execute_with(|| {1133        default_limits();1134        1135        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1136        let origin1 = Origin::signed(1);1137        1138        let data = default_nft_data();1139        create_test_item(collection_id, &data.into());11401141        assert_ok!(TemplateModule::set_public_access_mode(1142            origin1.clone(),1143            collection_id,1144            AccessMode::WhiteList1145        ));1146        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1147        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));11481149        // do approve1150        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1151        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);11521153        assert_ok!(TemplateModule::remove_from_white_list(1154            origin1.clone(),1155            1,1156            11157        ));11581159        assert_noop!(1160            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1161            Error::<Test>::AddresNotInWhiteList1162        );1163    });1164}11651166// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1167#[test]1168fn white_list_test_3() {1169    new_test_ext().execute_with(|| {1170        default_limits();1171        1172        let collection_id = create_test_collection(&CollectionMode::NFT, 1);11731174        let origin1 = Origin::signed(1);1175        1176        let data = default_nft_data();1177        create_test_item(collection_id, &data.into());11781179        assert_ok!(TemplateModule::set_public_access_mode(1180            origin1.clone(),1181            collection_id,1182            AccessMode::WhiteList1183        ));1184        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));11851186        assert_noop!(1187            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1188            Error::<Test>::AddresNotInWhiteList1189        );1190    });1191}11921193#[test]1194fn white_list_test_4() {1195    new_test_ext().execute_with(|| {1196        default_limits();1197        1198        let collection_id = create_test_collection(&CollectionMode::NFT, 1);11991200        let origin1 = Origin::signed(1);12011202        let data = default_nft_data();1203        create_test_item(collection_id, &data.into());12041205        assert_ok!(TemplateModule::set_public_access_mode(1206            origin1.clone(),1207            collection_id,1208            AccessMode::WhiteList1209        ));1210        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1211        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12121213        // do approve1214        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1215        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12161217        assert_ok!(TemplateModule::remove_from_white_list(1218            origin1.clone(),1219            collection_id,1220            21221        ));12221223        assert_noop!(1224            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1225            Error::<Test>::AddresNotInWhiteList1226        );1227    });1228}12291230// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1231#[test]1232fn white_list_test_5() {1233    new_test_ext().execute_with(|| {1234        default_limits();1235        1236        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12371238        let origin1 = Origin::signed(1);12391240        let data = default_nft_data();1241        create_test_item(collection_id, &data.into());12421243        assert_ok!(TemplateModule::set_public_access_mode(1244            origin1.clone(),1245            collection_id,1246            AccessMode::WhiteList1247        ));1248        assert_noop!(1249            TemplateModule::burn_item(origin1.clone(), 1, 1),1250            Error::<Test>::AddresNotInWhiteList1251        );1252    });1253}12541255// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1256#[test]1257fn white_list_test_6() {1258    new_test_ext().execute_with(|| {1259        default_limits();1260        1261        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12621263        let origin1 = Origin::signed(1);1264        assert_ok!(TemplateModule::set_public_access_mode(1265            origin1.clone(),1266            collection_id,1267            AccessMode::WhiteList1268        ));12691270        // do approve1271        assert_noop!(1272            TemplateModule::approve(origin1.clone(), 1, 1, 1),1273            Error::<Test>::AddresNotInWhiteList1274        );1275    });1276}12771278// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1279//          tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1280#[test]1281fn white_list_test_7() {1282    new_test_ext().execute_with(|| {1283        default_limits();1284        1285        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12861287        let data = default_nft_data();1288        create_test_item(collection_id, &data.into());1289        1290        let origin1 = Origin::signed(1);12911292        assert_ok!(TemplateModule::set_public_access_mode(1293            origin1.clone(),1294            collection_id,1295            AccessMode::WhiteList1296        ));1297        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1298        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12991300        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1301    });1302}13031304#[test]1305fn white_list_test_8() {1306    new_test_ext().execute_with(|| {1307        default_limits();1308        1309        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13101311        let data = default_nft_data();1312        create_test_item(collection_id, &data.into());1313        1314        let origin1 = Origin::signed(1);13151316        assert_ok!(TemplateModule::set_public_access_mode(1317            origin1.clone(),1318            collection_id,1319            AccessMode::WhiteList1320        ));1321        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1322        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13231324        // do approve1325        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1326        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);13271328        assert_ok!(TemplateModule::transfer_from(1329            origin1.clone(),1330            1,1331            2,1332            1,1333            1,1334            11335        ));1336    });1337}13381339// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1340#[test]1341fn white_list_test_9() {1342    new_test_ext().execute_with(|| {1343        default_limits();1344        1345        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1346        let origin1 = Origin::signed(1);13471348        assert_ok!(TemplateModule::set_public_access_mode(1349            origin1.clone(),1350            collection_id,1351            AccessMode::WhiteList1352        ));1353        assert_ok!(TemplateModule::set_mint_permission(1354            origin1.clone(),1355            collection_id,1356            false1357        ));13581359        let data = default_nft_data();1360        create_test_item(collection_id, &data.into());1361    });1362}13631364// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1365#[test]1366fn white_list_test_10() {1367    new_test_ext().execute_with(|| {1368        default_limits();1369        1370        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13711372        let origin1 = Origin::signed(1);1373        let origin2 = Origin::signed(2);13741375        assert_ok!(TemplateModule::set_public_access_mode(1376            origin1.clone(),1377            collection_id,1378            AccessMode::WhiteList1379        ));1380        assert_ok!(TemplateModule::set_mint_permission(1381            origin1.clone(),1382            collection_id,1383            false1384        ));13851386        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));13871388        assert_ok!(TemplateModule::create_item(1389            origin2.clone(),1390            collection_id,1391            2,1392            default_nft_data().into()1393        ));1394    });1395}13961397// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1398#[test]1399fn white_list_test_11() {1400    new_test_ext().execute_with(|| {1401        default_limits();1402        1403        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14041405        let origin1 = Origin::signed(1);1406        let origin2 = Origin::signed(2);14071408        assert_ok!(TemplateModule::set_public_access_mode(1409            origin1.clone(),1410            collection_id,1411            AccessMode::WhiteList1412        ));1413        assert_ok!(TemplateModule::set_mint_permission(1414            origin1.clone(),1415            collection_id,1416            false1417        ));1418        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));14191420        assert_noop!(1421            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1422            Error::<Test>::PublicMintingNotAllowed1423        );1424    });1425}14261427// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1428#[test]1429fn white_list_test_12() {1430    new_test_ext().execute_with(|| {1431        default_limits();1432        1433        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14341435        let origin1 = Origin::signed(1);1436        let origin2 = Origin::signed(2);14371438        assert_ok!(TemplateModule::set_public_access_mode(1439            origin1.clone(),1440            collection_id,1441            AccessMode::WhiteList1442        ));1443        assert_ok!(TemplateModule::set_mint_permission(1444            origin1.clone(),1445            collection_id,1446            false1447        ));14481449        assert_noop!(1450            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1451            Error::<Test>::PublicMintingNotAllowed1452        );1453    });1454}14551456// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1457#[test]1458fn white_list_test_13() {1459    new_test_ext().execute_with(|| {1460        default_limits();1461        1462        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14631464        let origin1 = Origin::signed(1);14651466        assert_ok!(TemplateModule::set_public_access_mode(1467            origin1.clone(),1468            collection_id,1469            AccessMode::WhiteList1470        ));1471        assert_ok!(TemplateModule::set_mint_permission(1472            origin1.clone(),1473            collection_id,1474            true1475        ));14761477        let data = default_nft_data();1478        create_test_item(collection_id, &data.into());1479    });1480}14811482// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1483#[test]1484fn white_list_test_14() {1485    new_test_ext().execute_with(|| {1486        default_limits();1487        1488        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14891490        let origin1 = Origin::signed(1);1491        let origin2 = Origin::signed(2);14921493        assert_ok!(TemplateModule::set_public_access_mode(1494            origin1.clone(),1495            collection_id,1496            AccessMode::WhiteList1497        ));1498        assert_ok!(TemplateModule::set_mint_permission(1499            origin1.clone(),1500            collection_id,1501            true1502        ));15031504        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));15051506        assert_ok!(TemplateModule::create_item(1507            origin2.clone(),1508            1,1509            2,1510            default_nft_data().into()1511        ));1512    });1513}15141515// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1516#[test]1517fn white_list_test_15() {1518    new_test_ext().execute_with(|| {1519        default_limits();1520        1521        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15221523        let origin1 = Origin::signed(1);1524        let origin2 = Origin::signed(2);15251526        assert_ok!(TemplateModule::set_public_access_mode(1527            origin1.clone(),1528            collection_id,1529            AccessMode::WhiteList1530        ));1531        assert_ok!(TemplateModule::set_mint_permission(1532            origin1.clone(),1533            collection_id,1534            true1535        ));15361537        assert_noop!(1538            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1539            Error::<Test>::AddresNotInWhiteList1540        );1541    });1542}15431544// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1545#[test]1546fn white_list_test_16() {1547    new_test_ext().execute_with(|| {1548        default_limits();1549        1550        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15511552        let origin1 = Origin::signed(1);1553        let origin2 = Origin::signed(2);15541555        assert_ok!(TemplateModule::set_public_access_mode(1556            origin1.clone(),1557            collection_id,1558            AccessMode::WhiteList1559        ));1560        assert_ok!(TemplateModule::set_mint_permission(1561            origin1.clone(),1562            collection_id,1563            true1564        ));1565        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));15661567        assert_ok!(TemplateModule::create_item(1568            origin2.clone(),1569            1,1570            2,1571            default_nft_data().into()1572        ));1573    });1574}15751576// Total number of collections. Positive test1577#[test]1578fn total_number_collections_bound() {1579    new_test_ext().execute_with(|| {1580        default_limits();1581        1582        create_test_collection(&CollectionMode::NFT, 1);1583    });1584}15851586// Total number of collections. Negotive test1587#[test]1588fn total_number_collections_bound_neg() {1589    new_test_ext().execute_with(|| {1590        default_limits();15911592        let origin1 = Origin::signed(1);15931594        for i in 0..default_collection_numbers_limit() {1595            create_test_collection(&CollectionMode::NFT, i + 1);1596        }15971598        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1599        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1600        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16011602        // 11-th collection in chain. Expects error1603        assert_noop!(TemplateModule::create_collection(1604            origin1.clone(),1605            col_name1.clone(),1606            col_desc1.clone(),1607            token_prefix1.clone(),1608            CollectionMode::NFT1609        ), Error::<Test>::TotalCollectionsLimitExceeded);1610    });1611}16121613// Owned tokens by a single address. Positive test1614#[test]1615fn owned_tokens_bound() {1616    new_test_ext().execute_with(|| {1617        default_limits();1618        1619        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16201621        let data = default_nft_data();1622        create_test_item(collection_id, &data.clone().into());1623        create_test_item(collection_id, &data.into());1624    });1625}16261627// Owned tokens by a single address. Negotive test1628#[test]1629fn owned_tokens_bound_neg() {1630    new_test_ext().execute_with(|| {1631        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1632            collection_numbers_limit: 10,1633            account_token_ownership_limit: 1,1634            collections_admins_limit: 5,1635            custom_data_limit: 2048,1636            nft_sponsor_transfer_timeout: 15,1637            fungible_sponsor_transfer_timeout: 15,1638            refungible_sponsor_transfer_timeout: 15,          1639        }));1640        1641        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16421643        let origin1 = Origin::signed(1);1644        let data = default_nft_data();1645        create_test_item(collection_id, &data.clone().into());16461647        assert_noop!(TemplateModule::create_item(1648            origin1.clone(),1649            1,1650            1,1651            data.into()1652        ),  Error::<Test>::AddressOwnershipLimitExceeded);1653    });1654}16551656// Number of collection admins. Positive test1657#[test]1658fn collection_admins_bound() {1659    new_test_ext().execute_with(|| {1660        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1661            collection_numbers_limit: 10,1662            account_token_ownership_limit: 10,1663            collections_admins_limit: 2,1664            custom_data_limit: 2048,1665            nft_sponsor_transfer_timeout: 15,1666            fungible_sponsor_transfer_timeout: 15,1667            refungible_sponsor_transfer_timeout: 15,          1668        }));1669        1670        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16711672        let origin1 = Origin::signed(1);1673        1674        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1675        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));1676    });1677}16781679// Number of collection admins. Negotive test1680#[test]1681fn collection_admins_bound_neg() {1682    new_test_ext().execute_with(|| {1683        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1684            collection_numbers_limit: 10,1685            account_token_ownership_limit: 1,1686            collections_admins_limit: 1,1687            custom_data_limit: 2048,1688            nft_sponsor_transfer_timeout: 15,1689            fungible_sponsor_transfer_timeout: 15,1690            refungible_sponsor_transfer_timeout: 15,          1691        }));1692        1693        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16941695        let origin1 = Origin::signed(1);16961697        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1698        assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), Error::<Test>::CollectionAdminsLimitExceeded);1699    });1700}17011702// NFT custom data size. Negative test const_data.1703#[test]1704fn custom_data_size_nft_const_data_bound_neg() {1705    new_test_ext().execute_with(|| {1706        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1707            collection_numbers_limit: 10,1708            account_token_ownership_limit: 10,1709            collections_admins_limit: 5,1710            custom_data_limit: 2,1711            nft_sponsor_transfer_timeout: 15,1712            fungible_sponsor_transfer_timeout: 15,1713            refungible_sponsor_transfer_timeout: 15,          1714        }));1715        1716        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17171718        let origin1 = Origin::signed(1);1719        let too_big_const_data = CreateItemData::NFT(CreateNftData{1720            const_data: vec![1, 2, 3, 4],1721            variable_data: vec![]1722        });17231724        assert_noop!(TemplateModule::create_item(1725            origin1.clone(),1726            collection_id,1727            1,1728            too_big_const_data1729        ), Error::<Test>::TokenConstDataLimitExceeded);1730    });1731}17321733// NFT custom data size. Negative test variable_data.1734#[test]1735fn custom_data_size_nft_variable_data_bound_neg() {1736    new_test_ext().execute_with(|| {1737        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1738            collection_numbers_limit: 10,1739            account_token_ownership_limit: 10,1740            collections_admins_limit: 5,1741            custom_data_limit: 2,1742            nft_sponsor_transfer_timeout: 15,1743            fungible_sponsor_transfer_timeout: 15,1744            refungible_sponsor_transfer_timeout: 15,          1745        }));17461747        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17481749        let origin1 = Origin::signed(1);1750        let too_big_const_data = CreateItemData::NFT(CreateNftData{1751            const_data: vec![],1752            variable_data: vec![1, 2, 3, 4]1753        });17541755        assert_noop!(TemplateModule::create_item(1756            origin1.clone(),1757            collection_id,1758            1,1759            too_big_const_data1760        ), Error::<Test>::TokenVariableDataLimitExceeded);1761    });1762}17631764// Re fungible custom data size. Negative test const_data.1765#[test]1766fn custom_data_size_re_fungible_const_data_bound_neg() {1767    new_test_ext().execute_with(|| {1768        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1769            collection_numbers_limit: 10,1770            account_token_ownership_limit: 10,1771            collections_admins_limit: 5,1772            custom_data_limit: 2,1773            nft_sponsor_transfer_timeout: 15,1774            fungible_sponsor_transfer_timeout: 15,1775            refungible_sponsor_transfer_timeout: 15,          1776        }));17771778        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17791780        let origin1 = Origin::signed(1);1781        let too_big_const_data = CreateItemData::NFT(CreateNftData{1782            const_data: vec![1, 2, 3, 4],1783            variable_data: vec![]1784        });17851786        assert_noop!(TemplateModule::create_item(1787            origin1.clone(),1788            collection_id,1789            1,1790            too_big_const_data1791        ), Error::<Test>::TokenConstDataLimitExceeded);1792    });1793}17941795// Re fungible custom data size. Negative test variable_data.1796#[test]1797fn custom_data_size_re_fungible_variable_data_bound_neg() {1798    new_test_ext().execute_with(|| {1799        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1800            collection_numbers_limit: 10,1801            account_token_ownership_limit: 10,1802            collections_admins_limit: 5,1803            custom_data_limit: 2,1804            nft_sponsor_transfer_timeout: 15,1805            fungible_sponsor_transfer_timeout: 15,1806            refungible_sponsor_transfer_timeout: 15,          1807        }));18081809        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18101811        let origin1 = Origin::signed(1);1812        let too_big_const_data = CreateItemData::NFT(CreateNftData{1813            const_data: vec![],1814            variable_data: vec![1, 2, 3, 4]1815        });18161817        assert_noop!(TemplateModule::create_item(1818            origin1.clone(),1819            collection_id,1820            1,1821            too_big_const_data1822        ), Error::<Test>::TokenVariableDataLimitExceeded);1823    });1824}1825// #endregion18261827#[test]1828fn set_const_on_chain_schema() {1829    new_test_ext().execute_with(|| {1830        default_limits();18311832        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18331834        let origin1 = Origin::signed(1);1835        assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));18361837        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"test const on chain schema".to_vec());1838        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"".to_vec());1839    });1840}18411842#[test]1843fn set_variable_on_chain_schema() {1844    new_test_ext().execute_with(|| {1845        default_limits();1846        1847        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18481849        let origin1 = Origin::signed(1);1850        assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));18511852        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"".to_vec());1853        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"test variable on chain schema".to_vec());1854    });1855}18561857#[test]1858fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1859    new_test_ext().execute_with(|| {1860        default_limits();18611862        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18631864        let origin1 = Origin::signed(1);1865        1866        let data = default_nft_data();1867        create_test_item(1, &data.into());1868        1869        let variable_data = b"test set_variable_meta_data method.".to_vec();1870        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));18711872        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, variable_data);1873    });1874}18751876#[test]1877fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1878    new_test_ext().execute_with(|| {1879        default_limits();18801881        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);18821883        let origin1 = Origin::signed(1);18841885        let data = default_re_fungible_data();1886        create_test_item(1, &data.into());18871888        let variable_data = b"test set_variable_meta_data method.".to_vec();1889        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));18901891        assert_eq!(TemplateModule::refungible_item_id(collection_id, 1).variable_data, variable_data);1892    });1893}189418951896#[test]1897fn set_variable_meta_data_on_fungible_token_fails() {1898    new_test_ext().execute_with(|| {1899        default_limits();19001901        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19021903        let origin1 = Origin::signed(1);19041905        let data = default_fungible_data();1906        create_test_item(1, &data.into());19071908        let variable_data = b"test set_variable_meta_data method.".to_vec();1909        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()), Error::<Test>::CantStoreMetadataInFungibleTokens);1910    });1911}19121913#[test]1914fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1915    new_test_ext().execute_with(|| {1916        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1917            collection_numbers_limit: default_collection_numbers_limit(),1918            account_token_ownership_limit: 10,1919            collections_admins_limit: 5,1920            custom_data_limit: 10,1921            nft_sponsor_transfer_timeout: 15,1922            fungible_sponsor_transfer_timeout: 15,1923            refungible_sponsor_transfer_timeout: 15,          1924        }));19251926        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19271928        let origin1 = Origin::signed(1);19291930        let data = default_nft_data();1931        create_test_item(1, &data.into());19321933        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1934        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1935    });1936}19371938#[test]1939fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1940    new_test_ext().execute_with(|| {1941        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1942            collection_numbers_limit: default_collection_numbers_limit(),1943            account_token_ownership_limit: 10,1944            collections_admins_limit: 5,1945            custom_data_limit: 10,1946            nft_sponsor_transfer_timeout: 15,1947            fungible_sponsor_transfer_timeout: 15,1948            refungible_sponsor_transfer_timeout: 15,          1949        }));195019511952        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19531954        let origin1 = Origin::signed(1);19551956        let data = default_re_fungible_data();1957        create_test_item(1, &data.into());19581959        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1960        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1961    });1962}
after · pallets/nft/src/tests.rs
1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, ApprovePermissions, CollectionMode,5    Ownership, ChainLimits, CreateItemData, CreateNftData, CreateFungibleData, CreateReFungibleData,6    CollectionId, TokenId, MAX_DECIMAL_POINTS}; //Err7use frame_support::{assert_noop, assert_ok};8use frame_system::{ RawOrigin };910fn default_collection_numbers_limit() -> u32 {11    1012}1314fn default_limits() {15    assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 16            collection_numbers_limit: default_collection_numbers_limit(),17            account_token_ownership_limit: 10,18            collections_admins_limit: 5,19            custom_data_limit: 2048,20            nft_sponsor_transfer_timeout: 15,21            fungible_sponsor_transfer_timeout: 15,22            refungible_sponsor_transfer_timeout: 15,          23        }));24}2526fn default_nft_data() -> CreateNftData {27    CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }28}2930fn default_fungible_data () -> CreateFungibleData {31    CreateFungibleData { }32}3334fn default_re_fungible_data () -> CreateReFungibleData {35    CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }36}3738fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: CollectionId) -> CollectionId {39    let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();40    let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();41    let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4243    let origin1 = Origin::signed(owner);44    assert_ok!(TemplateModule::create_collection(45            origin1.clone(),46            col_name1.clone(),47            col_desc1.clone(),48            token_prefix1.clone(),49            mode.clone()50        ));5152    let saved_col_name: Vec<u16> = "Test1\0\0".encode_utf16().collect::<Vec<u16>>();53    let saved_description: Vec<u16> = "TestDescription1\0\0".encode_utf16().collect::<Vec<u16>>();54    let saved_prefix: Vec<u8> = b"token_prefix1\0\0".to_vec();55    assert_eq!(TemplateModule::collection(id).owner, owner);56    assert_eq!(TemplateModule::collection(id).name, saved_col_name);57    assert_eq!(TemplateModule::collection(id).mode, *mode);58    assert_eq!(TemplateModule::collection(id).description, saved_description);59    assert_eq!(TemplateModule::collection(id).token_prefix, saved_prefix);60    id61}6263fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {64    create_test_collection_for_owner(&mode, 1, id)65}6667fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {68    let origin1 = Origin::signed(1);69    assert_ok!(TemplateModule::create_item(70            origin1.clone(),71            collection_id,72            1,73            data.clone()74        ));7576}7778// Use cases tests region79// #region80#[test]81fn create_fungible_collection_fails_with_large_decimal_numbers() {82    new_test_ext().execute_with(|| {83        default_limits();8485        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();86        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();87        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();8889        let origin1 = Origin::signed(1);90        assert_noop!(TemplateModule::create_collection(91            origin1,92            col_name1,93            col_desc1,94            token_prefix1,95            CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)96        ), Error::<Test>::CollectionDecimalPointLimitExceeded);97    });    98}99100#[test]101fn create_re_fungible_collection_fails_with_large_decimal_numbers() {102    new_test_ext().execute_with(|| {103        default_limits();104105        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();106        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();107        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();108109        let origin1 = Origin::signed(1);110        assert_noop!(TemplateModule::create_collection(111            origin1,112            col_name1,113            col_desc1,114            token_prefix1,115            CollectionMode::ReFungible(MAX_DECIMAL_POINTS + 1)116        ), Error::<Test>::CollectionDecimalPointLimitExceeded);117    });118}119120#[test]121fn create_nft_item() {122    new_test_ext().execute_with(|| {123        default_limits();124        let collection_id = create_test_collection(&CollectionMode::NFT, 1);125        126        let data = default_nft_data();127        create_test_item(collection_id, &data.clone().into());128        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);129        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);130    });131}132133// Use cases tests region134// #region135#[test]136fn create_nft_multiple_items() {137    new_test_ext().execute_with(|| {138        default_limits();139        140        create_test_collection(&CollectionMode::NFT, 1);141142        let origin1 = Origin::signed(1);143144        let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];145146        assert_ok!(TemplateModule::create_multiple_items(147            origin1.clone(),148            1,149            1,150            items_data.clone().into_iter().map(|d| { d.into() }).collect()151        ));152        for (index, data) in items_data.iter().enumerate() {153            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).const_data.to_vec(), data.const_data);154            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).variable_data.to_vec(), data.variable_data);155        }156    });157}158159#[test]160fn create_refungible_item() {161    new_test_ext().execute_with(|| {162        default_limits();163        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);164165        let data = default_re_fungible_data();166        create_test_item(collection_id, &data.clone().into());167        assert_eq!(168            TemplateModule::refungible_item_id(collection_id, 1).const_data,169            data.const_data170        );171        assert_eq!(172            TemplateModule::refungible_item_id(collection_id, 1).variable_data,173            data.variable_data174        );175        assert_eq!(176            TemplateModule::refungible_item_id(collection_id, 1).owner[0],177            Ownership {178                owner: 1,179                fraction: 1000180            }181        );182    });183}184185#[test]186fn create_multiple_refungible_items() {187    new_test_ext().execute_with(|| {188        default_limits();189        190        create_test_collection(&CollectionMode::ReFungible(3), 1);191192        let origin1 = Origin::signed(1);193194        let items_data = vec![default_re_fungible_data(), default_re_fungible_data(), default_re_fungible_data()];195196        assert_ok!(TemplateModule::create_multiple_items(197            origin1.clone(),198            1,199            1,200            items_data.clone().into_iter().map(|d| { d.into() }).collect()201        ));202        for (index, data) in items_data.iter().enumerate() {203204            let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId);205            assert_eq!(item.const_data.to_vec(), data.const_data);206            assert_eq!(item.variable_data.to_vec(), data.variable_data);207            assert_eq!(208                item.owner[0],209                Ownership {210                    owner: 1,211                    fraction: 1000212                }213            );214        }215    });216}217218#[test]219fn create_fungible_item() {220    new_test_ext().execute_with(|| {221        default_limits();222        223        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);224225        let data = default_fungible_data();226        create_test_item(collection_id, &data.into());227228        assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);229    });230}231232#[test]233fn create_multiple_fungible_items() {234    new_test_ext().execute_with(|| {235        default_limits();236237        create_test_collection(&CollectionMode::Fungible(3), 1);238239        let origin1 = Origin::signed(1);240241        let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];242243        assert_ok!(TemplateModule::create_multiple_items(244            origin1.clone(),245            1,246            1,247            items_data.clone().into_iter().map(|d| { d.into() }).collect()248        ));249        250        for (index, _) in items_data.iter().enumerate() {251            assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).owner, 1);252        }253        assert_eq!(TemplateModule::balance_count(1, 1), 3000);254        assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);255    });256}257258#[test]259fn transfer_fungible_item() {260    new_test_ext().execute_with(|| {261        default_limits();262        263        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);264265        let origin1 = Origin::signed(1);266        let origin2 = Origin::signed(2);267268        let data = default_fungible_data();269        create_test_item(collection_id, &data.into());270271        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);272        assert_eq!(TemplateModule::balance_count(1, 1), 1000);273        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);274275        // change owner scenario276        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));277        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);278        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);279        assert_eq!(TemplateModule::balance_count(1, 1), 0);280        assert_eq!(TemplateModule::balance_count(1, 2), 1000);281        // assert_eq!(TemplateModule::address_tokens(1, 1), []);282        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);283284        // split item scenario285        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));286        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);287        assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);288        assert_eq!(TemplateModule::balance_count(1, 2), 500);289        assert_eq!(TemplateModule::balance_count(1, 3), 500);290        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);291        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);292293        // split item and new owner has account scenario294        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));295        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);296        assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);297        assert_eq!(TemplateModule::balance_count(1, 2), 300);298        assert_eq!(TemplateModule::balance_count(1, 3), 700);299        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);300        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);301    });302}303304#[test]305fn transfer_refungible_item() {306    new_test_ext().execute_with(|| {307        default_limits();308        309        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);310311        let data = default_re_fungible_data();312        create_test_item(collection_id, &data.clone().into());313314        let origin1 = Origin::signed(1);315        let origin2 = Origin::signed(2);316        assert_eq!(317            TemplateModule::refungible_item_id(collection_id, 1).const_data,318            data.const_data319        );320        assert_eq!(321            TemplateModule::refungible_item_id(collection_id, 1).variable_data,322            data.variable_data323        );324        assert_eq!(325            TemplateModule::refungible_item_id(collection_id, 1).owner[0],326            Ownership {327                owner: 1,328                fraction: 1000329            }330        );331        assert_eq!(TemplateModule::balance_count(1, 1), 1000);332        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);333334        // change owner scenario335        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));336        assert_eq!(337            TemplateModule::refungible_item_id(1, 1).owner[0],338            Ownership {339                owner: 2,340                fraction: 1000341            }342        );343        assert_eq!(TemplateModule::balance_count(1, 1), 0);344        assert_eq!(TemplateModule::balance_count(1, 2), 1000);345        // assert_eq!(TemplateModule::address_tokens(1, 1), []);346        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);347348        // split item scenario349        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));350        assert_eq!(351            TemplateModule::refungible_item_id(1, 1).owner[0],352            Ownership {353                owner: 2,354                fraction: 500355            }356        );357        assert_eq!(358            TemplateModule::refungible_item_id(1, 1).owner[1],359            Ownership {360                owner: 3,361                fraction: 500362            }363        );364        assert_eq!(TemplateModule::balance_count(1, 2), 500);365        assert_eq!(TemplateModule::balance_count(1, 3), 500);366        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);367        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);368369        // split item and new owner has account scenario370        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));371        assert_eq!(372            TemplateModule::refungible_item_id(1, 1).owner[0],373            Ownership {374                owner: 2,375                fraction: 300376            }377        );378        assert_eq!(379            TemplateModule::refungible_item_id(1, 1).owner[1],380            Ownership {381                owner: 3,382                fraction: 700383            }384        );385        assert_eq!(TemplateModule::balance_count(1, 2), 300);386        assert_eq!(TemplateModule::balance_count(1, 3), 700);387        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);388        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);389    });390}391392#[test]393fn transfer_nft_item() {394    new_test_ext().execute_with(|| {395        default_limits();396        397        let collection_id = create_test_collection(&CollectionMode::NFT, 1);398399        let data = default_nft_data();400        create_test_item(collection_id, &data.into());401        assert_eq!(TemplateModule::balance_count(1, 1), 1);402        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);403404        let origin1 = Origin::signed(1);405        // default scenario406        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));407        assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);408        assert_eq!(TemplateModule::balance_count(1, 1), 0);409        assert_eq!(TemplateModule::balance_count(1, 2), 1);410        // assert_eq!(TemplateModule::address_tokens(1, 1), []);411        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);412    });413}414415#[test]416fn nft_approve_and_transfer_from() {417    new_test_ext().execute_with(|| {418        default_limits();419        420        let collection_id = create_test_collection(&CollectionMode::NFT, 1);421422        let data = default_nft_data();423        create_test_item(collection_id, &data.into());424425        let origin1 = Origin::signed(1);426        let origin2 = Origin::signed(2);427428        assert_eq!(TemplateModule::balance_count(1, 1), 1);429        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);430431        // neg transfer432        assert_noop!(TemplateModule::transfer_from(433            origin2.clone(),434            1,435            2,436            1,437            1,438            1), Error::<Test>::NoPermission);439440        // do approve441        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));442        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);443        assert_eq!(444            TemplateModule::approved(1, (1, 1))[0],445            ApprovePermissions {446                approved: 2,447                amount: 100000000448            }449        );450451        assert_ok!(TemplateModule::transfer_from(452            origin2.clone(),453            1,454            2,455            1,456            1,457            1458        ));459        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);460    });461}462463#[test]464fn nft_approve_and_transfer_from_white_list() {465    new_test_ext().execute_with(|| {466        default_limits();467        468        let collection_id = create_test_collection(&CollectionMode::NFT, 1);469470        let origin1 = Origin::signed(1);471        let origin2 = Origin::signed(2);472473        let data = default_nft_data();474        create_test_item(collection_id, &data.clone().into());475476        assert_eq!(TemplateModule::nft_item_id(1, 1).const_data, data.const_data);477        assert_eq!(TemplateModule::balance_count(1, 1), 1);478        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);479480        assert_ok!(TemplateModule::set_mint_permission(481            origin1.clone(),482            1,483            true484        ));485        assert_ok!(TemplateModule::set_public_access_mode(486            origin1.clone(),487            1,488            AccessMode::WhiteList489        ));490        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));491        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));492        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));493494        // do approve495        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));496        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);497        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));498        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);499        assert_eq!(500            TemplateModule::approved(1, (1, 1))[0],501            ApprovePermissions {502                approved: 2,503                amount: 100000000504            }505        );506507        assert_ok!(TemplateModule::transfer_from(508            origin2.clone(),509            1,510            3,511            1,512            1,513            1514        ));515        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);516    });517}518519#[test]520fn refungible_approve_and_transfer_from() {521    new_test_ext().execute_with(|| {522        default_limits();523        524        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);525        526        let origin1 = Origin::signed(1);527        let origin2 = Origin::signed(2);528529        let data = default_re_fungible_data();530        create_test_item(collection_id, &data.into());531532        assert_eq!(TemplateModule::balance_count(1, 1), 1000);533        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);534535        assert_ok!(TemplateModule::set_mint_permission(536            origin1.clone(),537            1,538            true539        ));540        assert_ok!(TemplateModule::set_public_access_mode(541            origin1.clone(),542            1,543            AccessMode::WhiteList544        ));545        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));546        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));547        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));548549        // do approve550        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));551        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);552        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));553        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);554        assert_eq!(555            TemplateModule::approved(1, (1, 1))[0],556            ApprovePermissions {557                approved: 2,558                amount: 100000000559            }560        );561562        assert_ok!(TemplateModule::transfer_from(563            origin2.clone(),564            1,565            3,566            1,567            1,568            100569        ));570        assert_eq!(TemplateModule::balance_count(1, 1), 900);571        assert_eq!(TemplateModule::balance_count(1, 3), 100);572        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);573        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);574575        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);576        assert_eq!(577            TemplateModule::approved(1, (1, 1))[0],578            ApprovePermissions {579                approved: 3,580                amount: 100000000581            }582        );583    });584}585586#[test]587fn fungible_approve_and_transfer_from() {588    new_test_ext().execute_with(|| {589        default_limits();590        591        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);592        593        let data = default_fungible_data();594        create_test_item(collection_id, &data.into());595596        let origin1 = Origin::signed(1);597        let origin2 = Origin::signed(2);598599        assert_eq!(TemplateModule::balance_count(1, 1), 1000);600        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);601602        assert_ok!(TemplateModule::set_mint_permission(603            origin1.clone(),604            1,605            true606        ));607        assert_ok!(TemplateModule::set_public_access_mode(608            origin1.clone(),609            1,610            AccessMode::WhiteList611        ));612        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));613        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));614        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));615616        // do approve617        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));618        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);619        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));620        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);621        assert_eq!(622            TemplateModule::approved(1, (1, 1))[0],623            ApprovePermissions {624                approved: 2,625                amount: 100000000626            }627        );628629        assert_ok!(TemplateModule::transfer_from(630            origin2.clone(),631            1,632            3,633            1,634            1,635            100636        ));637        assert_eq!(TemplateModule::balance_count(1, 1), 900);638        assert_eq!(TemplateModule::balance_count(1, 3), 100);639        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);640        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);641642        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);643        assert_eq!(644            TemplateModule::approved(1, (1, 1))[0],645            ApprovePermissions {646                approved: 3,647                amount: 100000000648            }649        );650651        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));652        assert_ok!(TemplateModule::transfer_from(653            origin2.clone(),654            1,655            3,656            1,657            1,658            900659        ));660        assert_eq!(TemplateModule::balance_count(1, 1), 0);661        assert_eq!(TemplateModule::balance_count(1, 3), 1000);662        // assert_eq!(TemplateModule::address_tokens(1, 1), []);663        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);664665        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);666    });667}668669#[test]670fn change_collection_owner() {671    new_test_ext().execute_with(|| {672        default_limits();673        674        let collection_id = create_test_collection(&CollectionMode::NFT, 1);675        676        let origin1 = Origin::signed(1);677        assert_ok!(TemplateModule::change_collection_owner(678            origin1.clone(),679            collection_id,680            2681        ));682        assert_eq!(TemplateModule::collection(collection_id).owner, 2);683    });684}685686#[test]687fn destroy_collection() {688    new_test_ext().execute_with(|| {689        default_limits();690        691        let collection_id = create_test_collection(&CollectionMode::NFT, 1);692        693        let origin1 = Origin::signed(1);694        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));695    });696}697698#[test]699fn burn_nft_item() {700    new_test_ext().execute_with(|| {701        default_limits();702        703        let collection_id = create_test_collection(&CollectionMode::NFT, 1);704705        let origin1 = Origin::signed(1);706        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));707        708        let data = default_nft_data();709        create_test_item(collection_id, &data.into());710711        // check balance (collection with id = 1, user id = 1)712        assert_eq!(TemplateModule::balance_count(1, 1), 1);713714        // burn item715        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));716        assert_noop!(717            TemplateModule::burn_item(origin1.clone(), 1, 1),718            Error::<Test>::TokenNotFound719        );720721        assert_eq!(TemplateModule::balance_count(1, 1), 0);722    });723}724725#[test]726fn burn_fungible_item() {727    new_test_ext().execute_with(|| {728        default_limits();729        730        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);731        732        let origin1 = Origin::signed(1);733        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));734        735        let data = default_fungible_data();736        create_test_item(collection_id, &data.into());737738        // check balance (collection with id = 1, user id = 1)739        assert_eq!(TemplateModule::balance_count(1, 1), 1000);740741        // burn item742        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));743        assert_noop!(744            TemplateModule::burn_item(origin1.clone(), 1, 1),745            Error::<Test>::TokenNotFound746        );747748        assert_eq!(TemplateModule::balance_count(1, 1), 0);749    });750}751752#[test]753fn burn_refungible_item() {754    new_test_ext().execute_with(|| {755        default_limits();756        757        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);758        let origin1 = Origin::signed(1);759760        assert_ok!(TemplateModule::set_mint_permission(761            origin1.clone(),762            collection_id,763            true764        ));765        assert_ok!(TemplateModule::set_public_access_mode(766            origin1.clone(),767            collection_id,768            AccessMode::WhiteList769        ));770        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));771772        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));773        774        let data = default_re_fungible_data();775        create_test_item(collection_id, &data.into());776777        // check balance (collection with id = 1, user id = 2)778        assert_eq!(TemplateModule::balance_count(1, 1), 1000);779780        // burn item781        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));782        assert_noop!(783            TemplateModule::burn_item(origin1.clone(), 1, 1),784            Error::<Test>::TokenNotFound785        );786787        assert_eq!(TemplateModule::balance_count(1, 1), 0);788    });789}790791#[test]792fn add_collection_admin() {793    new_test_ext().execute_with(|| {794        default_limits();795        796        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);797        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);798        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);799        800        let origin1 = Origin::signed(1);801802        // collection admin803        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));804        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));805806        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);807        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);808    });809}810811#[test]812fn remove_collection_admin() {813    new_test_ext().execute_with(|| {814        default_limits();815        816        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);817        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);818        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);819820        let origin1 = Origin::signed(1);821        let origin2 = Origin::signed(2);822823        // collection admin824        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));825        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));826827        assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);828        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);829830        // remove admin831        assert_ok!(TemplateModule::remove_collection_admin(832            origin2.clone(),833            1,834            3835        ));836        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);837    });838}839840#[test]841fn balance_of() {842    new_test_ext().execute_with(|| {843        default_limits();844        845        let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);846        let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);847        let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);848        849        // check balance before850        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);851        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);852        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);853854        let nft_data = default_nft_data();855        create_test_item(nft_collection_id, &nft_data.into());856        857        let fungible_data = default_fungible_data();858        create_test_item(fungible_collection_id, &fungible_data.into());859        860        let re_fungible_data = default_re_fungible_data();861        create_test_item(re_fungible_collection_id, &re_fungible_data.into());862863        // check balance (collection with id = 1, user id = 1)864        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);865        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);866        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);867        assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);868        assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);869        assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);870    });871}872873#[test]874fn approve() {875    new_test_ext().execute_with(|| {876        default_limits();877        878        let collection_id = create_test_collection(&CollectionMode::NFT, 1);879        880        let data = default_nft_data();881        create_test_item(collection_id, &data.into());882883        let origin1 = Origin::signed(1);884        885        // approve886        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));887        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);888    });889}890891#[test]892fn transfer_from() {893    new_test_ext().execute_with(|| {894        default_limits();895        896        let collection_id = create_test_collection(&CollectionMode::NFT, 1);897        let origin1 = Origin::signed(1);898        let origin2 = Origin::signed(2);899900        let data = default_nft_data();901        create_test_item(collection_id, &data.into());902903        // approve904        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));905        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);906907        assert_ok!(TemplateModule::set_mint_permission(908            origin1.clone(),909            1,910            true911        ));912        assert_ok!(TemplateModule::set_public_access_mode(913            origin1.clone(),914            1,915            AccessMode::WhiteList916        ));917        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));918        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));919        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));920921        assert_ok!(TemplateModule::transfer_from(922            origin2.clone(),923            1,924            2,925            1,926            1,927            1928        ));929930        // after transfer931        assert_eq!(TemplateModule::balance_count(1, 1), 0);932        assert_eq!(TemplateModule::balance_count(1, 2), 1);933    });934}935936// #endregion937938// Coverage tests region939// #region940941#[test]942fn owner_can_add_address_to_white_list() {943    new_test_ext().execute_with(|| {944        default_limits();945        946        let collection_id = create_test_collection(&CollectionMode::NFT, 1);947948        let origin1 = Origin::signed(1);949        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));950        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);951    });952}953954#[test]955fn admin_can_add_address_to_white_list() {956    new_test_ext().execute_with(|| {957        default_limits();958        959        let collection_id = create_test_collection(&CollectionMode::NFT, 1);960        let origin1 = Origin::signed(1);961        let origin2 = Origin::signed(2);962963        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));964        assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));965        assert_eq!(TemplateModule::white_list(collection_id)[0], 3);966    });967}968969#[test]970fn nonprivileged_user_cannot_add_address_to_white_list() {971    new_test_ext().execute_with(|| {972        default_limits();973        974        let collection_id = create_test_collection(&CollectionMode::NFT, 1);975976        let origin2 = Origin::signed(2);977        assert_noop!(978            TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),979            Error::<Test>::NoPermission980        );981    });982}983984#[test]985fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {986    new_test_ext().execute_with(|| {987        default_limits();988989        let origin1 = Origin::signed(1);990991        assert_noop!(992            TemplateModule::add_to_white_list(origin1.clone(), 1, 2),993            Error::<Test>::CollectionNotFound994        );995    });996}997998#[test]999fn nobody_can_add_address_to_white_list_of_deleted_collection() {1000    new_test_ext().execute_with(|| {1001        default_limits();1002        1003        let collection_id = create_test_collection(&CollectionMode::NFT, 1);10041005        let origin1 = Origin::signed(1);1006        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1007        assert_noop!(1008            TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),1009            Error::<Test>::CollectionNotFound1010        );1011    });1012}10131014// If address is already added to white list, nothing happens1015#[test]1016fn address_is_already_added_to_white_list() {1017    new_test_ext().execute_with(|| {1018        default_limits();1019        1020        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1021        let origin1 = Origin::signed(1);1022        1023        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1024        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1025        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1026        assert_eq!(TemplateModule::white_list(collection_id).len(), 1);1027    });1028}10291030#[test]1031fn owner_can_remove_address_from_white_list() {1032    new_test_ext().execute_with(|| {1033        default_limits();1034        1035        let collection_id = create_test_collection(&CollectionMode::NFT, 1);10361037        let origin1 = Origin::signed(1);1038        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1039        assert_ok!(TemplateModule::remove_from_white_list(1040            origin1.clone(),1041            collection_id,1042            21043        ));1044        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1045    });1046}10471048#[test]1049fn admin_can_remove_address_from_white_list() {1050    new_test_ext().execute_with(|| {1051        default_limits();1052        1053        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1054        let origin1 = Origin::signed(1);1055        let origin2 = Origin::signed(2);10561057        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));10581059        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));1060        assert_ok!(TemplateModule::remove_from_white_list(1061            origin2.clone(),1062            collection_id,1063            31064        ));1065        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1066    });1067}10681069#[test]1070fn nonprivileged_user_cannot_remove_address_from_white_list() {1071    new_test_ext().execute_with(|| {1072        default_limits();1073        1074        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1075        let origin1 = Origin::signed(1);1076        let origin2 = Origin::signed(2);10771078        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1079        assert_noop!(1080            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1081            Error::<Test>::NoPermission1082        );1083        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1084    });1085}10861087#[test]1088fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1089    new_test_ext().execute_with(|| {1090        default_limits();1091        let origin1 = Origin::signed(1);10921093        assert_noop!(1094            TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1095            Error::<Test>::CollectionNotFound1096        );1097    });1098}10991100#[test]1101fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1102    new_test_ext().execute_with(|| {1103        default_limits();1104        1105        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1106        let origin1 = Origin::signed(1);1107        let origin2 = Origin::signed(2);11081109        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1110        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1111        assert_noop!(1112            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1113            Error::<Test>::CollectionNotFound1114        );1115        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1116    });1117}11181119// If address is already removed from white list, nothing happens1120#[test]1121fn address_is_already_removed_from_white_list() {1122    new_test_ext().execute_with(|| {1123        default_limits();1124        1125        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1126        let origin1 = Origin::signed(1);11271128        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1129        assert_ok!(TemplateModule::remove_from_white_list(1130            origin1.clone(),1131            collection_id,1132            21133        ));1134        assert_ok!(TemplateModule::remove_from_white_list(1135            origin1.clone(),1136            collection_id,1137            21138        ));1139        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1140    });1141}11421143// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1144#[test]1145fn white_list_test_1() {1146    new_test_ext().execute_with(|| {1147        default_limits();1148        1149        let collection_id = create_test_collection(&CollectionMode::NFT, 1);11501151        let origin1 = Origin::signed(1);1152        1153        let data = default_nft_data();1154        create_test_item(collection_id, &data.into());11551156        assert_ok!(TemplateModule::set_public_access_mode(1157            origin1.clone(),1158            collection_id,1159            AccessMode::WhiteList1160        ));1161        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));11621163        assert_noop!(1164            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1165            Error::<Test>::AddresNotInWhiteList1166        );1167    });1168}11691170#[test]1171fn white_list_test_2() {1172    new_test_ext().execute_with(|| {1173        default_limits();1174        1175        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1176        let origin1 = Origin::signed(1);1177        1178        let data = default_nft_data();1179        create_test_item(collection_id, &data.into());11801181        assert_ok!(TemplateModule::set_public_access_mode(1182            origin1.clone(),1183            collection_id,1184            AccessMode::WhiteList1185        ));1186        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1187        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));11881189        // do approve1190        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1191        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);11921193        assert_ok!(TemplateModule::remove_from_white_list(1194            origin1.clone(),1195            1,1196            11197        ));11981199        assert_noop!(1200            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1201            Error::<Test>::AddresNotInWhiteList1202        );1203    });1204}12051206// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1207#[test]1208fn white_list_test_3() {1209    new_test_ext().execute_with(|| {1210        default_limits();1211        1212        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12131214        let origin1 = Origin::signed(1);1215        1216        let data = default_nft_data();1217        create_test_item(collection_id, &data.into());12181219        assert_ok!(TemplateModule::set_public_access_mode(1220            origin1.clone(),1221            collection_id,1222            AccessMode::WhiteList1223        ));1224        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));12251226        assert_noop!(1227            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1228            Error::<Test>::AddresNotInWhiteList1229        );1230    });1231}12321233#[test]1234fn white_list_test_4() {1235    new_test_ext().execute_with(|| {1236        default_limits();1237        1238        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12391240        let origin1 = Origin::signed(1);12411242        let data = default_nft_data();1243        create_test_item(collection_id, &data.into());12441245        assert_ok!(TemplateModule::set_public_access_mode(1246            origin1.clone(),1247            collection_id,1248            AccessMode::WhiteList1249        ));1250        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1251        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12521253        // do approve1254        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1255        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12561257        assert_ok!(TemplateModule::remove_from_white_list(1258            origin1.clone(),1259            collection_id,1260            21261        ));12621263        assert_noop!(1264            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1265            Error::<Test>::AddresNotInWhiteList1266        );1267    });1268}12691270// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1271#[test]1272fn white_list_test_5() {1273    new_test_ext().execute_with(|| {1274        default_limits();1275        1276        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12771278        let origin1 = Origin::signed(1);12791280        let data = default_nft_data();1281        create_test_item(collection_id, &data.into());12821283        assert_ok!(TemplateModule::set_public_access_mode(1284            origin1.clone(),1285            collection_id,1286            AccessMode::WhiteList1287        ));1288        assert_noop!(1289            TemplateModule::burn_item(origin1.clone(), 1, 1),1290            Error::<Test>::AddresNotInWhiteList1291        );1292    });1293}12941295// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1296#[test]1297fn white_list_test_6() {1298    new_test_ext().execute_with(|| {1299        default_limits();1300        1301        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13021303        let origin1 = Origin::signed(1);1304        assert_ok!(TemplateModule::set_public_access_mode(1305            origin1.clone(),1306            collection_id,1307            AccessMode::WhiteList1308        ));13091310        // do approve1311        assert_noop!(1312            TemplateModule::approve(origin1.clone(), 1, 1, 1),1313            Error::<Test>::AddresNotInWhiteList1314        );1315    });1316}13171318// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1319//          tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1320#[test]1321fn white_list_test_7() {1322    new_test_ext().execute_with(|| {1323        default_limits();1324        1325        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13261327        let data = default_nft_data();1328        create_test_item(collection_id, &data.into());1329        1330        let origin1 = Origin::signed(1);13311332        assert_ok!(TemplateModule::set_public_access_mode(1333            origin1.clone(),1334            collection_id,1335            AccessMode::WhiteList1336        ));1337        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1338        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13391340        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1341    });1342}13431344#[test]1345fn white_list_test_8() {1346    new_test_ext().execute_with(|| {1347        default_limits();1348        1349        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13501351        let data = default_nft_data();1352        create_test_item(collection_id, &data.into());1353        1354        let origin1 = Origin::signed(1);13551356        assert_ok!(TemplateModule::set_public_access_mode(1357            origin1.clone(),1358            collection_id,1359            AccessMode::WhiteList1360        ));1361        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1362        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13631364        // do approve1365        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1366        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);13671368        assert_ok!(TemplateModule::transfer_from(1369            origin1.clone(),1370            1,1371            2,1372            1,1373            1,1374            11375        ));1376    });1377}13781379// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1380#[test]1381fn white_list_test_9() {1382    new_test_ext().execute_with(|| {1383        default_limits();1384        1385        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1386        let origin1 = Origin::signed(1);13871388        assert_ok!(TemplateModule::set_public_access_mode(1389            origin1.clone(),1390            collection_id,1391            AccessMode::WhiteList1392        ));1393        assert_ok!(TemplateModule::set_mint_permission(1394            origin1.clone(),1395            collection_id,1396            false1397        ));13981399        let data = default_nft_data();1400        create_test_item(collection_id, &data.into());1401    });1402}14031404// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1405#[test]1406fn white_list_test_10() {1407    new_test_ext().execute_with(|| {1408        default_limits();1409        1410        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14111412        let origin1 = Origin::signed(1);1413        let origin2 = Origin::signed(2);14141415        assert_ok!(TemplateModule::set_public_access_mode(1416            origin1.clone(),1417            collection_id,1418            AccessMode::WhiteList1419        ));1420        assert_ok!(TemplateModule::set_mint_permission(1421            origin1.clone(),1422            collection_id,1423            false1424        ));14251426        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));14271428        assert_ok!(TemplateModule::create_item(1429            origin2.clone(),1430            collection_id,1431            2,1432            default_nft_data().into()1433        ));1434    });1435}14361437// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1438#[test]1439fn white_list_test_11() {1440    new_test_ext().execute_with(|| {1441        default_limits();1442        1443        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14441445        let origin1 = Origin::signed(1);1446        let origin2 = Origin::signed(2);14471448        assert_ok!(TemplateModule::set_public_access_mode(1449            origin1.clone(),1450            collection_id,1451            AccessMode::WhiteList1452        ));1453        assert_ok!(TemplateModule::set_mint_permission(1454            origin1.clone(),1455            collection_id,1456            false1457        ));1458        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));14591460        assert_noop!(1461            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1462            Error::<Test>::PublicMintingNotAllowed1463        );1464    });1465}14661467// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1468#[test]1469fn white_list_test_12() {1470    new_test_ext().execute_with(|| {1471        default_limits();1472        1473        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14741475        let origin1 = Origin::signed(1);1476        let origin2 = Origin::signed(2);14771478        assert_ok!(TemplateModule::set_public_access_mode(1479            origin1.clone(),1480            collection_id,1481            AccessMode::WhiteList1482        ));1483        assert_ok!(TemplateModule::set_mint_permission(1484            origin1.clone(),1485            collection_id,1486            false1487        ));14881489        assert_noop!(1490            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1491            Error::<Test>::PublicMintingNotAllowed1492        );1493    });1494}14951496// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1497#[test]1498fn white_list_test_13() {1499    new_test_ext().execute_with(|| {1500        default_limits();1501        1502        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15031504        let origin1 = Origin::signed(1);15051506        assert_ok!(TemplateModule::set_public_access_mode(1507            origin1.clone(),1508            collection_id,1509            AccessMode::WhiteList1510        ));1511        assert_ok!(TemplateModule::set_mint_permission(1512            origin1.clone(),1513            collection_id,1514            true1515        ));15161517        let data = default_nft_data();1518        create_test_item(collection_id, &data.into());1519    });1520}15211522// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1523#[test]1524fn white_list_test_14() {1525    new_test_ext().execute_with(|| {1526        default_limits();1527        1528        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15291530        let origin1 = Origin::signed(1);1531        let origin2 = Origin::signed(2);15321533        assert_ok!(TemplateModule::set_public_access_mode(1534            origin1.clone(),1535            collection_id,1536            AccessMode::WhiteList1537        ));1538        assert_ok!(TemplateModule::set_mint_permission(1539            origin1.clone(),1540            collection_id,1541            true1542        ));15431544        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));15451546        assert_ok!(TemplateModule::create_item(1547            origin2.clone(),1548            1,1549            2,1550            default_nft_data().into()1551        ));1552    });1553}15541555// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1556#[test]1557fn white_list_test_15() {1558    new_test_ext().execute_with(|| {1559        default_limits();1560        1561        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15621563        let origin1 = Origin::signed(1);1564        let origin2 = Origin::signed(2);15651566        assert_ok!(TemplateModule::set_public_access_mode(1567            origin1.clone(),1568            collection_id,1569            AccessMode::WhiteList1570        ));1571        assert_ok!(TemplateModule::set_mint_permission(1572            origin1.clone(),1573            collection_id,1574            true1575        ));15761577        assert_noop!(1578            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1579            Error::<Test>::AddresNotInWhiteList1580        );1581    });1582}15831584// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1585#[test]1586fn white_list_test_16() {1587    new_test_ext().execute_with(|| {1588        default_limits();1589        1590        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15911592        let origin1 = Origin::signed(1);1593        let origin2 = Origin::signed(2);15941595        assert_ok!(TemplateModule::set_public_access_mode(1596            origin1.clone(),1597            collection_id,1598            AccessMode::WhiteList1599        ));1600        assert_ok!(TemplateModule::set_mint_permission(1601            origin1.clone(),1602            collection_id,1603            true1604        ));1605        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));16061607        assert_ok!(TemplateModule::create_item(1608            origin2.clone(),1609            1,1610            2,1611            default_nft_data().into()1612        ));1613    });1614}16151616// Total number of collections. Positive test1617#[test]1618fn total_number_collections_bound() {1619    new_test_ext().execute_with(|| {1620        default_limits();1621        1622        create_test_collection(&CollectionMode::NFT, 1);1623    });1624}16251626// Total number of collections. Negotive test1627#[test]1628fn total_number_collections_bound_neg() {1629    new_test_ext().execute_with(|| {1630        default_limits();16311632        let origin1 = Origin::signed(1);16331634        for i in 0..default_collection_numbers_limit() {1635            create_test_collection(&CollectionMode::NFT, i + 1);1636        }16371638        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1639        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1640        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16411642        // 11-th collection in chain. Expects error1643        assert_noop!(TemplateModule::create_collection(1644            origin1.clone(),1645            col_name1.clone(),1646            col_desc1.clone(),1647            token_prefix1.clone(),1648            CollectionMode::NFT1649        ), Error::<Test>::TotalCollectionsLimitExceeded);1650    });1651}16521653// Owned tokens by a single address. Positive test1654#[test]1655fn owned_tokens_bound() {1656    new_test_ext().execute_with(|| {1657        default_limits();1658        1659        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16601661        let data = default_nft_data();1662        create_test_item(collection_id, &data.clone().into());1663        create_test_item(collection_id, &data.into());1664    });1665}16661667// Owned tokens by a single address. Negotive test1668#[test]1669fn owned_tokens_bound_neg() {1670    new_test_ext().execute_with(|| {1671        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1672            collection_numbers_limit: 10,1673            account_token_ownership_limit: 1,1674            collections_admins_limit: 5,1675            custom_data_limit: 2048,1676            nft_sponsor_transfer_timeout: 15,1677            fungible_sponsor_transfer_timeout: 15,1678            refungible_sponsor_transfer_timeout: 15,          1679        }));1680        1681        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16821683        let origin1 = Origin::signed(1);1684        let data = default_nft_data();1685        create_test_item(collection_id, &data.clone().into());16861687        assert_noop!(TemplateModule::create_item(1688            origin1.clone(),1689            1,1690            1,1691            data.into()1692        ),  Error::<Test>::AddressOwnershipLimitExceeded);1693    });1694}16951696// Number of collection admins. Positive test1697#[test]1698fn collection_admins_bound() {1699    new_test_ext().execute_with(|| {1700        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1701            collection_numbers_limit: 10,1702            account_token_ownership_limit: 10,1703            collections_admins_limit: 2,1704            custom_data_limit: 2048,1705            nft_sponsor_transfer_timeout: 15,1706            fungible_sponsor_transfer_timeout: 15,1707            refungible_sponsor_transfer_timeout: 15,          1708        }));1709        1710        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17111712        let origin1 = Origin::signed(1);1713        1714        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1715        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));1716    });1717}17181719// Number of collection admins. Negotive test1720#[test]1721fn collection_admins_bound_neg() {1722    new_test_ext().execute_with(|| {1723        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1724            collection_numbers_limit: 10,1725            account_token_ownership_limit: 1,1726            collections_admins_limit: 1,1727            custom_data_limit: 2048,1728            nft_sponsor_transfer_timeout: 15,1729            fungible_sponsor_transfer_timeout: 15,1730            refungible_sponsor_transfer_timeout: 15,          1731        }));1732        1733        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17341735        let origin1 = Origin::signed(1);17361737        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1738        assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), Error::<Test>::CollectionAdminsLimitExceeded);1739    });1740}17411742// NFT custom data size. Negative test const_data.1743#[test]1744fn custom_data_size_nft_const_data_bound_neg() {1745    new_test_ext().execute_with(|| {1746        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1747            collection_numbers_limit: 10,1748            account_token_ownership_limit: 10,1749            collections_admins_limit: 5,1750            custom_data_limit: 2,1751            nft_sponsor_transfer_timeout: 15,1752            fungible_sponsor_transfer_timeout: 15,1753            refungible_sponsor_transfer_timeout: 15,          1754        }));1755        1756        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17571758        let origin1 = Origin::signed(1);1759        let too_big_const_data = CreateItemData::NFT(CreateNftData{1760            const_data: vec![1, 2, 3, 4],1761            variable_data: vec![]1762        });17631764        assert_noop!(TemplateModule::create_item(1765            origin1.clone(),1766            collection_id,1767            1,1768            too_big_const_data1769        ), Error::<Test>::TokenConstDataLimitExceeded);1770    });1771}17721773// NFT custom data size. Negative test variable_data.1774#[test]1775fn custom_data_size_nft_variable_data_bound_neg() {1776    new_test_ext().execute_with(|| {1777        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1778            collection_numbers_limit: 10,1779            account_token_ownership_limit: 10,1780            collections_admins_limit: 5,1781            custom_data_limit: 2,1782            nft_sponsor_transfer_timeout: 15,1783            fungible_sponsor_transfer_timeout: 15,1784            refungible_sponsor_transfer_timeout: 15,          1785        }));17861787        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17881789        let origin1 = Origin::signed(1);1790        let too_big_const_data = CreateItemData::NFT(CreateNftData{1791            const_data: vec![],1792            variable_data: vec![1, 2, 3, 4]1793        });17941795        assert_noop!(TemplateModule::create_item(1796            origin1.clone(),1797            collection_id,1798            1,1799            too_big_const_data1800        ), Error::<Test>::TokenVariableDataLimitExceeded);1801    });1802}18031804// Re fungible custom data size. Negative test const_data.1805#[test]1806fn custom_data_size_re_fungible_const_data_bound_neg() {1807    new_test_ext().execute_with(|| {1808        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1809            collection_numbers_limit: 10,1810            account_token_ownership_limit: 10,1811            collections_admins_limit: 5,1812            custom_data_limit: 2,1813            nft_sponsor_transfer_timeout: 15,1814            fungible_sponsor_transfer_timeout: 15,1815            refungible_sponsor_transfer_timeout: 15,          1816        }));18171818        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18191820        let origin1 = Origin::signed(1);1821        let too_big_const_data = CreateItemData::NFT(CreateNftData{1822            const_data: vec![1, 2, 3, 4],1823            variable_data: vec![]1824        });18251826        assert_noop!(TemplateModule::create_item(1827            origin1.clone(),1828            collection_id,1829            1,1830            too_big_const_data1831        ), Error::<Test>::TokenConstDataLimitExceeded);1832    });1833}18341835// Re fungible custom data size. Negative test variable_data.1836#[test]1837fn custom_data_size_re_fungible_variable_data_bound_neg() {1838    new_test_ext().execute_with(|| {1839        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1840            collection_numbers_limit: 10,1841            account_token_ownership_limit: 10,1842            collections_admins_limit: 5,1843            custom_data_limit: 2,1844            nft_sponsor_transfer_timeout: 15,1845            fungible_sponsor_transfer_timeout: 15,1846            refungible_sponsor_transfer_timeout: 15,          1847        }));18481849        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18501851        let origin1 = Origin::signed(1);1852        let too_big_const_data = CreateItemData::NFT(CreateNftData{1853            const_data: vec![],1854            variable_data: vec![1, 2, 3, 4]1855        });18561857        assert_noop!(TemplateModule::create_item(1858            origin1.clone(),1859            collection_id,1860            1,1861            too_big_const_data1862        ), Error::<Test>::TokenVariableDataLimitExceeded);1863    });1864}1865// #endregion18661867#[test]1868fn set_const_on_chain_schema() {1869    new_test_ext().execute_with(|| {1870        default_limits();18711872        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18731874        let origin1 = Origin::signed(1);1875        assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));18761877        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"test const on chain schema".to_vec());1878        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"".to_vec());1879    });1880}18811882#[test]1883fn set_variable_on_chain_schema() {1884    new_test_ext().execute_with(|| {1885        default_limits();1886        1887        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18881889        let origin1 = Origin::signed(1);1890        assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));18911892        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"".to_vec());1893        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"test variable on chain schema".to_vec());1894    });1895}18961897#[test]1898fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1899    new_test_ext().execute_with(|| {1900        default_limits();19011902        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19031904        let origin1 = Origin::signed(1);1905        1906        let data = default_nft_data();1907        create_test_item(1, &data.into());1908        1909        let variable_data = b"test set_variable_meta_data method.".to_vec();1910        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19111912        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, variable_data);1913    });1914}19151916#[test]1917fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1918    new_test_ext().execute_with(|| {1919        default_limits();19201921        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19221923        let origin1 = Origin::signed(1);19241925        let data = default_re_fungible_data();1926        create_test_item(1, &data.into());19271928        let variable_data = b"test set_variable_meta_data method.".to_vec();1929        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19301931        assert_eq!(TemplateModule::refungible_item_id(collection_id, 1).variable_data, variable_data);1932    });1933}193419351936#[test]1937fn set_variable_meta_data_on_fungible_token_fails() {1938    new_test_ext().execute_with(|| {1939        default_limits();19401941        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19421943        let origin1 = Origin::signed(1);19441945        let data = default_fungible_data();1946        create_test_item(1, &data.into());19471948        let variable_data = b"test set_variable_meta_data method.".to_vec();1949        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()), Error::<Test>::CantStoreMetadataInFungibleTokens);1950    });1951}19521953#[test]1954fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1955    new_test_ext().execute_with(|| {1956        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1957            collection_numbers_limit: default_collection_numbers_limit(),1958            account_token_ownership_limit: 10,1959            collections_admins_limit: 5,1960            custom_data_limit: 10,1961            nft_sponsor_transfer_timeout: 15,1962            fungible_sponsor_transfer_timeout: 15,1963            refungible_sponsor_transfer_timeout: 15,          1964        }));19651966        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19671968        let origin1 = Origin::signed(1);19691970        let data = default_nft_data();1971        create_test_item(1, &data.into());19721973        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1974        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1975    });1976}19771978#[test]1979fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1980    new_test_ext().execute_with(|| {1981        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1982            collection_numbers_limit: default_collection_numbers_limit(),1983            account_token_ownership_limit: 10,1984            collections_admins_limit: 5,1985            custom_data_limit: 10,1986            nft_sponsor_transfer_timeout: 15,1987            fungible_sponsor_transfer_timeout: 15,1988            refungible_sponsor_transfer_timeout: 15,          1989        }));199019911992        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19931994        let origin1 = Origin::signed(1);19951996        let data = default_re_fungible_data();1997        create_test_item(1, &data.into());19981999        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2000        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);2001    });2002}