private void UpdateDiffDimensions(DiffViewModel diffViewModel, HunkRangeInfo hunkRangeInfo) { if (TextView.IsClosed) { return; } var startLineNumber = hunkRangeInfo.NewHunkRange.StartingLineNumber; var endLineNumber = startLineNumber + hunkRangeInfo.NewHunkRange.NumberOfLines - 1; var snapshot = TextView.TextBuffer.CurrentSnapshot; if (startLineNumber < 0 || startLineNumber >= snapshot.LineCount || endLineNumber < 0 || endLineNumber >= snapshot.LineCount) { return; } var startLine = snapshot.GetLineFromLineNumber(startLineNumber); var endLine = snapshot.GetLineFromLineNumber(endLineNumber); if (startLine == null || endLine == null) { return; } var mapTop = _scrollBar.Map.GetCoordinateAtBufferPosition(startLine.Start) - 0.5; var mapBottom = _scrollBar.Map.GetCoordinateAtBufferPosition(endLine.End) + 0.5; diffViewModel.Top = Math.Round(_scrollBar.GetYCoordinateOfScrollMapPosition(mapTop)) - 2.0; diffViewModel.Height = Math.Round(_scrollBar.GetYCoordinateOfScrollMapPosition(mapBottom)) - diffViewModel.Top + 2.0; }
public void Execute() { var window = new MainWindow(); var diffView = new DiffView(); var windowViewModel = new MainWindowViewModel(diffView); var diffViewModel = new DiffViewModel(Option.SrcPath, Option.DstPath, windowViewModel); window.DataContext = windowViewModel; diffView.DataContext = diffViewModel; App.Current.MainWindow = window; window.Show(); }
public async Task UpdatesTreeDiff() { using var signal = new SemaphoreSlim(0, 1); var shaGenerator = new PseudoShaGenerator(); var addedFile = new TreeEntryChangesMock(ChangeKind.Added, true, Mode.NonExecutableFile, new ObjectId(shaGenerator.Generate()), "some/p.ath", false, Mode.Nonexistent, null, null); var firstCommit = CommitMock.GenerateCommit(shaGenerator, null, 0); var secondCommit = CommitMock.GenerateCommit(shaGenerator, firstCommit.Yield(), 1); var compareOptions = new CompareOptions(); var diff = new DiffMock(null, (oldTree, newTree, CompareOptions) => (oldTree, newTree, CompareOptions) == (firstCommit.Tree, secondCommit.Tree, compareOptions) ? new TreeChangesMock(((TreeEntryChanges)addedFile).Yield().ToList()) : throw new Exception("Compare was called with wrong arguments.")); var oldCommit = Observable.Return(new Variant <Commit, DiffTargets>(firstCommit)); var newCommit = Observable.Return(new Variant <Commit, DiffTargets>(secondCommit)); var head = new BranchMock(true, false, null, secondCommit, "HEAD"); var compareOptionsObs = Observable.Return(compareOptions); var repo = new RepositoryMock(new CommitMock[] { firstCommit, secondCommit }, new BranchCollectionMock(head.Yield().ToList()), null, diff); var repoObservable = Observable.Return(repo).Concat(Observable.Never <IRepositoryWrapper>()); var input = Observable .CombineLatest(oldCommit, newCommit, compareOptionsObs, repoObservable, (o, n, c, r) => new DiffViewModelInput(r, o, n, c)); Variant <List <TreeEntryChanges>, Unexpected>?value = null; var vm = new DiffViewModel(new TestSchedulers(), input); using var _ = vm.TreeDiff .Subscribe(val => { value = val; if (val.Is <List <TreeEntryChanges> >()) { signal.Release(); } }); if (value is null) { value = vm.TreeDiff.Value; } if (value is null) { throw new Exception("TreeDiff was not set."); } if (!value.Is <List <TreeEntryChanges> >()) { await signal.WaitAsync(TimeSpan.FromSeconds(10)); } Assert.IsTrue(value.Is <List <TreeEntryChanges> >()); }
public void UpdatesSelectionInfo() { var shaGenerator = new PseudoShaGenerator(); var firstCommit = CommitMock.GenerateCommit(shaGenerator, null, 0); var secondCommit = CommitMock.GenerateCommit(shaGenerator, firstCommit.Yield(), 1); var diff = new DiffMock(null, (_1, _2, _3) => new TreeChangesMock(new List <TreeEntryChanges>())); var head = new BranchMock(true, false, null, secondCommit, "HEAD"); var compareOptions = new CompareOptions(); var compareOptionsObs = Observable.Return(compareOptions); var repo = new RepositoryMock(new CommitMock[] { firstCommit, secondCommit }, new BranchCollectionMock(head.Yield().ToList()), null, diff); using var oldCommit = new BehaviorSubject <Variant <Commit, DiffTargets>?>(null); using var newCommit = new BehaviorSubject <Variant <Commit, DiffTargets>?>(null); var repoObservable = Observable.Return(repo).Concat(Observable.Never <IRepositoryWrapper>()); var input = Observable .CombineLatest(oldCommit, newCommit, compareOptionsObs, repoObservable, (o, n, c, r) => new DiffViewModelInput(r, o, n, c)); using var vm = new DiffViewModel(new TestSchedulers(), input); var selectionInfo = new List <Variant <string, Unexpected, List <TreeEntryChanges>, Commit> >(); var resetEvent = new AutoResetEvent(false); using var _ = vm.SelectionInfo .Subscribe(info => { selectionInfo.Add(info); resetEvent.Set(); }); resetEvent.WaitOne(TimeSpan.FromSeconds(5)); newCommit.OnNext(DiffTargets.WorkingDirectory); resetEvent.WaitOne(TimeSpan.FromSeconds(5)); oldCommit.OnNext(secondCommit); resetEvent.WaitOne(TimeSpan.FromSeconds(5)); newCommit.OnNext(firstCommit); resetEvent.WaitOne(TimeSpan.FromSeconds(5)); oldCommit.OnNext(null); resetEvent.WaitOne(TimeSpan.FromSeconds(5)); Assert.AreEqual(5, selectionInfo.Count); Assert.AreEqual(0, selectionInfo[0].VariantIndex); Assert.AreEqual(2, selectionInfo[1].VariantIndex); Assert.AreEqual(0, selectionInfo[2].VariantIndex); Assert.AreEqual(0, selectionInfo[3].VariantIndex); Assert.AreEqual(3, selectionInfo[4].VariantIndex); Assert.AreEqual(firstCommit, selectionInfo[4].Fourth); }
public async Task <IActionResult> CalculateDiff([FromBody] DiffRequestViewModel guid) { if (!ModelState.IsValid) { return(BadRequest()); } try { DiffViewModel diff = await _diffAppService.CalculateDiff(guid.Id); return(Ok(diff)); } catch (Exception) { return(StatusCode((int)HttpStatusCode.InternalServerError)); } }
public void CanCreateInstance() { var diff = new DiffMock(null, null); var oldCommit = Observable.Return((Variant <Commit, DiffTargets>?)null).Concat(Observable.Never <Variant <Commit, DiffTargets>?>()); var newCommit = Observable.Return((Variant <Commit, DiffTargets>?)null).Concat(Observable.Never <Variant <Commit, DiffTargets>?>()); var compareOptions = Observable.Return(new CompareOptions()).Concat(Observable.Never <CompareOptions>()); var repo = new RepositoryMock(new List <CommitMock>(), new BranchCollectionMock(new List <BranchMock>()), null, diff); var repoObservable = Observable.Return(repo).Concat(Observable.Never <IRepositoryWrapper>()); var input = Observable .CombineLatest(oldCommit, newCommit, compareOptions, repoObservable, (o, n, c, r) => new DiffViewModelInput(r, o, n, c)); var vm = new DiffViewModel(new TestSchedulers(), input); Variant <List <TreeEntryChanges>, Unexpected>?value = null; using var subscription = vm.TreeDiff.Subscribe(treeDiff => value = treeDiff); if (value is null) { throw new Exception("Value was not set."); } Assert.IsTrue(value.Is <Unexpected>()); Assert.AreEqual(DiffViewModel.NoCommitSelectedMessage, value.Get <Unexpected>().Message); }
public async Task CalculateDiff_success() { //Arrange Guid fakeGuid = new Guid(); DiffRequestViewModel fakeData = new DiffRequestViewModel() { Id = fakeGuid }; DiffViewModel fakeViewModel = GetDiffViewModelFake(fakeGuid); _diffAppServiceMock.Setup(x => x.CalculateDiff(It.IsAny <Guid>())) .Returns(Task.FromResult(fakeViewModel)); //Act var diffController = new DiffController(_diffAppServiceMock.Object); diffController.ControllerContext.HttpContext = _contextMock.Object; var actionResult = await diffController.CalculateDiff(fakeData); //Assert Assert.Equal((actionResult as OkObjectResult).StatusCode, (int)System.Net.HttpStatusCode.OK); Assert.Equal((((ObjectResult)actionResult).Value as DiffViewModel).Id, fakeGuid); }
private void UpdateDiffDimensions(DiffViewModel diffViewModel, HunkRangeInfo hunkRangeInfo) { if (TextView.IsClosed) { return; } bool?visible; if (diffViewModel.IsDeletion) { visible = UpdateDeletedDiffDimensions(diffViewModel, hunkRangeInfo); } else { visible = UpdateNormalDiffDimensions(diffViewModel, hunkRangeInfo); } if (visible.HasValue) { diffViewModel.IsVisible = visible.Value; } }
public DiffWindow() { InitializeComponent(); diffViewModel = new DiffViewModel(this); DataContext = diffViewModel; }
private bool?UpdateNormalDiffDimensions(DiffViewModel diffViewModel, HunkRangeInfo hunkRangeInfo) { if (hunkRangeInfo.NewHunkRange.NumberOfLines <= 0) { // if visible, it would have been as a deletion return(false); } var snapshot = TextView.TextBuffer.CurrentSnapshot; var startLineNumber = hunkRangeInfo.NewHunkRange.StartingLineNumber; var endLineNumber = startLineNumber + hunkRangeInfo.NewHunkRange.NumberOfLines - 1; if (startLineNumber < 0 || startLineNumber >= snapshot.LineCount || endLineNumber < 0 || endLineNumber >= snapshot.LineCount) { return(false); } var startLine = snapshot.GetLineFromLineNumber(startLineNumber); var endLine = snapshot.GetLineFromLineNumber(endLineNumber); if (startLine == null || endLine == null) { return(null); } var span = new SnapshotSpan(startLine.Start, endLine.End); if (!TextView.TextViewLines.FormattedSpan.IntersectsWith(span)) { return(false); } var startLineView = TextView.GetTextViewLineContainingBufferPosition(startLine.Start); var endLineView = TextView.GetTextViewLineContainingBufferPosition(endLine.Start); if (startLineView == null || endLineView == null) { return(false); } if (TextView.TextViewLines.LastVisibleLine.EndIncludingLineBreak < startLineView.Start) { // starts after the last visible line return(false); } if (TextView.TextViewLines.FirstVisibleLine.Start > endLineView.EndIncludingLineBreak) { // ends before the first visible line return(false); } double startTop; switch (startLineView.VisibilityState) { case VisibilityState.FullyVisible: case VisibilityState.Hidden: case VisibilityState.PartiallyVisible: startTop = startLineView.Top - TextView.ViewportTop; break; case VisibilityState.Unattached: // if the closest line was past the end we would have already returned startTop = 0; break; default: // shouldn't be reachable, but definitely hide if this is the case return(false); } double stopBottom; switch (endLineView.VisibilityState) { case VisibilityState.FullyVisible: case VisibilityState.Hidden: case VisibilityState.PartiallyVisible: stopBottom = endLineView.Bottom - TextView.ViewportTop; break; case VisibilityState.Unattached: // if the closest line was before the start we would have already returned stopBottom = TextView.ViewportHeight; break; default: // shouldn't be reachable, but definitely hide if this is the case return(false); } diffViewModel.Top = startTop; diffViewModel.Height = stopBottom - startTop; return(true); }
private bool?UpdateDeletedDiffDimensions(DiffViewModel diffViewModel, HunkRangeInfo hunkRangeInfo) { if (hunkRangeInfo.NewHunkRange.NumberOfLines != 0) { // unexpected number of lines for a deletion hunk return(false); } var snapshot = TextView.TextBuffer.CurrentSnapshot; var followingLineNumber = hunkRangeInfo.NewHunkRange.StartingLineNumber + 1; if (followingLineNumber < 0 || followingLineNumber >= snapshot.LineCount) { return(false); } var followingLine = snapshot.GetLineFromLineNumber(followingLineNumber); if (followingLine == null) { return(null); } var span = new SnapshotSpan(followingLine.Start, followingLine.End); if (!TextView.TextViewLines.FormattedSpan.IntersectsWith(span)) { return(false); } var followingLineView = TextView.GetTextViewLineContainingBufferPosition(followingLine.Start); if (followingLineView == null) { return(false); } if (TextView.TextViewLines.LastVisibleLine.EndIncludingLineBreak < followingLineView.Start) { // starts after the last visible line return(false); } if (TextView.TextViewLines.FirstVisibleLine.Start > followingLineView.EndIncludingLineBreak) { // ends before the first visible line return(false); } double followingTop; switch (followingLineView.VisibilityState) { case VisibilityState.FullyVisible: case VisibilityState.Hidden: case VisibilityState.PartiallyVisible: followingTop = followingLineView.Top - TextView.ViewportTop; break; case VisibilityState.Unattached: // if the closest line was past the end we would have already returned followingTop = 0; break; default: // shouldn't be reachable, but definitely hide if this is the case return(false); } double center = followingTop; double height = TextView.LineHeight; diffViewModel.Top = center - (height / 2.0); diffViewModel.Height = TextView.LineHeight; return(true); }
public DiffView() { DataContext = new DiffViewModel(); InitializeComponent(); }
public DiffDialog(string firstFile = "", string secondFile = "") { InitializeComponent(); DataContext = new DiffViewModel(firstFile, secondFile); }
public DiffDialog() { InitializeComponent(); DataContext = new DiffViewModel(); }