From caa77b6386b3581e095f788db4cbcd7de1a9d01a Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sun, 7 Jun 2026 08:08:47 +0000 Subject: object/commit: Better test --- object/commit/parse_test.go | 182 +++++++++++++++++++------------------------- 1 file changed, 79 insertions(+), 103 deletions(-) diff --git a/object/commit/parse_test.go b/object/commit/parse_test.go index 58545db7..9fb6251f 100644 --- a/object/commit/parse_test.go +++ b/object/commit/parse_test.go @@ -2,7 +2,6 @@ package commit_test import ( "bytes" - "fmt" "strings" "testing" @@ -36,118 +35,95 @@ func TestParse(t *testing.T) { t.Fatalf("MkTree: %v", err) } - commitID, err := repo.CommitTree(t, treeID, "subject\n\nbody") + rootID, err := repo.CommitTree(t, treeID, "root subject\n\nroot body") if err != nil { - t.Fatalf("CommitTree: %v", err) + t.Fatalf("CommitTree(root): %v", err) } - rawBody, err := repo.CatFile(t, typ.TypeCommit, commitID) + childID, err := repo.CommitTree(t, treeID, "child subject\n\nchild body", rootID) if err != nil { - t.Fatalf("CatFile: %v", err) + t.Fatalf("CommitTree(child): %v", err) } - parsed, err := commit.Parse(rawBody, objectFormat) + sideID, err := repo.CommitTree(t, treeID, "side subject\n\nside body") if err != nil { - t.Fatalf("Parse: %v", err) + t.Fatalf("CommitTree(side): %v", err) } - if parsed.Tree != treeID { - t.Fatalf("tree id mismatch: got %s want %s", parsed.Tree, treeID) - } - - if len(parsed.Parents) != 0 { - t.Fatalf("parent count = %d, want 0", len(parsed.Parents)) - } - - if !bytes.Equal(parsed.Author.Name, []byte("Test Author")) { - t.Fatalf("author name = %q, want %q", parsed.Author.Name, "Test Author") - } - - if !bytes.Equal(parsed.Committer.Name, []byte("Test Committer")) { - t.Fatalf("committer name = %q, want %q", parsed.Committer.Name, "Test Committer") - } - - if !bytes.Contains(parsed.Message, []byte("subject")) { - t.Fatalf("commit message missing subject: %q", parsed.Message) - } - }) - } -} - -func TestParseMultipleParents(t *testing.T) { - t.Parallel() - - for _, objectFormat := range id.SupportedObjectFormats() { - t.Run(objectFormat.String(), func(t *testing.T) { - t.Parallel() - - repo, err := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: objectFormat}) - if err != nil { - t.Fatalf("NewRepo: %v", err) - } - - blobID, err := repo.HashObject(t, typ.TypeBlob, strings.NewReader("merge-content\n")) - if err != nil { - t.Fatalf("HashObject: %v", err) - } - - treeID, err := repo.MkTree(t, []testgit.MkTreeEntry{ - {Mode: "100644", Type: typ.TypeBlob, OID: blobID, Name: "file.txt"}, - }) - if err != nil { - t.Fatalf("MkTree: %v", err) - } - - parent1, err := repo.CommitTree(t, treeID, "parent-one") + mergeID, err := repo.CommitTree(t, treeID, "merge subject\n\nmerge body", childID, sideID) if err != nil { - t.Fatalf("CommitTree(parent1): %v", err) - } - - parent2, err := repo.CommitTree(t, treeID, "parent-two", parent1) - if err != nil { - t.Fatalf("CommitTree(parent2): %v", err) - } - - rawCommit := fmt.Sprintf( - "tree %s\nparent %s\nparent %s\nauthor Test Author 1234567890 +0000\ncommitter Test Committer 1234567890 +0000\n\nMerge commit\n", - treeID, - parent1, - parent2, - ) - - mergeID, err := repo.HashObject(t, typ.TypeCommit, strings.NewReader(rawCommit)) - if err != nil { - t.Fatalf("HashObject(merge): %v", err) - } - - rawBody, err := repo.CatFile(t, typ.TypeCommit, mergeID) - if err != nil { - t.Fatalf("CatFile: %v", err) - } - - parsed, err := commit.Parse(rawBody, objectFormat) - if err != nil { - t.Fatalf("Parse(merge): %v", err) - } - - if parsed.Tree != treeID { - t.Fatalf("merge tree = %s, want %s", parsed.Tree, treeID) - } - - if len(parsed.Parents) != 2 { - t.Fatalf("merge parent count = %d, want 2", len(parsed.Parents)) - } - - if parsed.Parents[0] != parent1 { - t.Fatalf("merge parent[0] = %s, want %s", parsed.Parents[0], parent1) - } - - if parsed.Parents[1] != parent2 { - t.Fatalf("merge parent[1] = %s, want %s", parsed.Parents[1], parent2) - } - - if !bytes.Equal(parsed.Message, []byte("Merge commit\n")) { - t.Fatalf("merge message = %q, want %q", parsed.Message, "Merge commit\n") + t.Fatalf("CommitTree(merge): %v", err) + } + + for _, tc := range []struct { + name string + oid id.ObjectID + parents []id.ObjectID + message []byte + }{ + { + name: "root", + oid: rootID, + message: []byte("root subject\n\nroot body\n"), + }, + { + name: "child", + oid: childID, + parents: []id.ObjectID{rootID}, + message: []byte("child subject\n\nchild body\n"), + }, + { + name: "merge", + oid: mergeID, + parents: []id.ObjectID{childID, sideID}, + message: []byte("merge subject\n\nmerge body\n"), + }, + } { + t.Run(tc.name, func(t *testing.T) { + rawBody, err := repo.CatFile(t, typ.TypeCommit, tc.oid) + if err != nil { + t.Fatalf("CatFile: %v", err) + } + + parsed, err := commit.Parse(rawBody, objectFormat) + if err != nil { + t.Fatalf("Parse: %v", err) + } + + if parsed.Tree != treeID { + t.Fatalf("tree id mismatch: got %s want %s", parsed.Tree, treeID) + } + + if len(parsed.Parents) != len(tc.parents) { + t.Fatalf("parent count = %d, want %d", len(parsed.Parents), len(tc.parents)) + } + + for i, parent := range tc.parents { + if parsed.Parents[i] != parent { + t.Fatalf("parent[%d] = %s, want %s", i, parsed.Parents[i], parent) + } + } + + if !bytes.Equal(parsed.Author.Name, []byte("Test Author")) { + t.Fatalf("author name = %q, want %q", parsed.Author.Name, "Test Author") + } + + if !bytes.Equal(parsed.Author.Email, []byte("author@example.org")) { + t.Fatalf("author email = %q, want %q", parsed.Author.Email, "author@example.org") + } + + if !bytes.Equal(parsed.Committer.Name, []byte("Test Committer")) { + t.Fatalf("committer name = %q, want %q", parsed.Committer.Name, "Test Committer") + } + + if !bytes.Equal(parsed.Committer.Email, []byte("committer@example.org")) { + t.Fatalf("committer email = %q, want %q", parsed.Committer.Email, "committer@example.org") + } + + if !bytes.Equal(parsed.Message, tc.message) { + t.Fatalf("message = %q, want %q", parsed.Message, tc.message) + } + }) } }) } -- cgit v1.3.1-10-gc9f91