public async Task <SurveyModel> Handle(CreateSurveyCommand request, CancellationToken cancellationToken)
        {
            var survey = new Survey(request.SurveyTopic, request.NumberOfRespondents, request.RespondentType);

            foreach (var option in request.SurveyOptions)
            {
                if (option.PreferredNumberOfVotes.HasValue)
                {
                    survey.AddSurveyOption(option.OptionText, option.PreferredNumberOfVotes.Value);
                }
                else
                {
                    survey.AddSurveyOption(option.OptionText);
                }
            }

            IVoteDistribution voteDistribution;

            if (request.SurveyOptions.Any(option => option.PreferredNumberOfVotes > 0))
            {
                voteDistribution = new FixedVoteDistribution();
            }
            else
            {
                voteDistribution = new RandomVoteDistribution();
            }

            var result = survey.CalculateOutcome(voteDistribution);

            _surveyRepository.Add(result);

            await _surveyRepository.UnitOfWork.SaveEntitiesAsync(cancellationToken);

            return(_mapper.Map <SurveyModel>(result));
        }
示例#2
0
        public void Should_Be_Able_To_Calculate_Results_Of_Survey_With_Fixed_Outcome()
        {
            var topic = "Tabs or spaces?";
            var numberOfRespondents = 1000;
            var respondentType      = "Developers";

            var survey = new Survey(topic, numberOfRespondents, respondentType);

            survey.AddSurveyOption("Tabs", 600);
            survey.AddSurveyOption("Spaces", 400);

            var voteDistribution = new FixedVoteDistribution();

            var result = survey.CalculateOutcome(voteDistribution);

            Assert.Equal(600, result.Options.First().NumberOfVotes);
            Assert.Equal(400, result.Options.Last().NumberOfVotes);
        }