1use crate::{commit::Commit, file_status::FileStatus};
2
3#[derive(Debug)]
5pub struct CommitDiff {
6 pub(crate) commit: Commit,
7 pub(crate) parent: Option<Commit>,
8 pub(crate) file_statuses: Vec<FileStatus>,
9 pub(crate) number_files_changed: usize,
10 pub(crate) number_insertions: usize,
11 pub(crate) number_deletions: usize,
12}
13
14impl CommitDiff {
15 #[inline]
17 #[must_use]
18 pub const fn commit(&self) -> &Commit {
19 &self.commit
20 }
21
22 #[inline]
24 #[must_use]
25 pub const fn parent(&self) -> &Option<Commit> {
26 &self.parent
27 }
28
29 #[inline]
31 #[must_use]
32 pub const fn file_statuses(&self) -> &Vec<FileStatus> {
33 &self.file_statuses
34 }
35
36 #[inline]
38 #[must_use]
39 pub const fn number_files_changed(&self) -> usize {
40 self.number_files_changed
41 }
42
43 #[inline]
45 #[must_use]
46 pub const fn number_insertions(&self) -> usize {
47 self.number_insertions
48 }
49
50 #[inline]
52 #[must_use]
53 pub const fn number_deletions(&self) -> usize {
54 self.number_deletions
55 }
56}
57
58#[cfg(test)]
59mod tests {
60 use claim::assert_some_eq;
61
62 use crate::{
63 delta::Delta,
64 diff_line::DiffLine,
65 file_mode::FileMode,
66 file_status::FileStatus,
67 file_status_builder::FileStatusBuilder,
68 status::Status,
69 testutil::{CommitBuilder, CommitDiffBuilder},
70 Origin,
71 };
72
73 #[test]
74 fn commit() {
75 let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789ABCDEF").build()).build();
76 assert_eq!(diff.commit(), &CommitBuilder::new("0123456789ABCDEF").build());
77 }
78
79 #[test]
80 fn parent() {
81 let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789ABCDEF").build())
82 .parent(CommitBuilder::new("ABCDEF0123456789").build())
83 .build();
84 assert_some_eq!(diff.parent(), &CommitBuilder::new("ABCDEF0123456789").build());
85 }
86
87 #[test]
88 fn file_statuses() {
89 let mut builder = FileStatusBuilder::new();
90 builder.add_file_stat(FileStatus::new(
91 "foo",
92 FileMode::Normal,
93 false,
94 "foo",
95 FileMode::Normal,
96 false,
97 Status::Modified,
98 ));
99 builder.add_delta(Delta::new("name", 0, 0, 0, 1));
100 builder.add_diff_line(DiffLine::new(Origin::Addition, "line", None, Some(1), false));
101 let file_statuses = builder.build();
102 let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789ABCDEF").build())
103 .file_statuses(file_statuses)
104 .build();
105 assert_eq!(diff.file_statuses()[0].source_path.to_string_lossy(), "foo");
106 }
107
108 #[test]
109 fn number_files_changed() {
110 let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789ABCDEF").build())
111 .number_files_changed(1)
112 .build();
113 assert_eq!(diff.number_files_changed(), 1);
114 }
115
116 #[test]
117 fn number_insertions() {
118 let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789ABCDEF").build())
119 .number_insertions(2)
120 .build();
121 assert_eq!(diff.number_insertions(), 2);
122 }
123
124 #[test]
125 fn number_deletions() {
126 let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789ABCDEF").build())
127 .number_deletions(3)
128 .build();
129 assert_eq!(diff.number_deletions(), 3);
130 }
131}