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

difftreelog

Unit tests added

str-mv2020-09-08parent: #aa92af0.patch.diff
in: master

3 files changed

modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
129 pub amount: u64129 pub amount: u64
130}130}
131
132#[derive(Encode, Decode, Default, Clone, PartialEq)]
133#[cfg_attr(feature = "std", derive(Debug))]
134pub struct VestingItem<AccountId, Moment>
135{
136 pub sender: AccountId,
137 pub recipient: AccountId,
138 pub collection_id: u64,
139 pub item_id: u64,
140 pub amount: u64,
141 pub vesting_date: Moment
142}
131143
132pub trait Trait: system::Trait {144pub trait Trait: system::Trait {
133 type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;145 type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
156 pub FungibleItemList get(fn fungible_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => FungibleItemType<T::AccountId>;168 pub FungibleItemList get(fn fungible_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => FungibleItemType<T::AccountId>;
157 pub ReFungibleItemList get(fn refungible_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => ReFungibleItemType<T::AccountId>;169 pub ReFungibleItemList get(fn refungible_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => ReFungibleItemType<T::AccountId>;
158170
171 // Active vesting list
172 // pub VestingList get(fn vesting): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => VestingItem<T::AccountId, T::Moment>;
173
174 /// Index list
159 pub AddressTokens get(fn address_tokens): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) T::AccountId => Vec<u64>;175 pub AddressTokens get(fn address_tokens): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) T::AccountId => Vec<u64>;
160176
161 // Sponsorship177 // Sponsorship
636652
637 fn burn_refungible_item(collection_id: u64, item_id: u64, owner: T::AccountId) -> DispatchResult {653 fn burn_refungible_item(collection_id: u64, item_id: u64, owner: T::AccountId) -> DispatchResult {
638 654
655 ensure!(<ReFungibleItemList<T>>::contains_key(collection_id, item_id), "Item does not exists");
639 let collection = <ReFungibleItemList<T>>::get(collection_id, item_id);656 let collection = <ReFungibleItemList<T>>::get(collection_id, item_id);
640 let item = collection.owner.iter().filter(|&i| i.owner == owner).next().unwrap();657 let item = collection.owner.iter().filter(|&i| i.owner == owner).next().unwrap();
641 Self::remove_token_index(collection_id, item_id, owner.clone())?;658 Self::remove_token_index(collection_id, item_id, owner.clone())?;
655672
656 fn burn_nft_item(collection_id: u64, item_id: u64) -> DispatchResult {673 fn burn_nft_item(collection_id: u64, item_id: u64) -> DispatchResult {
657 674
675 ensure!(<NftItemList<T>>::contains_key(collection_id, item_id), "Item does not exists");
658 let item = <NftItemList<T>>::get(collection_id, item_id);676 let item = <NftItemList<T>>::get(collection_id, item_id);
659 Self::remove_token_index(collection_id, item_id, item.owner.clone())?;677 Self::remove_token_index(collection_id, item_id, item.owner.clone())?;
660678
671689
672 fn burn_fungible_item(collection_id: u64, item_id: u64) -> DispatchResult {690 fn burn_fungible_item(collection_id: u64, item_id: u64) -> DispatchResult {
673 691
692 ensure!(<FungibleItemList<T>>::contains_key(collection_id, item_id), "Item does not exists");
674 let item = <FungibleItemList<T>>::get(collection_id, item_id);693 let item = <FungibleItemList<T>>::get(collection_id, item_id);
675 Self::remove_token_index(collection_id, item_id, item.owner.clone())?;694 Self::remove_token_index(collection_id, item_id, item.owner.clone())?;
676695
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
--- a/pallets/nft/src/tests.rs
+++ b/pallets/nft/src/tests.rs
@@ -183,7 +183,6 @@
     });
 }
 
-
 #[test]
 fn transfer_nft_item() {
     new_test_ext().execute_with(|| {
@@ -364,580 +363,416 @@
     });
 }
 
+#[test]
+fn change_collection_owner() {
+    new_test_ext().execute_with(|| {
+        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
+        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
+        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        let mode: CollectionMode = CollectionMode::NFT(2000);
 
+        let origin1 = Origin::signed(1);
+        assert_ok!(TemplateModule::create_collection(
+            origin1.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            mode
+        ));
+        assert_ok!(TemplateModule::change_collection_owner(
+            origin1.clone(),
+            1,
+            2
+        ));
+        assert_eq!(TemplateModule::collection(1).owner, 2);
+    });
+}
 
+#[test]
+fn destroy_collection() {
+    new_test_ext().execute_with(|| {
+        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
+        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
+        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        let mode: CollectionMode = CollectionMode::NFT(2000);
 
+        let origin1 = Origin::signed(1);
+        assert_ok!(TemplateModule::create_collection(
+            origin1.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            mode
+        ));
+        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));
+    });
+}
 
+#[test]
+fn burn_nft_item() {
+    new_test_ext().execute_with(|| {
+        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
+        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
+        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        let mode: CollectionMode = CollectionMode::NFT(2000);
 
+        let origin1 = Origin::signed(1);
+        let origin2 = Origin::signed(2);
+        assert_ok!(TemplateModule::create_collection(
+            origin1.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            mode
+        ));
+        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
+        assert_ok!(TemplateModule::create_item(
+            origin2.clone(),
+            1,
+            [1, 2, 3].to_vec(),
+            1
+        ));
 
+        assert_eq!(TemplateModule::nft_item_id(1,1).data, [1,2,3].to_vec());
 
+        // check balance (collection with id = 1, user id = 1)
+        assert_eq!(TemplateModule::balance_count(1, 1), 1);
 
+        // burn item
+        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));
+        assert_noop!(
+            TemplateModule::burn_item(origin1.clone(), 1, 1),
+            "Item does not exists"
+        );
 
+        assert_eq!(TemplateModule::balance_count(1, 1), 0);
+    });
+}
 
+#[test]
+fn burn_fungible_item() {
+    new_test_ext().execute_with(|| {
+        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
+        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
+        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        let mode: CollectionMode = CollectionMode::Fungible(3);
 
+        let origin1 = Origin::signed(1);
+        let origin2 = Origin::signed(2);
+        assert_ok!(TemplateModule::create_collection(
+            origin1.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            mode
+        ));
+        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
+        assert_ok!(TemplateModule::create_item(
+            origin2.clone(),
+            1,
+            [].to_vec(),
+            1
+        ));
 
+        // check balance (collection with id = 1, user id = 1)
+        assert_eq!(TemplateModule::balance_count(1, 1), 1000);
 
+        // burn item
+        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));
+        assert_noop!(
+            TemplateModule::burn_item(origin1.clone(), 1, 1),
+            "Item does not exists"
+        );
 
+        assert_eq!(TemplateModule::balance_count(1, 1), 0);
+    });
+}
 
-// #[test]
-// fn create_collection_test() {
-//     new_test_ext().execute_with(|| {
-//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
-//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
-//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+#[test]
+fn burn_refungible_item() {
+    new_test_ext().execute_with(|| {
+        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
+        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
+        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        let mode: CollectionMode = CollectionMode::ReFungible(200, 3);
 
-//         let size = 1024;
-//         let origin1 = Origin::signed(1);
-//         assert_ok!(TemplateModule::create_collection(
-//             origin1.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_eq!(TemplateModule::collection(1).owner, 1);
-//     });
-// }
+        let origin1 = Origin::signed(1);
+        let origin2 = Origin::signed(2);
+        assert_ok!(TemplateModule::create_collection(
+            origin1.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            mode
+        ));
+        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
+        assert_ok!(TemplateModule::create_item(
+            origin2.clone(),
+            1,
+            [1,2,3].to_vec(),
+            1
+        ));
 
-// #[test]
-// fn change_collection_owner() {
-//     new_test_ext().execute_with(|| {
-//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
-//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
-//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        assert_eq!(TemplateModule::refungible_item_id(1,1).data, [1,2,3].to_vec());
 
-//         let size = 1024;
-//         let origin1 = Origin::signed(1);
+        // check balance (collection with id = 1, user id = 2)
+        assert_eq!(TemplateModule::balance_count(1, 1), 1000);
 
-//         assert_ok!(TemplateModule::create_collection(
-//             origin1.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::change_collection_owner(
-//             origin1.clone(),
-//             1,
-//             2
-//         ));
-//         assert_eq!(TemplateModule::collection(1).owner, 2);
-//     });
-// }
+        // burn item
+        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));
+        assert_noop!(
+            TemplateModule::burn_item(origin1.clone(), 1, 1),
+            "Item does not exists"
+        );
 
-// #[test]
-// fn destroy_collection() {
-//     new_test_ext().execute_with(|| {
-//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
-//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
-//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        assert_eq!(TemplateModule::balance_count(1, 1), 0);
+    });
+}
 
