Add comprehensive edge case tests for unmarshaling functions
New tests cover edge cases and error scenarios for `UnmarshalQuoted`, `UnmarshalHexArray`, `UnmarshalStringArray`, `Less` method in `tags`, and `Marshal`/`Unmarshal` methods in `atag`. These tests improve overall test coverage and ensure error handling is robust.
This commit is contained in:
@@ -44,3 +44,46 @@ func TestT_Marshal_Unmarshal(t *testing.T) {
|
|||||||
t.Fatalf("failed to re-marshal back original")
|
t.Fatalf("failed to re-marshal back original")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestT_Marshal_NilKind(t *testing.T) {
|
||||||
|
// Test Marshal with nil Kind - should return empty slice
|
||||||
|
tag := &T{
|
||||||
|
Kind: nil,
|
||||||
|
PubKey: []byte("test"),
|
||||||
|
DTag: []byte("dtag"),
|
||||||
|
}
|
||||||
|
result := tag.Marshal(nil)
|
||||||
|
if len(result) != 0 {
|
||||||
|
t.Fatalf("expected empty result for nil Kind, got %v", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestT_Unmarshal_Errors(t *testing.T) {
|
||||||
|
// Test invalid format - wrong number of parts
|
||||||
|
tag := &T{}
|
||||||
|
_, err := tag.Unmarshal([]byte("invalid:format"))
|
||||||
|
if err == nil {
|
||||||
|
t.Fatal("expected error for invalid format with 2 parts")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test invalid format - too many parts
|
||||||
|
tag2 := &T{}
|
||||||
|
_, err2 := tag2.Unmarshal([]byte("a:b:c:d"))
|
||||||
|
if err2 == nil {
|
||||||
|
t.Fatal("expected error for invalid format with 4 parts")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test invalid kind number
|
||||||
|
tag3 := &T{}
|
||||||
|
_, err3 := tag3.Unmarshal([]byte("invalid:pubkey:dtag"))
|
||||||
|
if err3 == nil {
|
||||||
|
t.Fatal("expected error for invalid kind")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test invalid hex in pubkey
|
||||||
|
tag4 := &T{}
|
||||||
|
_, err4 := tag4.Unmarshal([]byte("1:invalidhex:dtag"))
|
||||||
|
if err4 == nil {
|
||||||
|
t.Fatal("expected error for invalid hex in pubkey")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -872,4 +872,29 @@ func TestRemainingEdgeCases(t *testing.T) {
|
|||||||
if mixedTags2.Less(0, 1) {
|
if mixedTags2.Less(0, 1) {
|
||||||
t.Error("Less should return false when first tag is not empty and second is empty")
|
t.Error("Less should return false when first tag is not empty and second is empty")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test where both tags are empty (should return false - they are equal)
|
||||||
|
// Create tags with Len() < 1 (truly empty tags)
|
||||||
|
emptyTag1 := tag.NewWithCap(0)
|
||||||
|
emptyTag2 := tag.NewWithCap(0)
|
||||||
|
bothEmptyTags := New(emptyTag1, emptyTag2)
|
||||||
|
if bothEmptyTags.Less(0, 1) {
|
||||||
|
t.Error("Less should return false when both tags have length < 1")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test where one tag has length < 1 and other has length >= 1
|
||||||
|
emptyTag3 := tag.NewWithCap(0)
|
||||||
|
nonEmptyTag2 := tag.New("a", "value")
|
||||||
|
mixedTags3 := New(emptyTag3, nonEmptyTag2)
|
||||||
|
if !mixedTags3.Less(0, 1) {
|
||||||
|
t.Error("Less should return true when first tag has length < 1 and second has length >= 1")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test where first tag has length >= 1 and second has length < 1
|
||||||
|
emptyTag4 := tag.NewWithCap(0)
|
||||||
|
nonEmptyTag3 := tag.New("a", "value")
|
||||||
|
mixedTags4 := New(nonEmptyTag3, emptyTag4)
|
||||||
|
if mixedTags4.Less(0, 1) {
|
||||||
|
t.Error("Less should return false when first tag has length >= 1 and second has length < 1")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -552,3 +552,106 @@ func TestComma(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Additional tests to reach 100% coverage
|
||||||
|
func TestUnmarshalQuotedEOF(t *testing.T) {
|
||||||
|
// Test EOF error case - when rem becomes empty during processing
|
||||||
|
content, rem, err := UnmarshalQuoted([]byte(`"`))
|
||||||
|
if err == nil {
|
||||||
|
t.Error("UnmarshalQuoted should return EOF error for incomplete quoted string")
|
||||||
|
}
|
||||||
|
// The function returns empty slice, not nil
|
||||||
|
if len(content) != 0 {
|
||||||
|
t.Errorf("Expected empty content, got %v", content)
|
||||||
|
}
|
||||||
|
if len(rem) != 0 {
|
||||||
|
t.Errorf("Expected empty rem, got %v", rem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnmarshalHexArrayEdgeCases(t *testing.T) {
|
||||||
|
// Test closing bracket case - this should return error for wrong size
|
||||||
|
_, _, err := UnmarshalHexArray([]byte(`["]`), 1)
|
||||||
|
if err == nil {
|
||||||
|
t.Error("UnmarshalHexArray should return error for wrong hex size")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test invalid hex size error
|
||||||
|
_, _, err2 := UnmarshalHexArray([]byte(`["01"]`), 2)
|
||||||
|
if err2 == nil {
|
||||||
|
t.Error("UnmarshalHexArray should return error for wrong hex size")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test invalid hex content error
|
||||||
|
_, _, err3 := UnmarshalHexArray([]byte(`["gg"]`), 1)
|
||||||
|
if err3 == nil {
|
||||||
|
t.Error("UnmarshalHexArray should return error for invalid hex")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test other character handling
|
||||||
|
arr4, rem4, err4 := UnmarshalHexArray([]byte(`[x]`), 1)
|
||||||
|
if err4 != nil {
|
||||||
|
t.Errorf("UnmarshalHexArray should handle other characters, got error: %v", err4)
|
||||||
|
}
|
||||||
|
if len(arr4) != 0 {
|
||||||
|
t.Errorf("Expected empty array, got %v", arr4)
|
||||||
|
}
|
||||||
|
if !bytes.Equal(rem4, []byte{}) {
|
||||||
|
t.Errorf("Expected empty rem, got %v", rem4)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test non-bracket start
|
||||||
|
arr5, rem5, err5 := UnmarshalHexArray([]byte(`x]`), 1)
|
||||||
|
if err5 != nil {
|
||||||
|
t.Errorf("UnmarshalHexArray should handle non-bracket start, got error: %v", err5)
|
||||||
|
}
|
||||||
|
if len(arr5) != 0 {
|
||||||
|
t.Errorf("Expected empty array, got %v", arr5)
|
||||||
|
}
|
||||||
|
if !bytes.Equal(rem5, []byte{}) {
|
||||||
|
t.Errorf("Expected empty rem, got %v", rem5)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test closing bracket without quote
|
||||||
|
arr6, rem6, err6 := UnmarshalHexArray([]byte(`[]`), 1)
|
||||||
|
if err6 != nil {
|
||||||
|
t.Errorf("UnmarshalHexArray should handle empty array, got error: %v", err6)
|
||||||
|
}
|
||||||
|
if len(arr6) != 0 {
|
||||||
|
t.Errorf("Expected empty array, got %v", arr6)
|
||||||
|
}
|
||||||
|
if !bytes.Equal(rem6, []byte{}) {
|
||||||
|
t.Errorf("Expected empty rem, got %v", rem6)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnmarshalStringArrayEdgeCases(t *testing.T) {
|
||||||
|
// Test UnmarshalQuoted error case - this actually doesn't fail, it just processes what it can
|
||||||
|
arr, _, err := UnmarshalStringArray([]byte(`["hello`))
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("UnmarshalStringArray should handle incomplete string, got error: %v", err)
|
||||||
|
}
|
||||||
|
// It should extract "hello" even without closing quote
|
||||||
|
if len(arr) != 1 || !bytes.Equal(arr[0], []byte("hello")) {
|
||||||
|
t.Errorf("Expected [hello], got %v", arr)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test other character handling
|
||||||
|
arr2, rem2, err2 := UnmarshalStringArray([]byte(`[x]`))
|
||||||
|
if err2 != nil {
|
||||||
|
t.Errorf("UnmarshalStringArray should handle other characters, got error: %v", err2)
|
||||||
|
}
|
||||||
|
if len(arr2) != 0 {
|
||||||
|
t.Errorf("Expected empty array, got %v", arr2)
|
||||||
|
}
|
||||||
|
if !bytes.Equal(rem2, []byte{}) {
|
||||||
|
t.Errorf("Expected empty rem, got %v", rem2)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test case that actually triggers UnmarshalQuoted error - control character
|
||||||
|
// This test covers the error path in UnmarshalStringArray when UnmarshalQuoted fails
|
||||||
|
_, _, err3 := UnmarshalStringArray([]byte(`["hello` + string(rune(9)) + `world"]`))
|
||||||
|
if err3 == nil {
|
||||||
|
t.Error("UnmarshalStringArray should return error for control characters")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user