package git import ( "errors" "os" "testing" ) func TestDiffTreeToTree(t *testing.T) { repo := createTestRepo(t) defer repo.Free() defer os.RemoveAll(repo.Workdir()) _, originalTreeId := seedTestRepo(t, repo) originalTree, err := repo.LookupTree(originalTreeId) checkFatal(t, err) _, newTreeId := updateReadme(t, repo, "file changed\n") newTree, err := repo.LookupTree(newTreeId) checkFatal(t, err) callbackInvoked := false opts := DiffOptions{ NotifyCallback: func(diffSoFar *Diff, delta DiffDelta, matchedPathSpec string) error { callbackInvoked = true return nil }, } diff, err := repo.DiffTreeToTree(originalTree, newTree, &opts) checkFatal(t, err) if !callbackInvoked { t.Fatal("callback not invoked") } if diff == nil { t.Fatal("no diff returned") } files := make([]string, 0) hunks := make([]DiffHunk, 0) lines := make([]DiffLine, 0) err = diff.ForEach(func(file DiffDelta, progress float64) (DiffForEachHunkCallback, error) { files = append(files, file.OldFile.Path) return func(hunk DiffHunk) (DiffForEachLineCallback, error) { hunks = append(hunks, hunk) return func(line DiffLine) error { lines = append(lines, line) return nil }, nil }, nil }, DiffDetailLines) checkFatal(t, err) if len(files) != 1 { t.Fatal("Incorrect number of files in diff") } if files[0] != "README" { t.Fatal("File in diff was expected to be README") } if len(hunks) != 1 { t.Fatal("Incorrect number of hunks in diff") } if hunks[0].OldStart != 1 || hunks[0].NewStart != 1 { t.Fatal("Incorrect hunk") } if len(lines) != 2 { t.Fatal("Incorrect number of lines in diff") } if lines[0].Content != "foo\n" { t.Fatal("Incorrect lines in diff") } if lines[1].Content != "file changed\n" { t.Fatal("Incorrect lines in diff") } errTest := errors.New("test error") err = diff.ForEach(func(file DiffDelta, progress float64) (DiffForEachHunkCallback, error) { return nil, errTest }, DiffDetailLines) if err != errTest { t.Fatal("Expected custom error to be returned") } }