private async Task <bool> PostResult(FlashcardResult result) { return(await _apiClient.PostJsonAsync(ApiUrls.LearningResultEndpoint, new FlashcardResultViewModel() { FlashcardId = _flashcard.Id, Result = result })); }
private int CalculateNewProgress(int oldProgress, FlashcardResult result) { int minProgress = _opts.MinProgress; int maxProgress = _opts.MaxProgress; int newProgress = oldProgress; switch (result) { case FlashcardResult.Success: newProgress += _opts.OnSuccess; break; case FlashcardResult.Partial: newProgress += _opts.OnPartial; break; case FlashcardResult.Fail: newProgress += _opts.OnFailure; break; default: throw new ArgumentException(nameof(result)); } newProgress = Math.Max(newProgress, minProgress); newProgress = Math.Min(newProgress, maxProgress); return(newProgress); }
private int CalculateExpectedProgressForNew(FlashcardResult result) { switch (result) { case FlashcardResult.Success: return(Options.OnSuccess); case FlashcardResult.Fail: return(Options.OnFailure); case FlashcardResult.Partial: return(Options.OnPartial); } throw new ArgumentException(nameof(result)); }
public async Task NewUserProgressTest(FlashcardResult result) { int count = 20; var category = (await AddCategories()).First(); var flashcards = await AddFlashcards(category, count); var user = (await AddUsers()).First(); await Service.ProceedFlashcard(flashcards[0].Id, user, result); var userProgresses = UnitOfWork.UserProgressRepository.GetAll().ToList(); Assert.Equal(userProgresses.Count, 1); Assert.Contains(userProgresses, up => up.FlashcardId == flashcards[0].Id); int expectedProgress = CalculateExpectedProgressForNew(result); Assert.Equal(userProgresses[0].Progress, expectedProgress); }
public async Task NoOverflowTest(FlashcardResult result) { int count = 20; var category = (await AddCategories()).First(); var flashcards = await AddFlashcards(category, count); var user = (await AddUsers()).First(); var progress = (await AddUserProgress(new[] { flashcards[0] }, new[] { user })).First(); int oldValue = result == FlashcardResult.Fail ? Options.MinProgress : Options.MaxProgress; progress.Progress = oldValue; await Service.ProceedFlashcard(flashcards[0].Id, user, result); var userProgresses = UnitOfWork.UserProgressRepository.GetAll().ToList(); Assert.Equal(userProgresses.Count, 1); Assert.Contains(userProgresses, up => up.FlashcardId == flashcards[0].Id); int expectedProgress = oldValue; Assert.Equal(userProgresses[0].Progress, expectedProgress); }
public async Task ProceedFlashcard(int flashcardId, User user, FlashcardResult result) { var flashcard = await _unitOfWork.FlashcardRepository.GetById(flashcardId); EnsureUser(user); EnsureFlashcard(flashcard); var userProgress = await _unitOfWork.UserProgressRepository.GetById(user.Id, flashcardId); if (userProgress == null) { userProgress = new UserProgress(user, flashcard); userProgress.Progress = CalculateNewProgress(userProgress.Progress, result); await _unitOfWork.UserProgressRepository.Add(userProgress); } else { userProgress.Progress = CalculateNewProgress(userProgress.Progress, result); _unitOfWork.UserProgressRepository.Update(userProgress); } await _unitOfWork.SaveChangesAsync(); }