from unittest import TestCase
from binascii import hexlify

from lbry.wallet import words
from lbry.wallet.mnemonic import (
    get_languages, is_phrase_valid as is_valid,
    sync_generate_phrase as generate,
    sync_derive_key_from_phrase as derive
)


class TestMnemonic(TestCase):

    def test_get_languages(self):
        languages = get_languages()
        self.assertEqual(len(languages), 6)
        for lang in languages:
            self.assertEqual(len(getattr(words, lang)), 2048)

    def test_is_phrase_valid(self):
        self.assertFalse(is_valid('en', ''))
        self.assertFalse(is_valid('en', 'foo'))
        self.assertFalse(is_valid('en', 'awesomeball'))
        self.assertTrue(is_valid('en', 'awesome ball'))

        # check normalize works (these are not the same)
        self.assertTrue(is_valid('ja', 'るいじ りんご'))
        self.assertTrue(is_valid('ja', 'るいじ りんご'))

    def test_generate_phrase(self):
        self.assertGreaterEqual(len(generate('en').split()), 11)
        self.assertGreaterEqual(len(generate('ja').split()), 11)

    def test_phrase_to_key(self):
        self.assertEqual(
            hexlify(derive(
                "carbon smart garage balance margin twelve che"
                "st sword toast envelope bottom stomach absent"
            )),
            b'919455c9f65198c3b0f8a2a656f13bd0ecc436abfabcb6a2a1f063affbccb628'
            b'230200066117a30b1aa3aec2800ddbd3bf405f088dd7c98ba4f25f58d47e1baf'
        )