public async Task UpdateAsync_WithName_UpdatesTracker()
        {
            // arrange
            int    id   = 0;
            string name = "Collen";

            var service = new MockTrackerService();

            service.Trackers.Add(new Tracker {
                Id = 0, Name = "Bob"
            });

            var vm = new TrackerViewModel(service)
            {
                Id   = id,
                Name = name
            };

            // act
            await vm.UpdateAsync();

            // assert
            Assert.Single(vm.AllTrackers);
            Assert.Contains(vm.AllTrackers, tracker => tracker.Name == name && tracker.Id == id);
        }
        public async Task UpdateAsync_WithName_SendsMessageWithTracker()
        {
            // arrange
            int    id   = 0;
            string name = "Collen";

            var service = new MockTrackerService();

            service.Trackers.Add(new Tracker {
                Id = 0, Name = "Bob"
            });

            var vm = new TrackerViewModel(service)
            {
                Id   = 0,
                Name = name
            };

            Tracker updatedTracker = null;

            MessagingCenter.Subscribe <TrackerViewModel, Tracker>(this, nameof(vm.UpdateCommand),
                                                                  (sender, tracker) => updatedTracker = tracker);

            // act
            await vm.UpdateAsync();

            // assert
            Assert.Equal(id, updatedTracker?.Id);
            Assert.Equal(name, updatedTracker?.Name);
        }
        public async Task DeleteAsync_NullTracker_DoesNothing()
        {
            // arrange
            var service = new MockTrackerService();

            service.Trackers.Add(null);
            var vm = new TrackerViewModel(service);

            // act
            await vm.DeleteAsync(null);

            // assert
            Assert.Single(service.Trackers, expected: null);
        }
        public async Task DeleteAsync_WithTracker_DeletesTracker()
        {
            // arrange
            var tracker = new Tracker {
                Id = 0
            };
            var service = new MockTrackerService();

            service.Trackers.Add(tracker);
            var vm = new TrackerViewModel(service);

            // act
            await vm.DeleteAsync(tracker);

            // assert
            Assert.Empty(vm.AllTrackers);
        }
        public async Task UpdateAsync_WithName_HasNoError(string name)
        {
            // arrange
            var service = new MockTrackerService();

            service.Trackers.Add(new Tracker {
                Id = 0, Name = "Bob"
            });

            var vm = new TrackerViewModel(service)
            {
                Id   = 0,
                Name = name
            };

            // act
            await vm.UpdateAsync();

            // assert
            Assert.False(vm.HasError);
        }