package gitdiff import ( "testing" "time" ) func TestParsePatchIdentity(t *testing.T) { tests := map[string]struct { Input string Output PatchIdentity Err interface{} }{ "simple": { Input: "Morton Haypenny ", Output: PatchIdentity{ Name: "Morton Haypenny", Email: "mhaypenny@example.com", }, }, "extraWhitespace": { Input: " Morton Haypenny ", Output: PatchIdentity{ Name: "Morton Haypenny", Email: "mhaypenny@example.com", }, }, "trailingCharacters": { Input: "Morton Haypenny unrelated garbage", Output: PatchIdentity{ Name: "Morton Haypenny", Email: "mhaypenny@example.com", }, }, "missingName": { Input: "", Err: "invalid identity", }, "missingEmail": { Input: "Morton Haypenny", Err: "invalid identity", }, "unclosedEmail": { Input: "Morton Haypenny A sample commit to test header parsing `, Header: PatchHeader{ SHA: expectedSHA, Author: expectedIdentity, Title: expectedTitle, }, }, "prettyMedium": { Input: `commit 61f5cd90bed4d204ee3feb3aa41ee91d4734855b Author: Morton Haypenny Date: Sat Apr 11 15:21:23 2020 -0700 A sample commit to test header parsing The medium format shows the body, which may wrap on to multiple lines. Another body line. `, Header: PatchHeader{ SHA: expectedSHA, Author: expectedIdentity, AuthorDate: expectedDate, Title: expectedTitle, Message: expectedMsg, }, }, "prettyFull": { Input: `commit 61f5cd90bed4d204ee3feb3aa41ee91d4734855b Author: Morton Haypenny Commit: Morton Haypenny A sample commit to test header parsing The medium format shows the body, which may wrap on to multiple lines. Another body line. `, Header: PatchHeader{ SHA: expectedSHA, Author: expectedIdentity, Committer: expectedIdentity, Title: expectedTitle, Message: expectedMsg, }, }, "prettyFuller": { Input: `commit 61f5cd90bed4d204ee3feb3aa41ee91d4734855b Author: Morton Haypenny AuthorDate: Sat Apr 11 15:21:23 2020 -0700 Commit: Morton Haypenny CommitDate: Sat Apr 11 15:21:23 2020 -0700 A sample commit to test header parsing The medium format shows the body, which may wrap on to multiple lines. Another body line. `, Header: PatchHeader{ SHA: expectedSHA, Author: expectedIdentity, AuthorDate: expectedDate, Committer: expectedIdentity, CommitterDate: expectedDate, Title: expectedTitle, Message: expectedMsg, }, }, "mailbox": { Input: `From 61f5cd90bed4d204ee3feb3aa41ee91d4734855b Mon Sep 17 00:00:00 2001 From: Morton Haypenny Date: Sat, 11 Apr 2020 15:21:23 -0700 Subject: [PATCH] A sample commit to test header parsing The medium format shows the body, which may wrap on to multiple lines. Another body line. `, Header: PatchHeader{ SHA: expectedSHA, Author: expectedIdentity, AuthorDate: &PatchDate{ Parsed: expectedDate.Parsed, Raw: "Sat, 11 Apr 2020 15:21:23 -0700", }, Title: "[PATCH] " + expectedTitle, Message: expectedMsg, }, }, "unwrapTitle": { Input: `commit 61f5cd90bed4d204ee3feb3aa41ee91d4734855b Author: Morton Haypenny Date: Sat Apr 11 15:21:23 2020 -0700 A sample commit to test header parsing with a long title that is wrapped. `, Header: PatchHeader{ SHA: expectedSHA, Author: expectedIdentity, AuthorDate: expectedDate, Title: expectedTitle + " with a long title that is wrapped.", }, }, "normalizeBodySpace": { Input: `commit 61f5cd90bed4d204ee3feb3aa41ee91d4734855b Author: Morton Haypenny Date: Sat Apr 11 15:21:23 2020 -0700 A sample commit to test header parsing The medium format shows the body, which may wrap on to multiple lines. Another body line. `, Header: PatchHeader{ SHA: expectedSHA, Author: expectedIdentity, AuthorDate: expectedDate, Title: expectedTitle, Message: expectedMsg, }, }, "ignoreLeadingBlankLines": { Input: ` ` + " " + ` commit 61f5cd90bed4d204ee3feb3aa41ee91d4734855b Author: Morton Haypenny A sample commit to test header parsing `, Header: PatchHeader{ SHA: expectedSHA, Author: expectedIdentity, Title: expectedTitle, }, }, } for name, test := range tests { t.Run(name, func(t *testing.T) { h, err := ParsePatchHeader(test.Input) if test.Err != nil { assertError(t, test.Err, err, "parsing patch header") return } if err != nil { t.Fatalf("unexpected error parsing patch header: %v", err) } if h == nil { t.Fatalf("expected non-nil header, but got nil") } exp := test.Header act := *h if exp.SHA != act.SHA { t.Errorf("incorrect parsed SHA: expected %q, actual %q", exp.SHA, act.SHA) } assertPatchIdentity(t, "author", exp.Author, act.Author) assertPatchDate(t, "author", exp.AuthorDate, act.AuthorDate) assertPatchIdentity(t, "committer", exp.Committer, act.Committer) assertPatchDate(t, "committer", exp.CommitterDate, act.CommitterDate) if exp.Title != act.Title { t.Errorf("incorrect parsed title:\n expected: %q\n actual: %q", exp.Title, act.Title) } if exp.Message != act.Message { t.Errorf("incorrect parsed message:\n expected: %q\n actual: %q", exp.Message, act.Message) } }) } } func assertPatchIdentity(t *testing.T, kind string, exp, act *PatchIdentity) { switch { case exp == nil && act == nil: case exp == nil && act != nil: t.Errorf("incorrect parsed %s: expected nil, but got %+v", kind, act) case exp != nil && act == nil: t.Errorf("incorrect parsed %s: expected %+v, but got nil", kind, exp) case exp.Name != act.Name || exp.Email != act.Email: t.Errorf("incorrect parsed %s, expected %+v, bot got %+v", kind, exp, act) } } func assertPatchDate(t *testing.T, kind string, exp, act *PatchDate) { switch { case exp == nil && act == nil: case exp == nil && act != nil: t.Errorf("incorrect parsed %s date: expected nil, but got %+v", kind, act) case exp != nil && act == nil: t.Errorf("incorrect parsed %s date: expected %+v, but got nil", kind, exp) case exp.Raw != act.Raw || !exp.Parsed.Equal(act.Parsed): t.Errorf("incorrect parsed %s date, expected %+v, bot got %+v", kind, exp, act) } }