From 59e744c97ac25a6b01904e467ccafe8627f53d59 Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Wed, 29 Jun 2016 00:13:52 +0100 Subject: [PATCH] Initial Commit --- .travis.yml | 6 ++ LICENSE.md | 20 ++++ README.md | 41 ++++++++ base58.go | 57 +++++++++++ base58_test.go | 257 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 381 insertions(+) create mode 100644 .travis.yml create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 base58.go create mode 100644 base58_test.go diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..73d38b1 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +language: go + +go: + - 1.5 + - 1.6 + - tip diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..4f7defc --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,20 @@ +Copyright (c) 2016 Jim Myhrberg. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..76dd42f --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# go-base58 + +A Base58 encoding and decoding package for [Go](https://golang.org/). + +## What? + +Base58 allows you to represent a numeric value with fewer characters, useful +for short URLs among other things. Flickr is one the biggest sites that makes +use of it for short photo URLs. + +For example `6857269519` becomes `brXijP` when Base58 encoded, and hence the +Flickr short URL is: `http://flic.kr/p/brXijP` + +## Installation + + go get https://github.com/jimeh/go-base58 + +## Usage + +```go +import "github.com/jimeh/go-base58" + +uid := base58.Encode(6857269519) +fmt.Println(uid) // Prints: brXijP + +num, err := base58.Decode('brXijP'); +fmt.Println(num) // Prints: 6857269519 +``` + +## Credit + +This package is more or less a port of the [Base58][gem] Ruby Gem by the same +name. Which as far as I can tell, is based on [this article][article] by Flickr +staff. + +[gem]: https://github.com/dougal/base58 +[article]: https://www.flickr.com/groups/51035612836@N01/discuss/72157616713786392/ + +## License + +Released under the MIT license. Copyright (c) 2016 Jim Myhrberg. diff --git a/base58.go b/base58.go new file mode 100644 index 0000000..860f59c --- /dev/null +++ b/base58.go @@ -0,0 +1,57 @@ +package base58 + +import ( + "errors" + "strings" +) + +// Alphabet is the default alphabet. +const Alphabet = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ" + +// Encode converts a base10 integer to a base58 string using the default +// alphabet. +func Encode(num int) string { + return EncodeWithAlphabet(num, Alphabet) +} + +// Decode converts a base58 string to a base10 integer using the default +// alphabet. +func Decode(str string) (int, error) { + return DecodeWithAlphabet(str, Alphabet) +} + +// EncodeWithAlphabet converts a base10 integer to a base58 string with the +// given alphabet. +func EncodeWithAlphabet(num int, alphabet string) string { + base := len(alphabet) + + str := "" + for num >= base { + mod := num % base + str = string(alphabet[mod]) + str + num = (num - mod) / base + } + + return string(alphabet[num]) + str +} + +// DecodeWithAlphabet converts a base58 string to a base10 integer with the +// given alphabet. +func DecodeWithAlphabet(str string, alphabet string) (int, error) { + base := len(alphabet) + num := 0 + multi := 1 + + for i := len(str); i > 0; i-- { + char := string(str[i-1]) + index := strings.Index(alphabet, char) + if index == -1 { + errorMsg := "\"" + str + "\" is not a valid base58 string." + return -1, errors.New(errorMsg) + } + num += multi * index + multi = multi * base + } + + return num, nil +} diff --git a/base58_test.go b/base58_test.go new file mode 100644 index 0000000..2116f23 --- /dev/null +++ b/base58_test.go @@ -0,0 +1,257 @@ +package base58 + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" +) + +var examples = map[string]int{ + "6hKMCS": 3471391110, "6hDrmR": 3470152229, "6hHHZB": 3470988633, + "6hHKum": 3470993664, "6hLgFW": 3471485480, "6hBRKR": 3469844075, + "6hGRTd": 3470820062, "6hCuie": 3469966999, "6hJuXN": 3471139908, + "6hJsyS": 3471131850, "6hFWFb": 3470641072, "6hENdZ": 3470417529, + "6hEJqg": 3470404727, "6hGNaq": 3470807546, "6hDRoZ": 3470233089, + "6hKkP9": 3471304242, "6hHVZ3": 3471028968, "6hNcfE": 3471860782, + "6hJBqs": 3471161638, "6hCPyc": 3470031783, "6hJNrC": 3471198710, + "6hKmkd": 3471305986, "6hFUYs": 3470635346, "6hK6UC": 3471257464, + "6hBmiv": 3469744991, "6hKex1": 3471283122, "6hFHQj": 3470597870, + "6hCA2n": 3469986263, "6hBTgt": 3469849157, "6hHEss": 3470976734, + "6hLows": 3471508478, "6hD95z": 3470094097, "6hKjcq": 3471298806, + "6hGEbd": 3470780680, "6hKSNS": 3471408510, "6hG8hv": 3470676761, + "6hEmj6": 3470330361, "6hGjpn": 3470714163, "6hEsUr": 3470352537, + "6hJEhy": 3471171272, "6hKBHn": 3471357731, "6hG3gi": 3470659871, + "6hFJTT": 3470601441, "6hLZDs": 3471626624, "6hGdL7": 3470695182, + "6hBpi4": 3469755057, "6hEuFV": 3470358539, "6hGVw1": 3470832288, + "6hLdm1": 3471474232, "6hFcCK": 3470496279, "6hDZmR": 3470259877, + "6hG8iX": 3470676845, "6hFZZL": 3470652242, "6hJ79u": 3471063156, + "6hMsrS": 3471716780, "6hGH3G": 3470790336, "6hKqD3": 3471320476, + "6hKxEY": 3471344136, "6hHVF1": 3471027922, "6hKDSQ": 3471365008, + "6hKwHs": 3471340916, "6hH4s6": 3470858973, "6hGmKB": 3470722065, + "6hEzdi": 3470373757, "6hJQwJ": 3471205734, "6hHd6a": 3470888035, + "6hH1j3": 3470848414, "6hNP1u": 3471981064, "6hFWge": 3470639683, + "6hFpmP": 3470535723, "6hCgQZ": 3469925109, "6hFJSm": 3470601352, + "6hEd9v": 3470302893, "6hDwuF": 3470169503, "6hCVSX": 3470053055, + "6hCUgr": 3470047631, "6hEsqR": 3470350937, "6hBmKg": 3469746485, + "6hDvUx": 3470167523, "6hJUi7": 3471218400, "6hF39e": 3470464349, + "6hH43K": 3470857619, "6hGSC5": 3470822548, "6hFz1s": 3470568182, + "6hFaKZ": 3470489971, "6hD65K": 3470084015, "6hBAVk": 3469794165, + "6hLkWA": 3471499786, "6hHi7q": 3470904928, "6hHdDF": 3470889921, + "6hHcCo": 3470886482, "6hGQQf": 3470816526, "6hLAfo": 3471547914, + "6hBDEV": 3469803421, "6hL4BE": 3471444864, "6hL2TT": 3471439077, + "6hKcxb": 3471276404, "6hD1vg": 3470068617, "6hLtTT": 3471526541, + "6hHXtw": 3471033984, "6hHCQj": 3470971274, "6hFrXx": 3470544465, + "6hMVkJ": 3471807252, "6hDv6V": 3470164819, "6hD1gR": 3470067839, + "6hShWW": 3472660386, "6hK4tb": 3471249260, "6hLzrQ": 3471545214, + "6hBTAe": 3469850245, "6hLABq": 3471549134, "6hGbN7": 3470688570, + "6hFtro": 3470549444, "6hRRAQ": 3472575120, "6hFViL": 3470636466, + "6hFkLP": 3470523659, "6hNAKc": 3471939809, "6hLLNE": 3471583426, + "6hJstp": 3471131533, "6hHxv3": 3470953336, "6hLToQ": 3471605592, + "6hJ74F": 3471062877, "6hGjCA": 3470714930, "6hCQoD": 3470034593, + "6hCqxX": 3469954397, "6hCbg8": 3469906325, "6hJwGw": 3471145750, + "6hP2Tt": 3472024389, "6hHDuy": 3470973492, "6hGRpq": 3470818450, + "6hDx8F": 3470171649, "6hLhxU": 3471488378, "6hFrkd": 3470542358, + "6hPc3D": 3472055197, "6hJV29": 3471220838, "6hCc3c": 3469908939, + "6hLycA": 3471541024, "6hLd75": 3471473424, "6hKJ1m": 3471378900, + "6hHgEG": 3470900072, "6hFNfm": 3470612720, "6hFsaF": 3470545169, + "6hERqV": 3470428313, "6hEnYK": 3470335967, "6hDGeT": 3470202285, + "6hFDZo": 3470584940, "6hMvPE": 3471728136, "6hKTro": 3471410628, + "6hKfXG": 3471287918, "6hKeuU": 3471283000, "6hHFYj": 3470981830, + "6hHDzj": 3470973768, "6hCozt": 3469947757, "6hKB8D": 3471355775, + "6hCtrc": 3469964097, "6hDXcx": 3470252609, "6hCxSR": 3469979041, + "6hC1Vk": 3469874901, "6hKmaS": 3471305444, "6hK9fn": 3471265337, + "6hFDH6": 3470583995, "6hEB7c": 3470380131, "6hC1E2": 3469874013, + "6hBZnx": 3469869693, "6hBXNz": 3469864417, "6hQKjm": 3472358868, + "6hHn4j": 3470918204, "6hHiQ2": 3470907341, "6hHhHb": 3470903580, + "6hGnBc": 3470724941, "6hG6Ht": 3470671481, "6hDvh6": 3470165409, + "6hCGtp": 3470007957, "6hCnzi": 3469944383, "6hMxEY": 3471734360, + "6hG9sL": 3470680720, "6hCarn": 3469903555, "6hLsdE": 3471520902, + "6hKnDa": 3471310391, "6hKn2L": 3471308338, "6hGpfH": 3470730481, + "6hRkJS": 3472474666, "6hFEV3": 3470588052, "6hE7VV": 3470285343, + "6hSSAq": 3472773572, "6hNTtQ": 3471996106, "6hMAuK": 3471743859, + "6hJ95H": 3471069665, "6hHZ39": 3471039240, "6hByNi": 3469787029, + "6hLLnb": 3471581948, "6hHYoQ": 3471037076, "6hHCLm": 3470971044, + "6hFHkC": 3470596206, "6hDKq4": 3470212967, "6hRapC": 3472439910, + "6hKJBs": 3471380936, "6hHids": 3470905278, "6hEJ8R": 3470403775, + "6hMY3L": 3471816360, "6hFRAC": 3470623988, "6hEP9c": 3470420615, + "6hEqVR": 3470345891, "6hHGBX": 3470984013, "6hEzFB": 3470375341, + "6hDnRp": 3470140429, "6hDdQH": 3470110113, "6hCK7B": 3470016843, + "6hCxvH": 3469977815, "6hC4v4": 3469883585, "6hC15g": 3469872055, + "6hGHRA": 3470793056, "6hGCGL": 3470775724, "6hGbuW": 3470687574, + "6hT7FY": 3472820990, "6hMFHs": 3471761416, "6hJybH": 3471150749, + "6hGEFs": 3470782376, "6hCBnX": 3469990821, "6hNJZt": 3471967549, + "6hMxUV": 3471735169, "6hLoGG": 3471509072, "6hJdy5": 3471084708, + "6hGnwp": 3470724663, "6hGkhZ": 3470717157, "6hG7yd": 3470674308, + "6hDAqF": 3470182727, "6hPQVJ": 3472182628, "6hHyqy": 3470956440, + "6hFG6k": 3470592013, "6hTavC": 3472830482, "6hJjzU": 3471104998, + "6hFE7r": 3470585349, "6hNQU7": 3471987422, "6hJYSj": 3471233782, + "6hFVRB": 3470638313, "6hEeQt": 3470308575, "6hBmnK": 3469745237, + "6hP9VU": 3472048078, "6hJeDp": 3471088381, "6hHV4d": 3471025846, + "6hFXmS": 3470643374, "6hBgEn": 3469729381, "6hNDjB": 3471948475, + "6hKEkd": 3471366538, "6hJDq6": 3471168345, "6hHbCG": 3470883136, + "6hCgN2": 3469924937, "6hQa3S": 3472243594, "6hLphv": 3471511033, + "6hHoqd": 3470922780, "6hGT2W": 3470823932, "6hEd6V": 3470302743, + "6hNac3": 3471853844, "6hHzYe": 3470961641, "6hRDAC": 3472534740, + "6hJ2bu": 3471046452, "6hGRPN": 3470819864, "6hFS6P": 3470625681, + "6hG8Yn": 3470679073, "6hFSGB": 3470627699, "6hFQhL": 3470619588, + "6hF4VT": 3470470361, "6hE7vD": 3470283935, "6hBeKa": 3469722931, + "6hPLs1": 3472167564, "6hHcKm": 3470886886, "6hG9KW": 3470681716, + "6hE8E4": 3470287787, "6hNp1U": 3471900352, "6hJ29T": 3471046359, + "6hHPLb": 3471008038, "6hGWGq": 3470836256, "6hEipV": 3470320607, + "6hMB8U": 3471746014, "6hKWyr": 3471421129, "6hKLxb": 3471387416, + "6hJstE": 3471131548, "6hHk3k": 3470911419, "6hPSdE": 3472186974, + "6hPfEY": 3472067396, "6hGVSS": 3470833498, "6hFVX4": 3470638629, + "6hFQRa": 3470621467, "6hCsKK": 3469961809, "6hJbdY": 3471076872, + "6hE2ok": 3470266691, "6hCrc8": 3469956553, "6hRgwS": 3472460514, + "6hPhLY": 3472074472, "6hLTK1": 3471606762, "6hHh5u": 3470901452, + "6hDiBB": 3470126173, "6hD678": 3470084095, "6hKMXC": 3471392198, + "6hBohi": 3469751649, "6hJXRV": 3471230395, "6hFzad": 3470568690, + "6hCCbH": 3469993533, "6hLpoA": 3471511386, "6hKZQN": 3471432170, + "6hG3Ax": 3470660987, "6hT7kf": 3472819788, "6hKrzq": 3471323630, + "6hHMHM": 3471001171, "6hHL9q": 3470995872, "6hBUkR": 3469852775, + "6hRRLf": 3472575666, "6hJFUg": 3471176707, "6hBML2": 3469830629, + "6hS9eE": 3472631080, "6hPD3o": 3472142646, "6hKWhL": 3471420220, + "6hJMpr": 3471195219, "6hHzVA": 3470961488, "6hGvu9": 3470751444, + "6hGkTu": 3470719158, "6hF7bv": 3470477937, "6hDzQp": 3470180739, + "6hQ2Mo": 3472219148, "6hM7Tn": 3471650979, "6hJWDp": 3471226305, + "6hJpX5": 3471123046, "6hNLTn": 3471973923, "6hGuRu": 3470749318, + "6hG1CM": 3470654389, "6hEMDx": 3470415589, "6hCYpx": 3470061557, + "6hCSTr": 3470042991, "6hBnJr": 3469749801, "6hRZSh": 3472602928, + "6hRtVW": 3472502220, "6hDzc2": 3470178571, "6hCMan": 3470023731, + "6hRfUj": 3472458394, "6hLdME": 3471475720, "6hE69P": 3470279363, + "6hDgaa": 3470117911, "6hDeKg": 3470113161, "6hKSis": 3471406804, + "6hKwYj": 3471341778, "6hJ4Ro": 3471055436, "6hHTug": 3471020571, + "6hHSH2": 3471017947, "6hHCE6": 3470970681, "6hG5R5": 3470668558, + "6hFaBX": 3470489505, "6hL13o": 3471432842, "6hJtQr": 3471136117, + "6hHpg3": 3470925612, "6hGinv": 3470710691, "6hFQXR": 3470621855, + "6hCKN6": 3470019133, "6hJme9": 3471110522, "6hGUY8": 3470830439, + "6hEDPM": 3470389271, "6hBg1c": 3469727167, "6hNyoj": 3471931870, + "6hNdQu": 3471866108, "6hMNAK": 3471784575, "6hHkvV": 3470913019, + "6hDHLi": 3470207413, "6hCwUk": 3469975763, "6hCd2a": 3469912243, + "6hPeRd": 3472064626, "6hP4SL": 3472031076, "6hJQFC": 3471206250, + "6hJLVJ": 3471193612, "6hJAJT": 3471159343, "6hJ8Mi": 3471068655, + "6hJ6o5": 3471060580, "6hH667": 3470864484, "6hH5RU": 3470863718, + "6hC2jx": 3469876247, "6hPm75": 3472085672, "6hN8ud": 3471848112, + "6hLD4g": 3471557361, "6hGAr2": 3470768083, "6hFVQH": 3470638261, + "6hDxtV": 3470172823, "6hPNwj": 3472174542, "6hKTB7": 3471411192, + "6hJdfQ": 3471083708, "6hRvdq": 3472506540, "6hNpN9": 3471902976, + "6hMd75": 3471668536, "6hLkks": 3471497748, "6hHkYn": 3470914553, + "6hGZgY": 3470844930, "6hGorv": 3470727743, "6hG941": 3470679342, + "6hC6xK": 3469890469, "6hTA5N": 3472913142, "6hNzGE": 3471936298, + "6hN3F1": 3471831918, "6hLdgN": 3471473988, "6hFyvS": 3470566524, + "6hCxUM": 3469979153, "6hCmje": 3469940145, "6hC87z": 3469895737, + "6hC4mV": 3469883113, "6hQXaJ": 3472398736, "6hP6Tw": 3472037848, + "6hLx7r": 3471537361, "6hFvYh": 3470557964, "6hEPWM": 3470423317, + "6hDKDT": 3470213769, "6hBrcn": 3469761455, "6hBkh4": 3469741543, + "6hMdbq": 3471668788, "6hK3cE": 3471244996, "6hJSUj": 3471213714, + "6hJvFs": 3471142324, "6hHVMu": 3471028298, "6hHUZG": 3471025642, + "6hHeVT": 3470894225, "6hFqjr": 3470538949, "6hETNt": 3470436291, + "6hEPkX": 3470421297, "6hCVrB": 3470051585, "6hCE2V": 3469999751, + "6hNe3j": 3471866794, "6hKjmA": 3471299338, "6hHbMp": 3470883641, + "6hGWJ7": 3470836354, "6hGn3F": 3470723055, "6hFoKL": 3470533690, + "6hETWx": 3470436759, "6hPaH5": 3472050698, "6hNFFf": 3471956400, + "6hNnyp": 3471895451, "6hM7ra": 3471649459, "6hHof7": 3470922194, + "6hH8KM": 3470873455, "6hGbCG": 3470688024, "6hDXaB": 3470252497, + "6hDSF2": 3470237383, "6hDfq8": 3470115415, "6hCqqR": 3469953985, + "6hPpj7": 3472096462, "6hMSHG": 3471798434, "6hKyF6": 3471347507, + "6hK33v": 3471244465, "6hJwva": 3471145091, "6hGX9e": 3470837753, + "6hFWeR": 3470639603, "6hD8oF": 3470091783, "6hCopg": 3469947165, + "6hC9L8": 3469901279, "6hBhS4": 3469733423, "6hMQXy": 3471792510, + "6hLoRU": 3471509606, "6hKCib": 3471359692, "6hKder": 3471278739, + "6hHYPy": 3471038510, "6hD4hz": 3470077973, "6hPgTS": 3472071508, + "6hNXii": 3472008951, "6hKYzE": 3471427928, "6hKSr2": 3471407243, + "6hG4fB": 3470663195, "6hFyz2": 3470566707, "6hFoMT": 3470533813, + "6hC5V4": 3469888341, "6hBZmZ": 3469869661, "6hPXKU": 3472205606, + "6hHVwm": 3471027420, "6hCzFH": 3469985123, "6hCvsM": 3469970917, + "6hChKr": 3469928151, "6hBv6F": 3469774581, "6hPf62": 3472065427, + "6hNS4s": 3471991328, "6hNPXe": 3471984239, "6hLguh": 3471484804, + "6hJ5zB": 3471057885, "6hHr6j": 3470931776, "6hLBUx": 3471553491, + "6hLi1P": 3471489939, "6hKQ35": 3471399184, "6hKK67": 3471382540, + "6hHUcT": 3471022985, "6hGPjm": 3470811428, "6hF5ti": 3470472183, + "6hDZPz": 3470261427, "6hC17D": 3469872193, "6hR7R3": 3472431292, + "6hN7hS": 3471844090, "6hHqoC": 3470929416, "6hFDdx": 3470582339, + "6hFzdL": 3470568896, "6hDuEH": 3470163357, "6hCaZk": 3469905409, + "6hT2Hw": 3472804260, "6hPhJY": 3472074356, "6hKNBy": 3471394398, + "6hJPEq": 3471202816, "6hGMH7": 3470806020, "6hGp5L": 3470729904, +} + +var myAlphabet = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ123456789" +var myExamples = map[string]int{ + "frMj9u": 3469905409, "fr3bSF": 3472804260, "frYrT8": 3472074356, + "frUXLH": 3471394398, "frTYPz": 3471202816, "frRWSg": 3470806020, + "frRyeV": 3470729904, "frQp15": 3470507135, "frP2SC": 3470432637, +} + +type Base58Suite struct { + suite.Suite +} + +func (s *Base58Suite) TestAlphabet() { + expected := "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ" + assert.Equal(s.T(), expected, Alphabet) +} + +func (s *Base58Suite) TestEncode() { + assert := assert.New(s.T()) + + for str, num := range examples { + assert.Equal(str, Encode(num)) + } +} + +func (s *Base58Suite) TestDecode() { + assert := assert.New(s.T()) + + errMsg := "\"invalid@base58.string\" is not a valid base58 string." + result, err := Decode("invalid@base58.string") + assert.Equal(-1, result) + assert.Equal(errors.New(errMsg), err) + + for str, num := range examples { + result, _ := Decode(str) + assert.Equal(num, result) + } +} + +func (s *Base58Suite) TestDecodeError() { + assert := assert.New(s.T()) + errMsg := "\"invalid@base58.string\" is not a valid base58 string." + + result, err := Decode("invalid@base58.string") + + assert.Equal(-1, result) + assert.Equal(errors.New(errMsg), err) +} + +func (s *Base58Suite) TestEncodeWithAlphabet() { + assert := assert.New(s.T()) + + for str, num := range myExamples { + assert.Equal(str, EncodeWithAlphabet(num, myAlphabet)) + } +} + +func (s *Base58Suite) TestDecodeWithAlphabet() { + assert := assert.New(s.T()) + + for str, num := range myExamples { + result, _ := DecodeWithAlphabet(str, myAlphabet) + assert.Equal(num, result) + } +} + +func (s *Base58Suite) TestDecodeWithAlphabetError() { + assert := assert.New(s.T()) + errMsg := "\"AaBbCc\" is not a valid base58 string." + + result, err := DecodeWithAlphabet("AaBbCc", "abcdefghjklmnpqrstuvwxyz") + + assert.Equal(-1, result) + assert.Equal(errors.New(errMsg), err) +} + +func TestBase58Suite(t *testing.T) { + suite.Run(t, new(Base58Suite)) +}