private async Task <bool> PostResult(FlashcardResult result)
 {
     return(await _apiClient.PostJsonAsync(ApiUrls.LearningResultEndpoint, new FlashcardResultViewModel()
     {
         FlashcardId = _flashcard.Id, Result = result
     }));
 }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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();
        }