2021-10-13 16:44:13 +02:00
/*
* This file is part of the Flowee project
2025-04-07 13:40:31 +02:00
* Copyright (C) 2021-2025 Tom Zander <tom@flowee.org>
2021-10-13 16:44:13 +02:00
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
# include "test_apputils.h"
# include <Logger.h>
# include <apputils/Mnemonic.h>
# include <utils/HDMasterKey.h>
# include <cashaddr.h>
void TestAppUtils : : mnemonics ( )
{
QFETCH ( QString , mnemonic ) ; // n-words of seed phrase.
QFETCH ( int , validity ) ; // MnemonicException:Error
QFETCH ( int , errorPos ) ;
2023-10-19 16:29:13 +03:00
QFETCH ( bool , maybeElectrum ) ;
2021-10-13 16:44:13 +02:00
Mnemonic m ;
m . registerWordList ( " english " ,
QString ( " %1/english.txt " ) . arg ( SRCDIR ) ) ;
int pos = - 2 ;
2023-10-19 16:29:13 +03:00
bool me { } ;
auto rc = m . validateMnemonic ( mnemonic , pos , & me ) ;
2021-10-13 16:44:13 +02:00
QCOMPARE ( rc , validity ) ;
QCOMPARE ( pos , errorPos ) ;
2023-10-19 16:29:13 +03:00
QCOMPARE ( me , maybeElectrum ) ;
2021-10-13 16:44:13 +02:00
}
void TestAppUtils : : mnemonics_data ( )
{
QTest : : addColumn < QString > ( " mnemonic " ) ; // n-words of seed phrase.
QTest : : addColumn < int > ( " validity " ) ; // Mnemonic::Validity
QTest : : addColumn < int > ( " errorPos " ) ;
2023-10-19 16:29:13 +03:00
QTest : : addColumn < bool > ( " maybeElectrum " ) ;
2021-10-13 16:44:13 +02:00
QTest : : newRow ( " small-zero " )
< < " abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about "
2023-10-19 16:29:13 +03:00
< < ( int ) Mnemonic : : Valid < < - 1 < < false ;
2021-10-13 16:44:13 +02:00
QTest : : newRow ( " small-mid " )
< < " legal winner thank year wave sausage worth useful legal winner thank yellow "
2023-10-19 16:29:13 +03:00
< < ( int ) Mnemonic : : Valid < < - 1 < < false ;
2021-10-13 16:44:13 +02:00
QTest : : newRow ( " small-max " )
< < " zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong "
2023-10-19 16:29:13 +03:00
< < ( int ) Mnemonic : : Valid < < - 1 < < false ;
2021-10-13 16:44:13 +02:00
QTest : : newRow ( " mid-zero " )
< < " abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent "
2023-10-19 16:29:13 +03:00
< < ( int ) Mnemonic : : Valid < < - 1 < < false ;
2021-10-13 16:44:13 +02:00
QTest : : newRow ( " mid-mid " )
< < " legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will "
2023-10-19 16:29:13 +03:00
< < ( int ) Mnemonic : : Valid < < - 1 < < false ;
2021-10-13 16:44:13 +02:00
QTest : : newRow ( " mid-other " )
< < " letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always "
2023-10-19 16:29:13 +03:00
< < ( int ) Mnemonic : : Valid < < - 1 < < false ;
2021-10-13 16:44:13 +02:00
QTest : : newRow ( " mid-max " )
< < " zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when "
2023-10-19 16:29:13 +03:00
< < ( int ) Mnemonic : : Valid < < - 1 < < false ;
2021-10-13 16:44:13 +02:00
QTest : : newRow ( " long-min " )
< < " abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art "
2023-10-19 16:29:13 +03:00
< < ( int ) Mnemonic : : Valid < < - 1 < < false ;
2021-10-13 16:44:13 +02:00
QTest : : newRow ( " hamster " )
< < " hamster diagram private dutch cause delay private meat slide toddler razor book happy fancy gospel tennis maple dilemma loan word shrug inflict delay length "
2023-10-19 16:29:13 +03:00
< < ( int ) Mnemonic : : Valid < < - 1 < < false ;
2021-10-13 16:44:13 +02:00
QTest : : newRow ( " JP-zero " )
< < " あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん "
" あいこくしん あいこくしん あいこくしん あいこくしん あおぞら "
2023-10-19 16:29:13 +03:00
< < ( int ) Mnemonic : : UnknownLanguage < < 0 < < false ;
QTest : : newRow ( " oneWord " ) < < " hamster " < < ( int ) Mnemonic : : IncorrectWordCount < < - 2 < < false ;
QTest : : newRow ( " tooLittle " ) < < " a a a a a a a a " < < ( int ) Mnemonic : : IncorrectWordCount < < - 2 < < false ;
QTest : : newRow ( " tooMany " ) < < " a a a a a a a a a a a a a a a a a a a a a a a a a " < < ( int ) Mnemonic : : IncorrectWordCount < < - 2 < < false ;
2021-10-13 16:44:13 +02:00
QTest : : newRow ( " 3rd " )
< < " zoo zoo foo zoo zoo zoo zoo zoo zoo zoo zoo wrong "
2023-10-19 16:29:13 +03:00
< < ( int ) Mnemonic : : UnknownWord < < 8 < < false ;
2025-10-28 14:52:54 +01:00
QTest : : newRow ( " small-max2 " )
2021-10-13 16:44:13 +02:00
< < " zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo abandon "
2023-10-19 16:29:13 +03:00
< < ( int ) Mnemonic : : ChecksumFailure < < - 1 < < false ;
QTest : : newRow ( " pure-electrum-seed " )
< < " message say arm fancy real fly rapid now air quick issue hurt "
< < ( int ) Mnemonic : : ChecksumFailure < < - 1 < < true ;
QTest : : newRow ( " pure-electrum-seed-very-long " )
< < " own ask setup cereal recycle aisle eight such salad party must consider kite fame catch hour defense exist wire bundle join film exclude mixed "
< < ( int ) Mnemonic : : ChecksumFailure < < - 1 < < true ;
QTest : : newRow ( " ambiguous-electrum-seed-also-valid-bip39 " )
< < " defy own furnace dentist turn climb file crash cover brain smooth coffee "
< < ( int ) Mnemonic : : Valid < < - 1 < < true ;
QTest : : newRow ( " ambiguous-electrum-seed-also-valid-bip39-very-long " )
< < " badge orange menu install example saddle item grant hen hybrid puzzle garlic topic rigid bomb mean burden inform lizard silver grow hotel net decorate "
< < ( int ) Mnemonic : : Valid < < - 1 < < true ;
2021-10-13 16:44:13 +02:00
// test-vectors
// https://github.com/bip32JP/bip32JP.github.io/raw/master/test_JP_BIP39.json
// https://github.com/trezor/python-mnemonic/raw/master/vectors.json
}
2021-10-25 13:36:53 +02:00
void TestAppUtils : : seedToMnemonic ( )
{
QFETCH ( QString , seed ) ; // hex encoded binary seed
QFETCH ( QString , mnemonic ) ; // n-words of seed phrase.
QByteArray seedBytes = QByteArray : : fromHex ( seed . toLatin1 ( ) ) ;
std : : vector < uint8_t > seedVector ( seedBytes . constData ( ) , seedBytes . constData ( ) + seedBytes . size ( ) ) ;
Mnemonic m ;
m . registerWordList ( " english " ,
QString ( " %1/english.txt " ) . arg ( SRCDIR ) ) ;
QString result = m . generateMnemonic ( seedVector , " english " ) ;
QCOMPARE ( result , mnemonic ) ;
}
void TestAppUtils : : seedToMnemonic_data ( )
{
QTest : : addColumn < QString > ( " seed " ) ;
QTest : : addColumn < QString > ( " mnemonic " ) ; // n-words of seed phrase.
QTest : : newRow ( " small-zero " )
< < " 00000000000000000000000000000000 "
< < " abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about " ;
QTest : : newRow ( " small-mid " )
< < " 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f "
< < " legal winner thank year wave sausage worth useful legal winner thank yellow " ;
QTest : : newRow ( " small-mid2 " )
< < " 80808080808080808080808080808080 "
< < " letter advice cage absurd amount doctor acoustic avoid letter advice cage above " ;
QTest : : newRow ( " small-top " )
< < " ffffffffffffffffffffffffffffffff "
< < " zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong " ;
QTest : : newRow ( " mid-zero " )
< < " 000000000000000000000000000000000000000000000000 "
< < " abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent " ;
QTest : : newRow ( " mid-mid " )
< < " 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f "
< < " legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will " ;
QTest : : newRow ( " mid-mid2 " )
< < " 808080808080808080808080808080808080808080808080 "
< < " letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always " ;
QTest : : newRow ( " mid-top " )
< < " ffffffffffffffffffffffffffffffffffffffffffffffff "
< < " zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when " ;
QTest : : newRow ( " long-zero " )
< < " 0000000000000000000000000000000000000000000000000000000000000000 "
< < " abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon "
" abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art " ;
}
2025-04-07 13:40:31 +02:00
void TestAppUtils : : findWord ( )
{
Mnemonic m ;
m . registerWordList ( " english " ,
QString ( " %1/english.txt " ) . arg ( SRCDIR ) ) ;
QCOMPARE ( 1019 , m . findWord ( " legal " ) ) ;
auto list = m . completeWords ( " lo " ) ;
QCOMPARE ( list . size ( ) , 14 ) ;
}
2021-10-13 16:44:13 +02:00
QTEST_MAIN ( TestAppUtils )