From a113316179ae9c3666c232c4ecb3225bbcd65917 Mon Sep 17 00:00:00 2001 From: sierra19XX <15652887+sierra19XX@users.noreply.github.com> Date: Tue, 6 Oct 2020 19:34:46 +1100 Subject: [PATCH] nft_lottery5 - add delete ticket test --- libraries/chain/nft_lottery_evaluator.cpp | 13 ++++ tests/tests/nft_lottery_tests.cpp | 93 +++++++++++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/libraries/chain/nft_lottery_evaluator.cpp b/libraries/chain/nft_lottery_evaluator.cpp index e1ae8f7e..794616cf 100644 --- a/libraries/chain/nft_lottery_evaluator.cpp +++ b/libraries/chain/nft_lottery_evaluator.cpp @@ -124,6 +124,19 @@ namespace graphene db().modify(lottery_md_obj.lottery_data->lottery_balance_id(db()), [&](nft_lottery_balance_object &obj) { obj.sweeps_tickets_sold = lottery_md_obj.get_token_current_supply(db()); }); + + if (lottery_md_obj.lottery_data->lottery_options.delete_tickets_after_draw) + { + const auto &nft_index_by_md = db().get_index_type().indices().get(); + auto delete_nft_itr = nft_index_by_md.lower_bound(op.lottery_id); + while (delete_nft_itr != nft_index_by_md.end() && delete_nft_itr->nft_metadata_id == op.lottery_id) + { + const nft_object &nft_obj = *delete_nft_itr; + ++delete_nft_itr; + db().remove(nft_obj); + } + } + return void_result(); } FC_CAPTURE_AND_RETHROW((op)) diff --git a/tests/tests/nft_lottery_tests.cpp b/tests/tests/nft_lottery_tests.cpp index 5b2fba84..77cfbc1f 100644 --- a/tests/tests/nft_lottery_tests.cpp +++ b/tests/tests/nft_lottery_tests.cpp @@ -628,4 +628,97 @@ BOOST_AUTO_TEST_CASE(lottery_winner_ticket_id_test) } } +BOOST_AUTO_TEST_CASE(create_lottery_nft_md_delete_tickets_on_draw_test) +{ + try + { + generate_blocks(HARDFORK_NFT_TIME); + generate_block(); + generate_block(); + set_expiration(db, trx); + // Lottery Options + nft_metadata_id_type test_nft_md_id = db.get_index().get_next_id(); + nft_lottery_options lottery_options; + lottery_options.benefactors.push_back(nft_lottery_benefactor(account_id_type(), 25 * GRAPHENE_1_PERCENT)); + lottery_options.end_date = db.head_block_time() + fc::minutes(5); + lottery_options.ticket_price = asset(100); + lottery_options.winning_tickets = {5 * GRAPHENE_1_PERCENT, 5 * GRAPHENE_1_PERCENT, 5 * GRAPHENE_1_PERCENT, 10 * GRAPHENE_1_PERCENT, 10 * GRAPHENE_1_PERCENT, 10 * GRAPHENE_1_PERCENT, 10 * GRAPHENE_1_PERCENT, 10 * GRAPHENE_1_PERCENT, 10 * GRAPHENE_1_PERCENT}; + //lottery_options.winning_tickets = { 75 * GRAPHENE_1_PERCENT }; + lottery_options.is_active = test_nft_md_id.instance.value % 2 ? false : true; + lottery_options.ending_on_soldout = true; + lottery_options.delete_tickets_after_draw = true; + + { + BOOST_TEST_MESSAGE("Send nft_metadata_create_operation"); + nft_metadata_create_operation op; + op.owner = account_id_type(); + op.symbol = "NFTLOTTERY" + std::to_string(test_nft_md_id.instance.value); + op.base_uri = "http://nft.example.com"; + op.is_transferable = true; + op.name = "NFTLOTTERY" + std::to_string(test_nft_md_id.instance.value); + op.max_supply = 200; + op.lottery_options = lottery_options; + + trx.operations.push_back(std::move(op)); + PUSH_TX(db, trx, ~0); + trx.operations.clear(); + } + generate_block(); + + BOOST_TEST_MESSAGE("Check nft_metadata_create_operation results"); + + auto test_nft_md_obj = test_nft_md_id(db); + BOOST_CHECK(test_nft_md_obj.owner == account_id_type()); + BOOST_CHECK(test_nft_md_obj.name == "NFTLOTTERY" + std::to_string(test_nft_md_id.instance.value)); + BOOST_CHECK(test_nft_md_obj.symbol == "NFTLOTTERY" + std::to_string(test_nft_md_id.instance.value)); + BOOST_CHECK(test_nft_md_obj.base_uri == "http://nft.example.com"); + BOOST_CHECK(test_nft_md_obj.max_supply == share_type(200)); + BOOST_CHECK(test_nft_md_obj.is_lottery()); + BOOST_CHECK(test_nft_md_obj.get_token_current_supply(db) == share_type(0)); + BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot(db) == asset()); + BOOST_CHECK(test_nft_md_obj.lottery_data->lottery_balance_id(db).sweeps_tickets_sold == share_type(0)); + + BOOST_CHECK(test_nft_md_obj.lottery_data->lottery_options.is_active); + account_id_type buyer(3); + transfer(account_id_type(), buyer, asset(10000000)); + { + nft_lottery_token_purchase_operation tpo; + tpo.fee = asset(); + tpo.buyer = buyer; + tpo.lottery_id = test_nft_md_obj.id; + tpo.tickets_to_buy = 199; + tpo.amount = asset(199 * 100); + trx.operations.push_back(tpo); + set_expiration(db, trx); + PUSH_TX(db, trx, ~0); + trx.operations.clear(); + } + generate_block(); + test_nft_md_obj = test_nft_md_id(db); + BOOST_CHECK(test_nft_md_obj.lottery_data->lottery_options.is_active); + BOOST_CHECK(test_nft_md_obj.get_token_current_supply(db) == 199); + { + nft_lottery_token_purchase_operation tpo; + tpo.fee = asset(); + tpo.buyer = buyer; + tpo.lottery_id = test_nft_md_obj.id; + tpo.tickets_to_buy = 1; + tpo.amount = asset(1 * 100); + trx.operations.push_back(tpo); + set_expiration(db, trx); + PUSH_TX(db, trx, ~0); + trx.operations.clear(); + } + generate_block(); + test_nft_md_obj = test_nft_md_id(db); + BOOST_CHECK(!test_nft_md_obj.lottery_data->lottery_options.is_active); + BOOST_CHECK(test_nft_md_obj.get_token_current_supply(db) == 0); + } + catch (fc::exception &e) + { + edump((e.to_detail_string())); + throw; + } +} + BOOST_AUTO_TEST_SUITE_END()