30 #include "gtest/gtest.h" 39 #include <boost/algorithm/string.hpp> 55 #include <boost/algorithm/string.hpp> 64 void compare_vectors(
const std::vector<std::string> &expected,
const std::vector<std::string> &present)
66 std::vector<std::string>::const_iterator it1, it2;
67 for (it1 = expected.begin(), it2 = present.begin(); it1 != expected.end() && it2 != present.end();
84 for (
size_t ii = 0; ii <
sizeof(randkey); ++ii)
86 randkey.data[ii] =
rand();
91 const char *space = strrchr(seed.c_str(),
' ');
93 seed =
std::string(seed.c_str(), space-seed.c_str());
95 std::cout <<
"Test seed without checksum:\n";
96 std::cout << seed << std::endl;
101 std::vector<std::string> seed_vector, return_seed_vector;
107 std::cout <<
"Detected language: " << language_name << std::endl;
112 return_seed =
std::string(w_return_seed.data(), w_return_seed.size());
114 std::cout <<
"Returned seed:\n";
115 std::cout << return_seed << std::endl;
116 boost::split(seed_vector, seed, boost::is_any_of(
" "));
117 boost::split(return_seed_vector, return_seed, boost::is_any_of(
" "));
120 checksum_word = return_seed_vector.back();
121 return_seed_vector.pop_back();
122 ASSERT_EQ(seed_vector.size(), return_seed_vector.size());
124 compare_vectors(seed_vector, return_seed_vector);
127 seed += (
" " + checksum_word);
128 std::cout <<
"Test seed with checksum:\n";
129 std::cout << seed << std::endl;
132 std::cout <<
"Detected language: " << language_name << std::endl;
137 return_seed =
std::string(w_return_seed.data(), w_return_seed.size());
139 std::cout <<
"Returned seed:\n";
140 std::cout << return_seed << std::endl;
143 return_seed_vector.clear();
144 boost::split(seed_vector, seed, boost::is_any_of(
" "));
145 boost::split(return_seed_vector, return_seed, boost::is_any_of(
" "));
146 ASSERT_EQ(seed_vector.size(), return_seed_vector.size());
147 compare_vectors(seed_vector, return_seed_vector);
154 std::vector<std::string> language_list;
157 catch(
const std::exception &e)
159 std::cout <<
"Error initializing mnemonics: " << e.what() << std::endl;
167 std::vector<Language::Base*> languages({
182 for (std::vector<Language::Base*>::iterator it = languages.begin(); it != languages.end(); it++)
185 test_language(*(*it));
187 catch (
const std::exception &e) {
188 std::cout <<
"Error testing " << (*it)->get_language_name() <<
" language: " << e.what() << std::endl;
194 TEST(mnemonics, language_detection_with_bad_checksum)
201 const std::string base_seed =
"cinzento luxuriante leonardo gnostico digressao cupula fifa broxar iniquo louvor ovario dorsal ideologo besuntar decurso rosto susto lemure unheiro pagodeiro nitroglicerina eclusa mazurca bigorna";
227 TEST(mnemonics, case_tolerance)
233 const std::string seed_1 =
"Neubau umarmen Abart umarmen Turban feilen Brett Bargeld Episode Milchkuh Substanz Jahr Armband Maibaum Tand Grünalge Tabak erziehen Federboa Lobrede Tenor Leuchter Curry Diskurs Tenor";
241 std::string seed_2 =
"neubau umarmen Abart umarmen Turban feilen Brett Bargeld Episode Milchkuh Substanz Jahr Armband Maibaum Tand Grünalge Tabak erziehen Federboa Lobrede Tenor Leuchter Curry Diskurs tenor";
242 boost::algorithm::to_lower(seed_2);
250 TEST(mnemonics, partial_word_tolerance)
256 const std::string seed_1 =
"crim bam scamp gna limi woma wron tuit birth mundane donuts square cohesive dolphin titans narrate fue saved wrap aloof magic mirr toget upda wra";
Portuguese word list and map.
A singleton helper class based on template.
French word list and map.
const std::string & get_language_name() const
Returns the name of the language.
size_t size() const noexcept
std::vector< const Language::Base * > get_language_list()
New Dutch word list and map.
bool words_to_bytes(const epee::wipeable_string &words, epee::wipeable_string &dst, size_t len, bool duplicate, std::string &language_name)
Converts seed words to bytes (secret key).
A base language class which all languages have to inherit from for Polymorphism.
Language Base class for Polymorphism.
#define ASSERT_EQ(val1, val2)
Russian word list and map.
New Esperanto word list and map.
void rand(size_t N, uint8_t *bytes)
bool bytes_to_words(const char *src, size_t len, epee::wipeable_string &words, const std::string &language_name)
Converts bytes (secret key) to seed words.
Italian word list and map.
German word list and map.
Japanese word list and map.
Older version of English word list and map.
Spanish word list and map.
TEST(mnemonics, consistency)
#define ASSERT_STREQ(s1, s2)
#define ASSERT_TRUE(condition)
New English word list and map.
New Lojban word list and map.
Mnemonic seed generation and wallet restoration from them.
const char * data() const noexcept
Simplified Chinese word list and map.
T utf8prefix(const T &s, size_t count)
Returns a string made of (at most) the first count characters in s. Assumes well formedness. No check is made for this.