github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/lib/others/bip39/bip39_test.go (about) 1 package bip39 2 3 import ( 4 "crypto/rand" 5 "encoding/hex" 6 "testing" 7 ) 8 9 type vector struct { 10 entropy string 11 mnemonic string 12 seed string 13 } 14 15 func TestGetWordList(t *testing.T) { 16 assertEqualStringSlices(t, wordlistsEnglish, GetWordList()) 17 } 18 19 func TestGetWordIndex(t *testing.T) { 20 for expectedIdx, word := range wordList { 21 actualIdx, ok := GetWordIndex(word) 22 assertTrue(t, ok) 23 assertEqual(t, actualIdx, expectedIdx) 24 } 25 26 for _, word := range []string{"a", "set", "of", "invalid", "words"} { 27 actualIdx, ok := GetWordIndex(word) 28 assertFalse(t, ok) 29 assertEqual(t, actualIdx, 0) 30 } 31 } 32 33 func TestNewMnemonic(t *testing.T) { 34 for _, vector := range testVectors() { 35 entropy, err := hex.DecodeString(vector.entropy) 36 assertNil(t, err) 37 38 mnemonic, err := NewMnemonic(entropy) 39 assertNil(t, err) 40 assertEqualString(t, vector.mnemonic, mnemonic) 41 42 _, err = NewSeedWithErrorChecking(mnemonic, "TREZOR") 43 assertNil(t, err) 44 45 seed := NewSeed(mnemonic, "TREZOR") 46 assertEqualString(t, vector.seed, hex.EncodeToString(seed)) 47 } 48 } 49 50 func TestNewMnemonicInvalidEntropy(t *testing.T) { 51 _, err := NewMnemonic([]byte{}) 52 assertNotNil(t, err) 53 } 54 55 func TestNewSeedWithErrorCheckingInvalidMnemonics(t *testing.T) { 56 for _, vector := range badMnemonicSentences() { 57 _, err := NewSeedWithErrorChecking(vector.mnemonic, "TREZOR") 58 assertNotNil(t, err) 59 } 60 } 61 62 func TestIsMnemonicValid(t *testing.T) { 63 for _, vector := range badMnemonicSentences() { 64 assertFalse(t, IsMnemonicValid(vector.mnemonic) == nil) 65 } 66 67 for _, vector := range testVectors() { 68 assertTrue(t, IsMnemonicValid(vector.mnemonic) == nil) 69 } 70 } 71 72 func TestMnemonicToByteArrayInvalidMnemonic(t *testing.T) { 73 for _, vector := range badMnemonicSentences() { 74 _, err := MnemonicToByteArray(vector.mnemonic) 75 assertNotNil(t, err) 76 } 77 78 _, err := MnemonicToByteArray("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon yellow") 79 assertNotNil(t, err) 80 assertEqual(t, err, ErrChecksumIncorrect) 81 } 82 83 func TestNewEntropy(t *testing.T) { 84 // Good tests. 85 for i := 128; i <= 256; i += 32 { 86 _, err := NewEntropy(i) 87 assertNil(t, err) 88 } 89 // Bad Values 90 for i := 0; i <= 256; i++ { 91 if i%8 != 0 { 92 _, err := NewEntropy(i) 93 assertNotNil(t, err) 94 } 95 } 96 } 97 98 func TestMnemonicToByteArrayForDifferentArrayLangths(t *testing.T) { 99 max := 1000 100 for i := 0; i < max; i++ { 101 //16, 20, 24, 28, 32 102 length := 16 + (i%5)*4 103 seed := make([]byte, length) 104 if n, err := rand.Read(seed); err != nil { 105 t.Errorf("%v", err) 106 } else if n != length { 107 t.Errorf("Wrong number of bytes read: %d", n) 108 } 109 110 mnemonic, err := NewMnemonic(seed) 111 if err != nil { 112 t.Errorf("%v", err) 113 } 114 115 _, err = MnemonicToByteArray(mnemonic) 116 if err != nil { 117 t.Errorf("Failed for %x - %v", seed, mnemonic) 118 } 119 } 120 } 121 func TestPadByteSlice(t *testing.T) { 122 assertEqualByteSlices(t, []byte{0}, padByteSlice([]byte{}, 1)) 123 assertEqualByteSlices(t, []byte{0, 1}, padByteSlice([]byte{1}, 2)) 124 assertEqualByteSlices(t, []byte{1, 1}, padByteSlice([]byte{1, 1}, 2)) 125 assertEqualByteSlices(t, []byte{1, 1, 1}, padByteSlice([]byte{1, 1, 1}, 2)) 126 } 127 128 func TestCompareByteSlices(t *testing.T) { 129 assertTrue(t, compareByteSlices([]byte{}, []byte{})) 130 assertTrue(t, compareByteSlices([]byte{1}, []byte{1})) 131 assertFalse(t, compareByteSlices([]byte{1}, []byte{0})) 132 assertFalse(t, compareByteSlices([]byte{1}, []byte{})) 133 assertFalse(t, compareByteSlices([]byte{1}, nil)) 134 } 135 136 func TestMnemonicToByteArrayForZeroLeadingSeeds(t *testing.T) { 137 ms := []string{ 138 "00000000000000000000000000000000", 139 "00a84c51041d49acca66e6160c1fa999", 140 "00ca45df1673c76537a2020bfed1dafd", 141 "0019d5871c7b81fd83d474ef1c1e1dae", 142 "00dcb021afb35ffcdd1d032d2056fc86", 143 "0062be7bd09a27288b6cf0eb565ec739", 144 "00dc705b5efa0adf25b9734226ba60d4", 145 "0017747418d54c6003fa64fade83374b", 146 "000d44d3ee7c3dfa45e608c65384431b", 147 "008241c1ef976b0323061affe5bf24b9", 148 "00a6aec77e4d16bea80b50a34991aaba", 149 "0011527b8c6ddecb9d0c20beccdeb58d", 150 "001c938c503c8f5a2bba2248ff621546", 151 "0002f90aaf7a8327698f0031b6317c36", 152 "00bff43071ed7e07f77b14f615993bac", 153 "00da143e00ef17fc63b6fb22dcc2c326", 154 "00ffc6764fb32a354cab1a3ddefb015d", 155 "0062ef47e0985e8953f24760b7598cdd", 156 "003bf9765064f71d304908d906c065f5", 157 "00993851503471439d154b3613947474", 158 "007ad0ffe9eae753a483a76af06dfa67", 159 "00091824db9ec19e663bee51d64c83cc", 160 "00f48ac621f7e3cb39b2012ac3121543", 161 "0072917415cdca24dfa66c4a92c885b4", 162 "0027ced2b279ea8a91d29364487cdbf4", 163 "00b9c0d37fb10ba272e55842ad812583", 164 "004b3d0d2b9285946c687a5350479c8c", 165 "00c7c12a37d3a7f8c1532b17c89b724c", 166 "00f400c5545f06ae17ad00f3041e4e26", 167 "001e290be10df4d209f247ac5878662b", 168 "00bf0f74568e582a7dd1ee64f792ec8b", 169 "00d2e43ecde6b72b847db1539ed89e23", 170 "00cecba6678505bb7bfec8ed307251f6", 171 "000aeed1a9edcbb4bc88f610d3ce84eb", 172 "00d06206aadfc25c2b21805d283f15ae", 173 "00a31789a2ab2d54f8fadd5331010287", 174 "003493c5f520e8d5c0483e895a121dc9", 175 "004706112800b76001ece2e268bc830e", 176 "00ab31e28bb5305be56e38337dbfa486", 177 "006872fe85df6b0fa945248e6f9379d1", 178 "00717e5e375da6934e3cfdf57edaf3bd", 179 "007f1b46e7b9c4c76e77c434b9bccd6b", 180 "00dc93735aa35def3b9a2ff676560205", 181 "002cd5dcd881a49c7b87714c6a570a76", 182 "0013b5af9e13fac87e0c505686cfb6bf", 183 "007ab1ec9526b0bc04b64ae65fd42631", 184 "00abb4e11d8385c1cca905a6a65e9144", 185 "00574fc62a0501ad8afada2e246708c3", 186 "005207e0a815bb2da6b4c35ec1f2bf52", 187 "00f3460f136fb9700080099cbd62bc18", 188 "007a591f204c03ca7b93981237112526", 189 "00cfe0befd428f8e5f83a5bfc801472e", 190 "00987551ac7a879bf0c09b8bc474d9af", 191 "00cadd3ce3d78e49fbc933a85682df3f", 192 "00bfbf2e346c855ccc360d03281455a1", 193 "004cdf55d429d028f715544ce22d4f31", 194 "0075c84a7d15e0ac85e1e41025eed23b", 195 "00807dddd61f71725d336cab844d2cb5", 196 "00422f21b77fe20e367467ed98c18410", 197 "00b44d0ac622907119c626c850a462fd", 198 "00363f5e7f22fc49f3cd662a28956563", 199 "000fe5837e68397bbf58db9f221bdc4e", 200 "0056af33835c888ef0c22599686445d3", 201 "00790a8647fd3dfb38b7e2b6f578f2c6", 202 "00da8d9009675cb7beec930e263014fb", 203 "00d4b384540a5bb54aa760edaa4fb2fe", 204 "00be9b1479ed680fdd5d91a41eb926d0", 205 "009182347502af97077c40a6e74b4b5c", 206 "00f5c90ee1c67fa77fd821f8e9fab4f1", 207 "005568f9a2dd6b0c0cc2f5ba3d9cac38", 208 "008b481f8678577d9cf6aa3f6cd6056b", 209 "00c4323ece5e4fe3b6cd4c5c932931af", 210 "009791f7550c3798c5a214cb2d0ea773", 211 "008a7baab22481f0ad8167dd9f90d55c", 212 "00f0e601519aafdc8ff94975e64c946d", 213 "0083b61e0daa9219df59d697c270cd31", 214 } 215 216 for _, m := range ms { 217 seed, _ := hex.DecodeString(m) 218 219 mnemonic, err := NewMnemonic(seed) 220 if err != nil { 221 t.Errorf("%v", err) 222 } 223 224 _, err = MnemonicToByteArray(mnemonic) 225 if err != nil { 226 t.Errorf("Failed for %x - %v", seed, mnemonic) 227 } 228 } 229 } 230 func TestEntropyFromMnemonic128(t *testing.T) { 231 testEntropyFromMnemonic(t, 128) 232 } 233 234 func TestEntropyFromMnemonic160(t *testing.T) { 235 testEntropyFromMnemonic(t, 160) 236 } 237 238 func TestEntropyFromMnemonic192(t *testing.T) { 239 testEntropyFromMnemonic(t, 192) 240 } 241 242 func TestEntropyFromMnemonic224(t *testing.T) { 243 testEntropyFromMnemonic(t, 224) 244 } 245 246 func TestEntropyFromMnemonic256(t *testing.T) { 247 testEntropyFromMnemonic(t, 256) 248 } 249 250 func TestEntropyFromMnemonicInvalidChecksum(t *testing.T) { 251 _, err := EntropyFromMnemonic("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon yellow") 252 assertEqual(t, ErrChecksumIncorrect, err) 253 } 254 255 func TestEntropyFromMnemonicInvalidMnemonicSize(t *testing.T) { 256 for _, mnemonic := range []string{ 257 "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", // Too many words 258 "a", // Too few 259 "a a a a a a a a a a a a a a", // Not multiple of 3 260 } { 261 _, err := EntropyFromMnemonic(mnemonic) 262 assertEqual(t, ErrInvalidMnemonic, err) 263 } 264 } 265 266 func testEntropyFromMnemonic(t *testing.T, bitSize int) { 267 for i := 0; i < 512; i++ { 268 expectedEntropy, err := NewEntropy(bitSize) 269 assertNil(t, err) 270 assertTrue(t, len(expectedEntropy) != 0) 271 272 mnemonic, err := NewMnemonic(expectedEntropy) 273 assertNil(t, err) 274 assertTrue(t, len(mnemonic) != 0) 275 276 actualEntropy, err := EntropyFromMnemonic(mnemonic) 277 assertNil(t, err) 278 assertEqualByteSlices(t, expectedEntropy, actualEntropy) 279 } 280 } 281 282 func testVectors() []vector { 283 return []vector{ 284 { 285 entropy: "00000000000000000000000000000000", 286 mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", 287 seed: "c55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04", 288 }, 289 { 290 entropy: "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", 291 mnemonic: "legal winner thank year wave sausage worth useful legal winner thank yellow", 292 seed: "2e8905819b8723fe2c1d161860e5ee1830318dbf49a83bd451cfb8440c28bd6fa457fe1296106559a3c80937a1c1069be3a3a5bd381ee6260e8d9739fce1f607", 293 }, 294 { 295 entropy: "80808080808080808080808080808080", 296 mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage above", 297 seed: "d71de856f81a8acc65e6fc851a38d4d7ec216fd0796d0a6827a3ad6ed5511a30fa280f12eb2e47ed2ac03b5c462a0358d18d69fe4f985ec81778c1b370b652a8", 298 }, 299 { 300 entropy: "ffffffffffffffffffffffffffffffff", 301 mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong", 302 seed: "ac27495480225222079d7be181583751e86f571027b0497b5b5d11218e0a8a13332572917f0f8e5a589620c6f15b11c61dee327651a14c34e18231052e48c069", 303 }, 304 { 305 entropy: "000000000000000000000000000000000000000000000000", 306 mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent", 307 seed: "035895f2f481b1b0f01fcf8c289c794660b289981a78f8106447707fdd9666ca06da5a9a565181599b79f53b844d8a71dd9f439c52a3d7b3e8a79c906ac845fa", 308 }, 309 { 310 entropy: "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", 311 mnemonic: "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will", 312 seed: "f2b94508732bcbacbcc020faefecfc89feafa6649a5491b8c952cede496c214a0c7b3c392d168748f2d4a612bada0753b52a1c7ac53c1e93abd5c6320b9e95dd", 313 }, 314 { 315 entropy: "808080808080808080808080808080808080808080808080", 316 mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always", 317 seed: "107d7c02a5aa6f38c58083ff74f04c607c2d2c0ecc55501dadd72d025b751bc27fe913ffb796f841c49b1d33b610cf0e91d3aa239027f5e99fe4ce9e5088cd65", 318 }, 319 { 320 entropy: "ffffffffffffffffffffffffffffffffffffffffffffffff", 321 mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when", 322 seed: "0cd6e5d827bb62eb8fc1e262254223817fd068a74b5b449cc2f667c3f1f985a76379b43348d952e2265b4cd129090758b3e3c2c49103b5051aac2eaeb890a528", 323 }, 324 { 325 entropy: "0000000000000000000000000000000000000000000000000000000000000000", 326 mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art", 327 seed: "bda85446c68413707090a52022edd26a1c9462295029f2e60cd7c4f2bbd3097170af7a4d73245cafa9c3cca8d561a7c3de6f5d4a10be8ed2a5e608d68f92fcc8", 328 }, 329 { 330 entropy: "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", 331 mnemonic: "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title", 332 seed: "bc09fca1804f7e69da93c2f2028eb238c227f2e9dda30cd63699232578480a4021b146ad717fbb7e451ce9eb835f43620bf5c514db0f8add49f5d121449d3e87", 333 }, 334 { 335 entropy: "8080808080808080808080808080808080808080808080808080808080808080", 336 mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless", 337 seed: "c0c519bd0e91a2ed54357d9d1ebef6f5af218a153624cf4f2da911a0ed8f7a09e2ef61af0aca007096df430022f7a2b6fb91661a9589097069720d015e4e982f", 338 }, 339 { 340 entropy: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 341 mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote", 342 seed: "dd48c104698c30cfe2b6142103248622fb7bb0ff692eebb00089b32d22484e1613912f0a5b694407be899ffd31ed3992c456cdf60f5d4564b8ba3f05a69890ad", 343 }, 344 { 345 entropy: "77c2b00716cec7213839159e404db50d", 346 mnemonic: "jelly better achieve collect unaware mountain thought cargo oxygen act hood bridge", 347 seed: "b5b6d0127db1a9d2226af0c3346031d77af31e918dba64287a1b44b8ebf63cdd52676f672a290aae502472cf2d602c051f3e6f18055e84e4c43897fc4e51a6ff", 348 }, 349 { 350 entropy: "b63a9c59a6e641f288ebc103017f1da9f8290b3da6bdef7b", 351 mnemonic: "renew stay biology evidence goat welcome casual join adapt armor shuffle fault little machine walk stumble urge swap", 352 seed: "9248d83e06f4cd98debf5b6f010542760df925ce46cf38a1bdb4e4de7d21f5c39366941c69e1bdbf2966e0f6e6dbece898a0e2f0a4c2b3e640953dfe8b7bbdc5", 353 }, 354 { 355 entropy: "3e141609b97933b66a060dcddc71fad1d91677db872031e85f4c015c5e7e8982", 356 mnemonic: "dignity pass list indicate nasty swamp pool script soccer toe leaf photo multiply desk host tomato cradle drill spread actor shine dismiss champion exotic", 357 seed: "ff7f3184df8696d8bef94b6c03114dbee0ef89ff938712301d27ed8336ca89ef9635da20af07d4175f2bf5f3de130f39c9d9e8dd0472489c19b1a020a940da67", 358 }, 359 { 360 entropy: "0460ef47585604c5660618db2e6a7e7f", 361 mnemonic: "afford alter spike radar gate glance object seek swamp infant panel yellow", 362 seed: "65f93a9f36b6c85cbe634ffc1f99f2b82cbb10b31edc7f087b4f6cb9e976e9faf76ff41f8f27c99afdf38f7a303ba1136ee48a4c1e7fcd3dba7aa876113a36e4", 363 }, 364 { 365 entropy: "72f60ebac5dd8add8d2a25a797102c3ce21bc029c200076f", 366 mnemonic: "indicate race push merry suffer human cruise dwarf pole review arch keep canvas theme poem divorce alter left", 367 seed: "3bbf9daa0dfad8229786ace5ddb4e00fa98a044ae4c4975ffd5e094dba9e0bb289349dbe2091761f30f382d4e35c4a670ee8ab50758d2c55881be69e327117ba", 368 }, 369 { 370 entropy: "2c85efc7f24ee4573d2b81a6ec66cee209b2dcbd09d8eddc51e0215b0b68e416", 371 mnemonic: "clutch control vehicle tonight unusual clog visa ice plunge glimpse recipe series open hour vintage deposit universe tip job dress radar refuse motion taste", 372 seed: "fe908f96f46668b2d5b37d82f558c77ed0d69dd0e7e043a5b0511c48c2f1064694a956f86360c93dd04052a8899497ce9e985ebe0c8c52b955e6ae86d4ff4449", 373 }, 374 { 375 entropy: "eaebabb2383351fd31d703840b32e9e2", 376 mnemonic: "turtle front uncle idea crush write shrug there lottery flower risk shell", 377 seed: "bdfb76a0759f301b0b899a1e3985227e53b3f51e67e3f2a65363caedf3e32fde42a66c404f18d7b05818c95ef3ca1e5146646856c461c073169467511680876c", 378 }, 379 { 380 entropy: "7ac45cfe7722ee6c7ba84fbc2d5bd61b45cb2fe5eb65aa78", 381 mnemonic: "kiss carry display unusual confirm curtain upgrade antique rotate hello void custom frequent obey nut hole price segment", 382 seed: "ed56ff6c833c07982eb7119a8f48fd363c4a9b1601cd2de736b01045c5eb8ab4f57b079403485d1c4924f0790dc10a971763337cb9f9c62226f64fff26397c79", 383 }, 384 { 385 entropy: "4fa1a8bc3e6d80ee1316050e862c1812031493212b7ec3f3bb1b08f168cabeef", 386 mnemonic: "exile ask congress lamp submit jacket era scheme attend cousin alcohol catch course end lucky hurt sentence oven short ball bird grab wing top", 387 seed: "095ee6f817b4c2cb30a5a797360a81a40ab0f9a4e25ecd672a3f58a0b5ba0687c096a6b14d2c0deb3bdefce4f61d01ae07417d502429352e27695163f7447a8c", 388 }, 389 { 390 entropy: "18ab19a9f54a9274f03e5209a2ac8a91", 391 mnemonic: "board flee heavy tunnel powder denial science ski answer betray cargo cat", 392 seed: "6eff1bb21562918509c73cb990260db07c0ce34ff0e3cc4a8cb3276129fbcb300bddfe005831350efd633909f476c45c88253276d9fd0df6ef48609e8bb7dca8", 393 }, 394 { 395 entropy: "18a2e1d81b8ecfb2a333adcb0c17a5b9eb76cc5d05db91a4", 396 mnemonic: "board blade invite damage undo sun mimic interest slam gaze truly inherit resist great inject rocket museum chief", 397 seed: "f84521c777a13b61564234bf8f8b62b3afce27fc4062b51bb5e62bdfecb23864ee6ecf07c1d5a97c0834307c5c852d8ceb88e7c97923c0a3b496bedd4e5f88a9", 398 }, 399 { 400 entropy: "15da872c95a13dd738fbf50e427583ad61f18fd99f628c417a61cf8343c90419", 401 mnemonic: "beyond stage sleep clip because twist token leaf atom beauty genius food business side grid unable middle armed observe pair crouch tonight away coconut", 402 seed: "b15509eaa2d09d3efd3e006ef42151b30367dc6e3aa5e44caba3fe4d3e352e65101fbdb86a96776b91946ff06f8eac594dc6ee1d3e82a42dfe1b40fef6bcc3fd", 403 }, 404 } 405 } 406 407 func badMnemonicSentences() []vector { 408 return []vector{ 409 {mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon"}, 410 {mnemonic: "legal winner thank year wave sausage worth useful legal winner thank yellow yellow"}, 411 {mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice caged above"}, 412 {mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo, wrong"}, 413 {mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon"}, 414 {mnemonic: "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will will will"}, 415 {mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always."}, 416 {mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo why"}, 417 {mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art art"}, 418 {mnemonic: "legal winner thank year wave sausage worth useful legal winner thanks year wave worth useful legal winner thank year wave sausage worth title"}, 419 {mnemonic: "letter advice cage absurd amount doctor acoustic avoid letters advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless"}, 420 {mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo voted"}, 421 {mnemonic: "jello better achieve collect unaware mountain thought cargo oxygen act hood bridge"}, 422 {mnemonic: "renew, stay, biology, evidence, goat, welcome, casual, join, adapt, armor, shuffle, fault, little, machine, walk, stumble, urge, swap"}, 423 {mnemonic: "dignity pass list indicate nasty"}, 424 425 // From issue 32 426 {mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon letter"}, 427 } 428 } 429 430 func assertNil(t *testing.T, object interface{}) { 431 if object != nil { 432 t.Errorf("Expected nil, got %v", object) 433 } 434 } 435 436 func assertNotNil(t *testing.T, object interface{}) { 437 if object == nil { 438 t.Error("Expected not nil") 439 } 440 } 441 442 func assertTrue(t *testing.T, a bool) { 443 if !a { 444 t.Error("Expected true, got false") 445 } 446 } 447 448 func assertFalse(t *testing.T, a bool) { 449 if a { 450 t.Error("Expected false, got true") 451 } 452 } 453 454 func assertEqual(t *testing.T, a, b interface{}) { 455 if a != b { 456 t.Errorf("Objects not equal, expected `%s` and got `%s`", a, b) 457 } 458 } 459 460 func assertEqualString(t *testing.T, a, b string) { 461 if a != b { 462 t.Errorf("Strings not equal, expected `%s` and got `%s`", a, b) 463 } 464 } 465 466 func assertEqualStringSlices(t *testing.T, a, b []string) { 467 if len(a) != len(b) { 468 t.Errorf("String slices not equal, expected %v and got %v", a, b) 469 return 470 } 471 for i := range a { 472 if a[i] != b[i] { 473 t.Errorf("String slices not equal, expected %v and got %v", a, b) 474 return 475 } 476 } 477 } 478 479 func assertEqualByteSlices(t *testing.T, a, b []byte) { 480 if len(a) != len(b) { 481 t.Errorf("Byte slices not equal, expected %v and got %v", a, b) 482 return 483 } 484 for i := range a { 485 if a[i] != b[i] { 486 t.Errorf("Byte slices not equal, expected %v and got %v", a, b) 487 return 488 } 489 } 490 }