-//         let size = 1024;
-//         let origin1 = Origin::signed(1);
+#[test]
+fn add_collection_admin() {
+    new_test_ext().execute_with(|| {
+        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
+        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
+        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        let mode: CollectionMode = CollectionMode::NFT(2000);
 
-//         assert_ok!(TemplateModule::create_collection(
-//             origin1.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));
-//     });
-// }
-
-// #[test]
-// fn create_item() {
-//     new_test_ext().execute_with(|| {
-//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
-//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
-//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
-
-//         let size = 1024;
-//         let origin1 = Origin::signed(1);
-//         let origin2 = Origin::signed(2);
-
-//         assert_ok!(TemplateModule::create_collection(
-//             origin1.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
-//         assert_ok!(TemplateModule::create_item(
-//             origin2.clone(),
-//             1,
-//             [1, 1, 1].to_vec()
-//         ));
-
-//         // check balance (collection with id = 1, user id = 2)
-//         assert_eq!(TemplateModule::balance_count((1, 2)), 1);
-//     });
-// }
-
-// #[test]
-// fn burn_item() {
-//     new_test_ext().execute_with(|| {
-//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
-//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
-//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
-
-//         let size = 1024;
-//         let origin1 = Origin::signed(1);
-//         let origin2 = Origin::signed(2);
-
-//         assert_ok!(TemplateModule::create_collection(
-//             origin1.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
-//         assert_ok!(TemplateModule::create_item(
-//             origin2.clone(),
-//             1,
-//             [1, 1, 1].to_vec()
-//         ));
-
-//         // check balance (collection with id = 1, user id = 2)
-//         assert_eq!(TemplateModule::balance_count((1, 2)), 1);
-
-//         // burn item
-//         assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));
-//         assert_noop!(
-//             TemplateModule::burn_item(origin1.clone(), 1, 1),
-//             "Item does not exists"
-//         );
-
-//         assert_eq!(TemplateModule::balance_count((1, 1)), 0);
-//     });
-// }
-
-// #[test]
-// fn add_collection_admin() {
-//     new_test_ext().execute_with(|| {
-//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
-//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
-//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
-
-//         let size = 1024;
-//         let origin1 = Origin::signed(1);
-//         let origin2 = Origin::signed(2);
-//         let origin3 = Origin::signed(3);
-
-//         assert_ok!(TemplateModule::create_collection(
-//             origin1.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin2.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin3.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-
-//         assert_eq!(TemplateModule::collection(1).owner, 1);
-//         assert_eq!(TemplateModule::collection(2).owner, 2);
-//         assert_eq!(TemplateModule::collection(3).owner, 3);
-
-//         // collection admin
-//         assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
-//         assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));
-
-//         assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);
-//         assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);
-//     });
-// }
-
-// #[test]
-// fn remove_collection_admin() {
-//     new_test_ext().execute_with(|| {
-//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
-//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
-//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
-
-//         let size = 1024;
-//         let origin1 = Origin::signed(1);
-//         let origin2 = Origin::signed(2);
-//         let origin3 = Origin::signed(3);
-
-//         assert_ok!(TemplateModule::create_collection(
-//             origin1.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin2.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin3.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-
-//         assert_eq!(TemplateModule::collection(1).owner, 1);
-//         assert_eq!(TemplateModule::collection(2).owner, 2);
-//         assert_eq!(TemplateModule::collection(3).owner, 3);
-
-//         // collection admin
-//         assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
-//         assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));
-
-//         assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);
-//         assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);
-
-//         // remove admin
-//         assert_ok!(TemplateModule::remove_collection_admin(
-//             origin2.clone(),
-//             1,
-//             3
-//         ));
-//         assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);
-//     });
-// }
-
-// #[test]
-// fn balance_of() {
-//     new_test_ext().execute_with(|| {
-//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
-//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
-//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
-
-//         let size = 1024;
-//         let origin1 = Origin::signed(1);
-//         let origin2 = Origin::signed(2);
-//         let origin3 = Origin::signed(3);
-
-//         assert_ok!(TemplateModule::create_collection(
-//             origin1.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin2.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin3.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-
-//         assert_eq!(TemplateModule::collection(1).owner, 1);
-//         assert_eq!(TemplateModule::collection(2).owner, 2);
-//         assert_eq!(TemplateModule::collection(3).owner, 3);
-
-//         // check balance before
-//         assert_eq!(TemplateModule::balance_count((1, 1)), 0);
-
-//         // create item
-//         assert_ok!(TemplateModule::create_item(
-//             origin1.clone(),
-//             1,
-//             [1, 1, 1].to_vec()
-//         ));
+        let origin1 = Origin::signed(1);
+        let origin2 = Origin::signed(2);
+        let origin3 = Origin::signed(3);
+        assert_ok!(TemplateModule::create_collection(
+            origin1.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            mode.clone()
+        ));
+        assert_ok!(TemplateModule::create_collection(
+            origin2.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            mode.clone()
+        ));
+        assert_ok!(TemplateModule::create_collection(
+            origin3.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            mode.clone()
+        ));
 
-//         // check balance (collection with id = 1, user id = 2)
-//         assert_eq!(TemplateModule::balance_count((1, 1)), 1);
-//         assert_eq!(TemplateModule::item_id((1, 1)).owner, 1);
-//     });
-// }
+        assert_eq!(TemplateModule::collection(1).owner, 1);
+        assert_eq!(TemplateModule::collection(2).owner, 2);
+        assert_eq!(TemplateModule::collection(3).owner, 3);
 
-// #[test]
-// fn transfer() {
-//     new_test_ext().execute_with(|| {
-//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
-//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
-//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        // collection admin
+        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
+        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));
 
-//         let size = 1024;
-//         let origin1 = Origin::signed(1);
-//         let origin2 = Origin::signed(2);
-//         let origin3 = Origin::signed(3);
+        assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);
+        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);
+    });
+}
 
