~/bend-docscommunity

LAWS.bend source

LAWS.bend on the hub · documented module

# Executable laws for the strict, lowercase Hex codec.# Decode accepts exactly pairs of 0-9a-fA-F and returns canonical octets.import Baseimport ./lib.bend as Hx# Empty and ordinary encoding.law encode_empty:  { Hx.Hex.encode(Nil{}) == "" : String }law encode_zero:  { Hx.Hex.encode(0 <> Nil{}) == "00" : String }law encode_one:  { Hx.Hex.encode(1 <> Nil{}) == "01" : String }law encode_ten:  { Hx.Hex.encode(10 <> Nil{}) == "0a" : String }law encode_fifteen:  { Hx.Hex.encode(15 <> Nil{}) == "0f" : String }law encode_sixteen:  { Hx.Hex.encode(16 <> Nil{}) == "10" : String }law encode_sevenf:  { Hx.Hex.encode(127 <> Nil{}) == "7f" : String }law encode_ff:  { Hx.Hex.encode(255 <> Nil{}) == "ff" : String }# Encoding follows the companion Bytes.hex low-octet convention.law encode_masks_u32:  { Hx.Hex.encode(256 <> Nil{}) == "00" : String }law encode_multiple:  { Hx.Hex.encode(0 <> 10 <> 255 <> Nil{}) == "000aff" : String }# Empty and lowercase/uppercase input decoding.law decode_empty:  { Hx.Hex.decode("") == Some{Nil{}} : Maybe<&2, List<&2, U32>> }law decode_zero:  { Hx.Hex.decode("00") == Some{0 <> Nil{}} : Maybe<&2, List<&2, U32>> }law decode_lowercase:  { Hx.Hex.decode("0aff") == Some{10 <> 255 <> Nil{}} : Maybe<&2, List<&2, U32>> }law decode_uppercase:  { Hx.Hex.decode("0AFF") == Some{10 <> 255 <> Nil{}} : Maybe<&2, List<&2, U32>> }law decode_mixed_case:  { Hx.Hex.decode("aB0c") == Some{171 <> 12 <> Nil{}} : Maybe<&2, List<&2, U32>> }law decode_multiple:  { Hx.Hex.decode("000aff7f") == Some{0 <> 10 <> 255 <> 127 <> Nil{}} : Maybe<&2, List<&2, U32>> }# Canonical lowercase encodings round-trip.law roundtrip_empty:  { Hx.Hex.decode(Hx.Hex.encode(Nil{})) == Some{Nil{}} : Maybe<&2, List<&2, U32>> }law roundtrip_one:  { Hx.Hex.decode(Hx.Hex.encode(1 <> Nil{})) == Some{1 <> Nil{}} : Maybe<&2, List<&2, U32>> }law roundtrip_multiple:  {    Hx.Hex.decode(Hx.Hex.encode(0 <> 10 <> 127 <> 128 <> 255 <> Nil{}))      == Some{0 <> 10 <> 127 <> 128 <> 255 <> Nil{}}    : Maybe<&2, List<&2, U32>>  }# Strict rejection: odd length, invalid alphabet, and non-hex punctuation.law reject_odd_length:  { Hx.Hex.decode("a") == None{} : Maybe<&2, List<&2, U32>> }law reject_three_chars:  { Hx.Hex.decode("abc") == None{} : Maybe<&2, List<&2, U32>> }law reject_invalid_g:  { Hx.Hex.decode("0g") == None{} : Maybe<&2, List<&2, U32>> }law reject_invalid_prefix:  { Hx.Hex.decode("0x") == None{} : Maybe<&2, List<&2, U32>> }law reject_whitespace:  { Hx.Hex.decode(" 0") == None{} : Maybe<&2, List<&2, U32>> }law reject_prefix:  { Hx.Hex.decode("0x0a") == None{} : Maybe<&2, List<&2, U32>> }law reject_bad_tail:  { Hx.Hex.decode("00zz") == None{} : Maybe<&2, List<&2, U32>> }