github.com/Bytom/bytom@v1.1.2-0.20210127130405-ae40204c0b09/common/bech32/bech32_test.go (about)

     1  package bech32
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  )
     7  
     8  func TestBech32(t *testing.T) {
     9  	tests := []struct {
    10  		str   string
    11  		valid bool
    12  	}{
    13  		{"A12UEL5L", true},
    14  		{"an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1tt5tgs", true},
    15  		{"abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw", true},
    16  		{"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j", true},
    17  		{"split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w", true},
    18  		{"split1checkupstagehandshakeupstreamerranterredcaperred2y9e2w", false},                                // invalid checksum
    19  		{"s lit1checkupstagehandshakeupstreamerranterredcaperredp8hs2p", false},                                // invalid character (space) in hrp
    20  		{"spl" + string(127) + "t1checkupstagehandshakeupstreamerranterredcaperred2y9e3w", false},              // invalid character (DEL) in hrp
    21  		{"split1cheo2y9e2w", false},                                                                            // invalid character (o) in data part
    22  		{"split1a2y9w", false},                                                                                 // too short data part
    23  		{"1checkupstagehandshakeupstreamerranterredcaperred2y9e3w", false},                                     // empty hrp
    24  		{"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j", false}, // too long
    25  	}
    26  
    27  	for _, test := range tests {
    28  		str := test.str
    29  		hrp, decoded, err := Bech32Decode(str)
    30  		if !test.valid {
    31  			// Invalid string decoding should result in error.
    32  			if err == nil {
    33  				t.Error("expected decoding to fail for "+
    34  					"invalid string %v", test.str)
    35  			}
    36  			continue
    37  		}
    38  
    39  		// Valid string decoding should result in no error.
    40  		if err != nil {
    41  			t.Errorf("expected string to be valid bech32: %v", err)
    42  		}
    43  
    44  		// Check that it encodes to the same string
    45  		encoded, err := Bech32Encode(hrp, decoded)
    46  		if err != nil {
    47  			t.Errorf("encoding failed: %v", err)
    48  		}
    49  
    50  		if encoded != strings.ToLower(str) {
    51  			t.Errorf("expected data to encode to %v, but got %v",
    52  				str, encoded)
    53  		}
    54  
    55  		// Flip a bit in the string an make sure it is caught.
    56  		pos := strings.LastIndexAny(str, "1")
    57  		flipped := str[:pos+1] + string((str[pos+1] ^ 1)) + str[pos+2:]
    58  		_, _, err = Bech32Decode(flipped)
    59  		if err == nil {
    60  			t.Error("expected decoding to fail")
    61  		}
    62  	}
    63  }