-//         assert_ok!(TemplateModule::create_collection(
-//             origin1.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin2.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin3.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
+#[test]
+fn remove_collection_admin() {
+    new_test_ext().execute_with(|| {
+        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
+        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
+        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        let mode: CollectionMode = CollectionMode::NFT(2000);
 
-//         assert_eq!(TemplateModule::collection(1).owner, 1);
-//         assert_eq!(TemplateModule::collection(2).owner, 2);
-//         assert_eq!(TemplateModule::collection(3).owner, 3);
+        let origin1 = Origin::signed(1);
+        let origin2 = Origin::signed(2);
+        let origin3 = Origin::signed(3);
 
-//         // create item
-//         assert_ok!(TemplateModule::create_item(
-//             origin1.clone(),
-//             1,
-//             [1, 1, 1].to_vec()
-//         ));
+        assert_ok!(TemplateModule::create_collection(
+            origin1.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            mode.clone()
+        ));
+        assert_ok!(TemplateModule::create_collection(
+            origin2.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            mode.clone()
+        ));
+        assert_ok!(TemplateModule::create_collection(
+            origin3.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            mode.clone()
+        ));
 
-//         // transfer
-//         assert_ok!(TemplateModule::transfer(origin1.clone(), 1, 1, 2));
-//         assert_eq!(TemplateModule::item_id((1, 1)).owner, 2);
+        assert_eq!(TemplateModule::collection(1).owner, 1);
+        assert_eq!(TemplateModule::collection(2).owner, 2);
+        assert_eq!(TemplateModule::collection(3).owner, 3);
 
-//         // balance_of check
-//         assert_eq!(TemplateModule::balance_count((1, 1)), 0);
-//         assert_eq!(TemplateModule::balance_count((1, 2)), 1);
-//     });
-// }
+        // collection admin
+        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
+        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));
 
-// #[test]
-// fn approve() {
-//     new_test_ext().execute_with(|| {
-//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
-//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
-//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);
+        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);
 
