#!/usr/bin/env python3
# Copyright (c) 2014-2016 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.

#
# Test use of assetdir to locally label assets.
# Test listissuances returns a list of all issuances or specific issuances based on asset hex or asset label.
#

from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import assert_equal, assert_greater_than

class AssetdirTests(BitcoinTestFramework):
    """
    Test use of assetdir to specify asset labels.
    Test listissuances returns a list of all issuances or specific issuances based on asset hex or asset label.
    """

    def set_test_params(self):
        self.setup_clean_chain = True
        self.num_nodes = 1
        [["-initialfreecoins=2100000000000000", "-anyonecanspendaremine=1", "-con_connect_genesis_outputs=1", "-con_blocksubsidy=0"]]

    def add_options(self, parser):
        self.add_wallet_options(parser)

    def skip_test_if_missing_module(self):
        self.skip_if_no_wallet()

    def setup_network(self, split=False):
        self.setup_nodes()

    def run_test(self):
        self.generate(self.nodes[0], 101)
        self.nodes[0].syncwithvalidationinterfacequeue()

        #Issue two assets that we will later label using the assetdir parameter
        issuance1 = self.nodes[0].issueasset(100, 1, False)
        asset1hex = issuance1["asset"]

        issuance2 = self.nodes[0].issueasset(100, 1, False)
        asset2hex = issuance2["asset"]

        #Stop and restart the nodes, providing the assetdir parameter to locally label the assets
        self.stop_nodes()
        self.start_nodes([["-assetdir=" + asset1hex + ":asset1", "-assetdir=" + asset2hex + ":asset2"]])

        #Check that listissuances return all issuances
        issuances = self.nodes[0].listissuances()
        assert_equal(len(issuances), 2)

        #Check all asset labels have been set: 'asset1', 'asset2'
        #We can not be sure they will always be returned in the same order so will loop each one
        label = ""
        for issue in issuances:
            label += issue["assetlabel"]

        assert_greater_than(label.find("asset1"), -1)
        assert_greater_than(label.find("asset2"), -1)

        #Check we can get a list of isuances for a given label
        issuances = self.nodes[0].listissuances("asset1")
        assert_equal(len(issuances), 1)
        assert_equal(issuances[0]["assetlabel"], "asset1")

        #Check we can get a list of issuances for a given hex
        issuances = self.nodes[0].listissuances(asset2hex)
        assert_equal(len(issuances), 1)
        assert_equal(issuances[0]["assetlabel"], "asset2")

if __name__ == '__main__':
    AssetdirTests(__file__).main()
