from common import *

from apps.common.paths import HARDENED

if not utils.BITCOIN_ONLY:
    from apps.tezos.sign_tx import _get_address_from_contract
    from apps.tezos.helpers import validate_full_path
    from trezor.messages import TezosContractType
    from trezor.messages.TezosContractID import TezosContractID


@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestTezosAddress(unittest.TestCase):
    def test_get_address_from_contract(self):
        contracts = [
            TezosContractID(
                tag=TezosContractType.Implicit,
                hash=unhexlify("0090ec585b4d5fa39b20213e46b232cc57a4cfab4b"),
            ),
            TezosContractID(
                tag=TezosContractType.Implicit,
                hash=unhexlify("017dfb3fef44082eca8cd3eccebd77db44633ffc9e"),
            ),
            TezosContractID(
                tag=TezosContractType.Implicit,
                hash=unhexlify("02c1fc1b7e503825068ff4fe2f8916f98af981eab1"),
            ),
            TezosContractID(
                tag=TezosContractType.Originated,
                hash=unhexlify("65671dedc69669f066f45d586a2ecdeddacc95af00"),
            ),
        ]

        outputs = [
            "tz1YrK8Hqt6GAPYRHAaeJmhETYyPSQCHTrkj",
            "tz2KoN7TFjhp96V2XikqYSGyDmVVUHXvkzko",
            "tz3e1k3QzCwEbRZrfHCwT3Npvw1rezmMQArY",
            "KT1HpwLq2AjZgEQspiSnYmdtaHy4NgXw6BDC",
        ]

        for i, contract in enumerate(contracts):
            self.assertEqual(_get_address_from_contract(contract), outputs[i])

    def test_paths(self):
        # 44'/1729'/a' is correct
        incorrect_paths = [
            [44 | HARDENED],
            [44 | HARDENED, 1729 | HARDENED],
            [44 | HARDENED, 1729 | HARDENED, 0],
            [44 | HARDENED, 1729 | HARDENED, 0 | HARDENED, 0],
            [44 | HARDENED, 1729 | HARDENED, 0 | HARDENED, 0 | HARDENED, 0 | HARDENED],
            [44 | HARDENED, 1729 | HARDENED, 0 | HARDENED, 1, 0],
            [44 | HARDENED, 1729 | HARDENED, 0 | HARDENED, 0, 0],
            [44 | HARDENED, 1729 | HARDENED, 1 | HARDENED, 1 | HARDENED],
            [44 | HARDENED, 1729 | HARDENED, 9999000 | HARDENED],
            [44 | HARDENED, 60 | HARDENED, 0 | HARDENED, 0, 0],
            [1 | HARDENED, 1 | HARDENED, 1 | HARDENED],
        ]
        correct_paths = [
            [44 | HARDENED, 1729 | HARDENED, 0 | HARDENED],
            [44 | HARDENED, 1729 | HARDENED, 3 | HARDENED],
            [44 | HARDENED, 1729 | HARDENED, 9 | HARDENED],
            [44 | HARDENED, 1729 | HARDENED, 0 | HARDENED, 0 | HARDENED],
            [44 | HARDENED, 1729 | HARDENED, 0 | HARDENED, 3 | HARDENED],
            [44 | HARDENED, 1729 | HARDENED, 0 | HARDENED, 9 | HARDENED],
        ]

        for path in incorrect_paths:
            self.assertFalse(validate_full_path(path))

        for path in correct_paths:
            self.assertTrue(validate_full_path(path))


if __name__ == "__main__":
    unittest.main()