-//         let size = 1024;
-//         let origin1 = Origin::signed(1);
-//         let origin2 = Origin::signed(2);
-//         let origin3 = Origin::signed(3);
+        // remove admin
+        assert_ok!(TemplateModule::remove_collection_admin(
+            origin2.clone(),
+            1,
+            3
+        ));
+        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);
+    });
+}
 
-//         assert_ok!(TemplateModule::create_collection(
-//             origin1.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin2.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin3.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
+#[test]
+fn balance_of() {
+    new_test_ext().execute_with(|| {
+        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
+        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
+        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        let nft_mode: CollectionMode = CollectionMode::NFT(2000);
+        let furg_mode: CollectionMode = CollectionMode::Fungible(3);
+        let refung_mode: CollectionMode = CollectionMode::ReFungible(2000, 3);
 
-//         assert_eq!(TemplateModule::collection(1).owner, 1);
-//         assert_eq!(TemplateModule::collection(2).owner, 2);
-//         assert_eq!(TemplateModule::collection(3).owner, 3);
+        let origin1 = Origin::signed(1);
 
-//         // create item
-//         assert_ok!(TemplateModule::create_item(
-//             origin1.clone(),
-//             1,
-//             [1, 1, 1].to_vec()
-//         ));
+        assert_ok!(TemplateModule::create_collection(
+            origin1.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            nft_mode.clone()
+        ));
+        assert_ok!(TemplateModule::create_collection(
+            origin1.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            furg_mode.clone()
+        ));
+        assert_ok!(TemplateModule::create_collection(
+            origin1.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            refung_mode.clone()
+        ));
 
-//         // approve
-//         assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
-//         assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);
-//     });
-// }
+        assert_eq!(TemplateModule::collection(1).owner, 1);
+        assert_eq!(TemplateModule::collection(2).owner, 1);
+        assert_eq!(TemplateModule::collection(3).owner, 1);
 
-// #[test]
-// fn get_approved() {
-//     new_test_ext().execute_with(|| {
-//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
-//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
-//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        // check balance before
+        assert_eq!(TemplateModule::balance_count(1, 1), 0);
+        assert_eq!(TemplateModule::balance_count(2, 1), 0);
+        assert_eq!(TemplateModule::balance_count(3, 1), 0);
 
-//         let size = 1024;
-//         let origin1 = Origin::signed(1);
-//         let origin2 = Origin::signed(2);
-//         let origin3 = Origin::signed(3);
+        // create item
+        assert_ok!(TemplateModule::create_item(
+            origin1.clone(),
+            1,
+            [1, 1, 1].to_vec(),
+            1
+        ));
 
-//         assert_ok!(TemplateModule::create_collection(
-//             origin1.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin2.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin3.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
+        assert_ok!(TemplateModule::create_item(
+            origin1.clone(),
+            2,
+            [].to_vec(),
+            1
+        ));
 
-//         assert_eq!(TemplateModule::collection(1).owner, 1);
-//         assert_eq!(TemplateModule::collection(2).owner, 2);
-//         assert_eq!(TemplateModule::collection(3).owner, 3);
+        assert_ok!(TemplateModule::create_item(
+            origin1.clone(),
+            3,
+            [1, 1, 1].to_vec(),
+            1
+        ));
 
-//         // create item
-//         assert_ok!(TemplateModule::create_item(
-//             origin1.clone(),
-//             1,
-//             [1, 1, 1].to_vec()
-//         ));
+        // check balance (collection with id = 1, user id = 1)
+        assert_eq!(TemplateModule::balance_count(1, 1), 1);
+        assert_eq!(TemplateModule::balance_count(2, 1), 1000);
+        assert_eq!(TemplateModule::balance_count(3, 1), 1000);
+        assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 1);
+        assert_eq!(TemplateModule::fungible_item_id(2, 1).owner, 1);
+        assert_eq!(TemplateModule::refungible_item_id(3, 1).owner[0].owner, 1);
+    });
+}
 
