PageRenderTime 47ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/IntegrationTests/UI.IntegrationTests/UserControls/RevisionGrid/RevisionGridControlTests.cs

https://github.com/gitextensions/gitextensions
C# | 384 lines | 291 code | 75 blank | 18 comment | 21 complexity | 5e71f49b7c88d0a36ddc33753bedccf3 MD5 | raw file
Possible License(s): GPL-3.0
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Threading;
  5. using System.Windows.Forms;
  6. using CommonTestUtils;
  7. using FluentAssertions;
  8. using GitCommands;
  9. using GitUI;
  10. using GitUI.CommandsDialogs;
  11. using GitUIPluginInterfaces;
  12. using NUnit.Framework;
  13. namespace GitExtensions.UITests.UserControls.RevisionGrid
  14. {
  15. [Apartment(ApartmentState.STA)]
  16. [NonParallelizable]
  17. public class RevisionGridControlTests
  18. {
  19. // Created once for the fixture
  20. private ReferenceRepository _referenceRepository;
  21. private string _initialCommit;
  22. private string _headCommit;
  23. private string _branch1Commit;
  24. // Created once for each test
  25. private GitUICommands _commands;
  26. [OneTimeSetUp]
  27. public void SetUpFixture()
  28. {
  29. // There is no need to restore the original AppSettings because AppSettings is routed to a temp folder.
  30. // We don't want avatars during tests, otherwise we will be attempting to download them from gravatar.
  31. AppSettings.ShowAuthorAvatarColumn = false;
  32. }
  33. [SetUp]
  34. public void SetUp()
  35. {
  36. _referenceRepository = new ReferenceRepository();
  37. _initialCommit = _referenceRepository.CommitHash;
  38. _referenceRepository.CreateCommit("Commit1", "Commit1");
  39. _branch1Commit = _referenceRepository.CommitHash;
  40. _referenceRepository.CreateBranch("Branch1", _branch1Commit);
  41. _referenceRepository.CreateCommit("Commit2", "Commit2");
  42. _referenceRepository.CreateBranch("Branch2", _referenceRepository.CommitHash);
  43. _referenceRepository.CreateCommit("head commit");
  44. _headCommit = _referenceRepository.CommitHash;
  45. _commands = new GitUICommands(_referenceRepository.Module);
  46. AppSettings.RevisionGraphShowArtificialCommits = true;
  47. }
  48. [TearDown]
  49. public void TearDown()
  50. {
  51. _referenceRepository.Dispose();
  52. }
  53. [Test]
  54. public void Assert_default_filter_related_settings()
  55. {
  56. AppSettings.BranchFilterEnabled = false;
  57. AppSettings.ShowCurrentBranchOnly = false;
  58. RunSetAndApplyBranchFilterTest(
  59. initialFilter: "",
  60. revisionGridControl =>
  61. {
  62. Assert.False(AppSettings.BranchFilterEnabled);
  63. Assert.False(AppSettings.ShowCurrentBranchOnly);
  64. Assert.True(revisionGridControl.CurrentFilter.IsShowAllBranchesChecked);
  65. Assert.False(revisionGridControl.CurrentFilter.IsShowCurrentBranchOnlyChecked);
  66. Assert.False(revisionGridControl.CurrentFilter.IsShowFilteredBranchesChecked);
  67. revisionGridControl.CurrentFilter.RefFilterOptions.Should().Be(RefFilterOptions.All | RefFilterOptions.Boundary | RefFilterOptions.ShowGitNotes);
  68. });
  69. RunSetAndApplyBranchFilterTest(
  70. initialFilter: "Branch1",
  71. revisionGridControl =>
  72. {
  73. Assert.True(AppSettings.BranchFilterEnabled);
  74. Assert.False(AppSettings.ShowCurrentBranchOnly);
  75. Assert.False(revisionGridControl.CurrentFilter.IsShowAllBranchesChecked);
  76. Assert.False(revisionGridControl.CurrentFilter.IsShowCurrentBranchOnlyChecked);
  77. Assert.True(revisionGridControl.CurrentFilter.IsShowFilteredBranchesChecked);
  78. revisionGridControl.CurrentFilter.RefFilterOptions.Should().Be(RefFilterOptions.Branches);
  79. });
  80. }
  81. [Test]
  82. public void View_reflects_applied_branch_filter()
  83. {
  84. AppSettings.BranchFilterEnabled = false;
  85. AppSettings.ShowCurrentBranchOnly = false;
  86. RunSetAndApplyBranchFilterTest(
  87. "",
  88. revisionGridControl =>
  89. {
  90. var ta = revisionGridControl.GetTestAccessor();
  91. Assert.False(revisionGridControl.CurrentFilter.IsShowFilteredBranchesChecked);
  92. ta.VisibleRevisionCount.Should().Be(4);
  93. // Verify the view hasn't changed until we refresh
  94. revisionGridControl.LatestSelectedRevision.ObjectId.ToString().Should().Be(_headCommit);
  95. // set filter
  96. revisionGridControl.SetAndApplyBranchFilter("Branch1");
  97. Assert.True(revisionGridControl.CurrentFilter.IsShowFilteredBranchesChecked);
  98. WaitForRevisionsToBeLoaded(revisionGridControl);
  99. // Confirm the filter has been applied
  100. ta.VisibleRevisionCount.Should().Be(2);
  101. });
  102. }
  103. [Test]
  104. public void View_reflects_reset_branch_filter()
  105. {
  106. AppSettings.BranchFilterEnabled = false;
  107. AppSettings.ShowCurrentBranchOnly = false;
  108. RunSetAndApplyBranchFilterTest(
  109. "Branch1",
  110. revisionGridControl =>
  111. {
  112. WaitForRevisionsToBeLoaded(revisionGridControl);
  113. var ta = revisionGridControl.GetTestAccessor();
  114. Assert.True(revisionGridControl.CurrentFilter.IsShowFilteredBranchesChecked);
  115. ta.VisibleRevisionCount.Should().Be(2);
  116. // Verify the view hasn't changed until we refresh
  117. revisionGridControl.LatestSelectedRevision.ObjectId.ToString().Should().Be(_branch1Commit);
  118. // reset filter
  119. revisionGridControl.SetAndApplyBranchFilter(string.Empty);
  120. Assert.False(revisionGridControl.CurrentFilter.IsShowFilteredBranchesChecked);
  121. WaitForRevisionsToBeLoaded(revisionGridControl);
  122. // Confirm the filter has been reset, all commits are shown
  123. ta.VisibleRevisionCount.Should().Be(4);
  124. });
  125. }
  126. [Test]
  127. public void ToggleBetweenArtificialAndHeadCommits_no_empty([Values(false, true)] bool showGitStatusForArtificialCommits)
  128. {
  129. RunToggleBetweenArtificialAndHeadCommitsTest(
  130. showGitStatusForArtificialCommits,
  131. revisionGridControl =>
  132. {
  133. // If showGitStatusForArtificialCommits is false, we do not update ChangeCount and HasChanges returns false.
  134. // Then ToggleBetweenArtificialAndHeadCommits does not check HasChanges and toggles through all three commits.
  135. while (revisionGridControl.GetChangeCount(ObjectId.WorkTreeId).HasChanges != showGitStatusForArtificialCommits
  136. || revisionGridControl.GetChangeCount(ObjectId.IndexId).HasChanges != showGitStatusForArtificialCommits)
  137. {
  138. DoEvents();
  139. }
  140. revisionGridControl.GoToRef(_initialCommit, showNoRevisionMsg: false);
  141. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(_initialCommit);
  142. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  143. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(GitRevision.WorkTreeGuid);
  144. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  145. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(GitRevision.IndexGuid);
  146. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  147. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(_headCommit);
  148. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  149. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(GitRevision.WorkTreeGuid);
  150. });
  151. }
  152. [Test]
  153. public void ToggleBetweenArtificialAndHeadCommits_no_workdir_change([Values(false, true)] bool showGitStatusForArtificialCommits)
  154. {
  155. File.Delete(Path.Combine(_referenceRepository.Module.WorkingDir, "A.txt"));
  156. RunToggleBetweenArtificialAndHeadCommitsTest(
  157. showGitStatusForArtificialCommits,
  158. revisionGridControl =>
  159. {
  160. while (revisionGridControl.GetChangeCount(ObjectId.WorkTreeId).HasChanges != false
  161. || revisionGridControl.GetChangeCount(ObjectId.IndexId).HasChanges != showGitStatusForArtificialCommits)
  162. {
  163. DoEvents();
  164. }
  165. revisionGridControl.GoToRef(_initialCommit, showNoRevisionMsg: false);
  166. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(_initialCommit);
  167. if (!showGitStatusForArtificialCommits)
  168. {
  169. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  170. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(GitRevision.WorkTreeGuid);
  171. }
  172. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  173. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(GitRevision.IndexGuid);
  174. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  175. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(_headCommit);
  176. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  177. revisionGridControl.LatestSelectedRevision.Guid
  178. .Should().Be(showGitStatusForArtificialCommits ? GitRevision.IndexGuid : GitRevision.WorkTreeGuid);
  179. });
  180. }
  181. [Test]
  182. public void ToggleBetweenArtificialAndHeadCommits_no_index_change([Values(false, true)] bool showGitStatusForArtificialCommits)
  183. {
  184. _referenceRepository.Module.Reset(ResetMode.Hard);
  185. File.WriteAllText(Path.Combine(_referenceRepository.Module.WorkingDir, "new.txt"), "new");
  186. RunToggleBetweenArtificialAndHeadCommitsTest(
  187. showGitStatusForArtificialCommits,
  188. revisionGridControl =>
  189. {
  190. while (revisionGridControl.GetChangeCount(ObjectId.WorkTreeId).HasChanges != showGitStatusForArtificialCommits
  191. || revisionGridControl.GetChangeCount(ObjectId.IndexId).HasChanges != false)
  192. {
  193. DoEvents();
  194. }
  195. revisionGridControl.GoToRef(_initialCommit, showNoRevisionMsg: false);
  196. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(_initialCommit);
  197. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  198. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(GitRevision.WorkTreeGuid);
  199. if (!showGitStatusForArtificialCommits)
  200. {
  201. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  202. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(GitRevision.IndexGuid);
  203. }
  204. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  205. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(_headCommit);
  206. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  207. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(GitRevision.WorkTreeGuid);
  208. });
  209. }
  210. [Test]
  211. public void ToggleBetweenArtificialAndHeadCommits_no_change([Values(false, true)] bool showGitStatusForArtificialCommits)
  212. {
  213. _referenceRepository.Module.Reset(ResetMode.Hard);
  214. RunToggleBetweenArtificialAndHeadCommitsTest(
  215. showGitStatusForArtificialCommits,
  216. revisionGridControl =>
  217. {
  218. while (revisionGridControl.GetChangeCount(ObjectId.WorkTreeId).HasChanges != false
  219. || revisionGridControl.GetChangeCount(ObjectId.IndexId).HasChanges != false)
  220. {
  221. DoEvents();
  222. }
  223. revisionGridControl.GoToRef(_initialCommit, showNoRevisionMsg: false);
  224. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(_initialCommit);
  225. if (!showGitStatusForArtificialCommits)
  226. {
  227. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  228. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(GitRevision.WorkTreeGuid);
  229. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  230. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(GitRevision.IndexGuid);
  231. }
  232. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  233. revisionGridControl.LatestSelectedRevision.Guid.Should().Be(_headCommit);
  234. revisionGridControl.ToggleBetweenArtificialAndHeadCommits();
  235. revisionGridControl.LatestSelectedRevision.Guid
  236. .Should().Be(showGitStatusForArtificialCommits ? _headCommit : GitRevision.WorkTreeGuid);
  237. });
  238. }
  239. private void RunSetAndApplyBranchFilterTest(string initialFilter, Action<RevisionGridControl> runTest)
  240. {
  241. // Disable artificial commits as they appear to destabilise these tests
  242. AppSettings.RevisionGraphShowArtificialCommits = false;
  243. UITest.RunForm<FormBrowse>(
  244. showForm: () => _commands.StartBrowseDialog(owner: null).Should().BeTrue(),
  245. runTestAsync: async formBrowse =>
  246. {
  247. DoEvents();
  248. // wait for the revisions to be loaded
  249. await AsyncTestHelper.JoinPendingOperationsAsync(AsyncTestHelper.UnexpectedTimeout);
  250. formBrowse.RevisionGridControl.SetSelectedRevision(ObjectId.Parse(_headCommit));
  251. formBrowse.RevisionGridControl.SetAndApplyBranchFilter(initialFilter);
  252. // wait for the revisions to be loaded
  253. await AsyncTestHelper.JoinPendingOperationsAsync(AsyncTestHelper.UnexpectedTimeout);
  254. try
  255. {
  256. runTest(formBrowse.RevisionGridControl);
  257. }
  258. catch (Exception ex)
  259. {
  260. Console.WriteLine($"{runTest.Method.Name} failed: {ex.Demystify()}");
  261. Console.WriteLine(_referenceRepository.Module.GitExecutable.GetOutput("status"));
  262. throw;
  263. }
  264. });
  265. }
  266. private void RunToggleBetweenArtificialAndHeadCommitsTest(bool showGitStatusForArtificialCommits, Action<RevisionGridControl> runTest)
  267. {
  268. AppSettings.ShowGitStatusForArtificialCommits = showGitStatusForArtificialCommits;
  269. UITest.RunForm<FormBrowse>(
  270. showForm: () => _commands.StartBrowseDialog(owner: null).Should().BeTrue(),
  271. runTestAsync: async formBrowse =>
  272. {
  273. DoEvents();
  274. // wait for the revisions to be loaded
  275. await AsyncTestHelper.JoinPendingOperationsAsync(AsyncTestHelper.UnexpectedTimeout);
  276. formBrowse.RevisionGridControl.LatestSelectedRevision.Guid.Should().Be(_headCommit);
  277. var ta = formBrowse.GetTestAccessor();
  278. ta.CommitInfoTabControl.SelectedTab = ta.TreeTabPage;
  279. // let the focus events be handled
  280. DoEvents();
  281. try
  282. {
  283. runTest(formBrowse.RevisionGridControl);
  284. }
  285. catch (Exception ex)
  286. {
  287. Console.WriteLine($"{runTest.Method.Name} failed: {ex.Demystify()}");
  288. Console.WriteLine(_referenceRepository.Module.GitExecutable.GetOutput("status"));
  289. throw;
  290. }
  291. // let the focus events be handled
  292. DoEvents();
  293. Assert.IsTrue(ta.CommitInfoTabControl.SelectedTab == ta.DiffTabPage, "Diff tab should be active");
  294. });
  295. }
  296. private static void DoEvents()
  297. {
  298. for (int i = 0; i < 5; ++i)
  299. {
  300. Thread.Sleep(50);
  301. Application.DoEvents();
  302. }
  303. }
  304. private static void WaitForRevisionsToBeLoaded(RevisionGridControl revisionGridControl)
  305. {
  306. UITest.ProcessUntil("Loading Revisions", () => revisionGridControl.GetTestAccessor().IsUiStable);
  307. }
  308. }
  309. }