--- /dev/null
+package bech32
+
+import (
+ "strings"
+ "testing"
+)
+
+func TestBech32(t *testing.T) {
+ tests := []struct {
+ str string
+ valid bool
+ }{
+ {"A12UEL5L", true},
+ {"an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1tt5tgs", true},
+ {"abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw", true},
+ {"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j", true},
+ {"split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w", true},
+ {"split1checkupstagehandshakeupstreamerranterredcaperred2y9e2w", false}, // invalid checksum
+ {"s lit1checkupstagehandshakeupstreamerranterredcaperredp8hs2p", false}, // invalid character (space) in hrp
+ {"spl" + string(127) + "t1checkupstagehandshakeupstreamerranterredcaperred2y9e3w", false}, // invalid character (DEL) in hrp
+ {"split1cheo2y9e2w", false}, // invalid character (o) in data part
+ {"split1a2y9w", false}, // too short data part
+ {"1checkupstagehandshakeupstreamerranterredcaperred2y9e3w", false}, // empty hrp
+ {"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j", false}, // too long
+ }
+
+ for _, test := range tests {
+ str := test.str
+ hrp, decoded, err := Bech32Decode(str)
+ if !test.valid {
+ // Invalid string decoding should result in error.
+ if err == nil {
+ t.Error("expected decoding to fail for "+
+ "invalid string %v", test.str)
+ }
+ continue
+ }
+
+ // Valid string decoding should result in no error.
+ if err != nil {
+ t.Errorf("expected string to be valid bech32: %v", err)
+ }
+
+ // Check that it encodes to the same string
+ encoded, err := Bech32Encode(hrp, decoded)
+ if err != nil {
+ t.Errorf("encoding failed: %v", err)
+ }
+
+ if encoded != strings.ToLower(str) {
+ t.Errorf("expected data to encode to %v, but got %v",
+ str, encoded)
+ }
+
+ // Flip a bit in the string an make sure it is caught.
+ pos := strings.LastIndexAny(str, "1")
+ flipped := str[:pos+1] + string((str[pos+1] ^ 1)) + str[pos+2:]
+ _, _, err = Bech32Decode(flipped)
+ if err == nil {
+ t.Error("expected decoding to fail")
+ }
+ }
+}