-//         // approve
-//         assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
-//         assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);
-//     });
-// }
+#[test]
+fn approve() {
+    new_test_ext().execute_with(|| {
+        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
+        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
+        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        let nft_mode: CollectionMode = CollectionMode::NFT(2000);
+        let origin1 = Origin::signed(1);
 
-// #[test]
-// fn transfer_from() {
-//     new_test_ext().execute_with(|| {
-//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
-//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
-//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        assert_ok!(TemplateModule::create_collection(
+            origin1.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            nft_mode.clone()
+        ));
 
-//         let size = 1024;
-//         let origin1 = Origin::signed(1);
-//         let origin2 = Origin::signed(2);
-//         let origin3 = Origin::signed(3);
+        assert_eq!(TemplateModule::collection(1).owner, 1);
 
-//         assert_ok!(TemplateModule::create_collection(
-//             origin1.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin2.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin3.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
+        // create item
+        assert_ok!(TemplateModule::create_item(
+            origin1.clone(),
+            1,
+            [1, 1, 1].to_vec(),
+            1
+        ));
 
-//         assert_eq!(TemplateModule::collection(1).owner, 1);
-//         assert_eq!(TemplateModule::collection(2).owner, 2);
-//         assert_eq!(TemplateModule::collection(3).owner, 3);
+        // approve
+        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
+        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);
+    });
+}
 
-//         // create item
-//         assert_ok!(TemplateModule::create_item(
-//             origin1.clone(),
-//             1,
-//             [1, 1, 1].to_vec()
-//         ));
+#[test]
+fn transfer_from() {
+    new_test_ext().execute_with(|| {
+        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
+        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
+        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        let mode: CollectionMode = CollectionMode::NFT(2000);
+        let origin1 = Origin::signed(1);
+        let origin2 = Origin::signed(2);
 
-//         // approve
-//         assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
-//         assert_ok!(TemplateModule::transfer_from(origin1.clone(), 1, 1, 2));
-//     });
-// }
+        assert_ok!(TemplateModule::create_collection(
+            origin1.clone(),
+            col_name1.clone(),
+            col_desc1.clone(),
+            token_prefix1.clone(),
+            mode
+        ));
 
-// #[test]
-// fn index_list() {
-//     new_test_ext().execute_with(|| {
-//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
-//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
-//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+        assert_eq!(TemplateModule::collection(1).owner, 1);
 
-//         let size = 1024;
-//         let origin1 = Origin::signed(1);
-//         let origin2 = Origin::signed(2);
-//         let origin3 = Origin::signed(3);
+        // create item
+        assert_ok!(TemplateModule::create_item(
+            origin1.clone(),
+            1,
+            [1, 1, 1].to_vec(),
+            1
+        ));
 
-//         assert_ok!(TemplateModule::create_collection(
-//             origin1.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin2.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
-//         assert_ok!(TemplateModule::create_collection(
-//             origin3.clone(),
-//             col_name1.clone(),
-//             col_desc1.clone(),
-//             token_prefix1.clone(),
-//             size
-//         ));
+        // approve
+        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
+        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);
+        assert_ok!(TemplateModule::transfer_from(origin2.clone(), 1, 2, 1, 1, 1));
 
-//         assert_eq!(TemplateModule::collection(1).owner, 1);
-//         assert_eq!(TemplateModule::collection(2).owner, 2);
-//         assert_eq!(TemplateModule::collection(3).owner, 3);
-//         // create items
-//         assert_ok!(TemplateModule::create_item(
-//             origin1.clone(),
-//             1,
-//             [1, 1, 1].to_vec()
-//         ));
-//         assert_ok!(TemplateModule::create_item(
-//             origin1.clone(),
-//             1,
-//             [1, 1, 2].to_vec()
-//         ));
-//         assert_ok!(TemplateModule::create_item(
-//             origin1.clone(),
-//             1,
-//             [1, 2, 3].to_vec()
-//         ));
-//         assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 3);
-//         // burn one
-//         assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 2));
-//         assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 2);
-//         // burn another one
-//         assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 3));
-//         assert_eq!(TemplateModule::address_tokens((1, 1))[0], 1);
-//     });
-// }
+        // after transfer
+        assert_eq!(TemplateModule::balance_count(1, 1), 0);
+        assert_eq!(TemplateModule::balance_count(1, 2), 1);
+    });
+}
modifiedruntime/src/lib.rsdiffbeforeafterboth
--- a/runtime/src/lib.rs
+++ b/runtime/src/lib.rs
@@ -190,7 +190,6 @@
     /// Version of the runtime.
     type Version = Version;
     /// Converts a module to the index of the module in `construct_runtime!`.
-    ///
     /// This type is being generated by `construct_runtime!`.
     type ModuleToIndex = ModuleToIndex;
     /// What to do if a new account is created.