Example #1
0
        public void CamperScheduleGrid_OverSubscribedSchedule_HasUnscheduledBlocks(int numberOfActivitiesToVerify)
        {
            // Arrange - run schedule with successful data set
            List <ActivityDefinition> activityDefinitions = new List <ActivityDefinition>(
                _activityDefinitionService.GetActivityDefinition(DefaultSetName));
            List <ActivityDefinition> schedule;

            using (MemoryStream camperRequestStream = new MemoryStream(_overSubscribedCamperRequestsBuffer))
            {
                List <CamperRequests> camperRequests = CamperRequests.ReadCamperRequests(
                    camperRequestStream, activityDefinitions);
                string scheduleId = "MySchedule";
                schedule = _schedulerService.CreateSchedule(scheduleId, camperRequests, activityDefinitions);
                _localStorage.GetItemAsync <string>(Arg.Any <string>())
                .Returns(Task.FromResult(scheduleId));
            }

            // Act - load the grid component
            RenderedComponent <CamperScheduleGrid> component =
                _host.AddComponent <CamperScheduleGrid>();

            // Assert
            List <HtmlNode> nameCells = component.FindAll("td")
                                        .Where(node => node.Attributes.AttributesWithName("data-name")
                                               .Any(a => a.Value.Equals("FullName"))).ToList();
            int numberOfCampers = 104;

            Assert.That(nameCells, Has.Count.EqualTo(numberOfCampers),
                        "Number of camper rows");

            ActivityDefinition unscheduledActivity = schedule.First(ad =>
                                                                    ad.Name.Equals(SchedulerService.UnscheduledActivityName));

            foreach (var activity in schedule.Take(numberOfActivitiesToVerify).Append(unscheduledActivity))
            {
                for (int timeSlot = 0; timeSlot < ActivityBlock.MaximumTimeSlots; timeSlot++)
                {
                    IActivityBlock activityBlock = activity.ScheduledBlocks.First(
                        ab => ab.TimeSlot == timeSlot);
                    foreach (var camper in activityBlock.AssignedCampers)
                    {
                        string          camperSlotId    = $"{camper.FullName}-{timeSlot}";
                        List <HtmlNode> camperSlotCells = component.FindAll("select")
                                                          .Where(node => node.Attributes.AttributesWithName("id")
                                                                 .Any(a => a.Value.Equals(camperSlotId))).ToList();
                        Assert.That(camperSlotCells, Has.Count.EqualTo(1),
                                    $"Number of camper slots for Id = {camperSlotId}");
                        List <HtmlAttribute> valueAttributes = camperSlotCells[0].Attributes
                                                               .AttributesWithName("value").ToList();
                        Assert.That(valueAttributes, Has.Count.EqualTo(1),
                                    $"Number of value attributes on selector for ID={camperSlotId}");
                        Assert.That(valueAttributes[0].Value,
                                    Is.EqualTo(activity.Name), "Selected activity");
                    }
                }
            }
        }
        /// <summary>
        /// Write the activity schedules to a CSV string.
        /// </summary>
        /// <param name="activityDefinitions">List of activity defintions</param>
        /// <param name="logger">Logger</param>
        public static string WriteScheduleToCsvString(List <ActivityDefinition> activityDefinitions,
                                                      ILogger logger)
        {
            try
            {
                using (var outTextWriter = new StringWriter())
                {
                    using (var csvWriter = new CsvWriter(outTextWriter, CultureInfo.InvariantCulture))
                    {
                        // Write the header
                        csvWriter.WriteField("Activity");
                        csvWriter.WriteField("Block");
                        csvWriter.NextRecord();

                        // Write the activities
                        foreach (var activity in activityDefinitions)
                        {
                            for (int i = 0; i < ActivityBlock.MaximumTimeSlots; i++)
                            {
                                // Name only on the first row.
                                csvWriter.WriteField((i == 0) ? activity.Name : " ");

                                // Block number.
                                csvWriter.WriteField(i);

                                // Find activity block in that time slot.
                                IActivityBlock activityBlock = activity.ScheduledBlocks
                                                               .FirstOrDefault(sb => sb.TimeSlot == i);
                                if (activityBlock != null)
                                {
                                    // Campers in the block
                                    foreach (var camper in activityBlock.AssignedCampers)
                                    {
                                        csvWriter.WriteField($"\"{camper}\"");
                                    }
                                }
                                csvWriter.NextRecord();
                            }
                        }
                    }
                    return(outTextWriter.ToString());
                }
            }
            catch (Exception e)
            {
                logger.LogError($"Exception writing activity schedule: {e.Message}");
                return(string.Empty);
            }
        }
        /// <summary>
        /// Try to create a block in the specified slot.
        /// </summary>
        /// <param name="slotNumber">Time slot to create the block in</param>
        /// <returns>Activity block if it could be created. Otherwise null.</returns>
        private IActivityBlock TryCreateBlock(int slotNumber)
        {
            IActivityBlock createdBlock = null;

            if (_isAvailableBlocks[slotNumber])
            {
                createdBlock = new ActivityBlock()
                {
                    TimeSlot           = slotNumber,
                    ActivityDefinition = this
                };
                _scheduledBlocks.Add(createdBlock);
                _isAvailableBlocks[slotNumber] = false;
            }
            return(createdBlock);
        }
        public void ReadScheduleFromCsvFile_MultipleActivitiesAndCampers_ScheduledLoaded()
        {
            // Act
            var activityDefinitions = ActivityDefinition.ReadScheduleFromCsvFile(GoodScheduleCsvFileLocation, _logger);

            // Assert
            Assert.IsNotNull(activityDefinitions, "Activity Definitions");
            Assert.AreEqual(9, activityDefinitions.Count, "Number of activities");
            ActivityDefinition checkActivityDefinition = activityDefinitions[8];

            Assert.AreEqual(4, checkActivityDefinition.ScheduledBlocks.Count,
                            $"Number of blocks in {checkActivityDefinition.Name}");
            IActivityBlock checkActivityBlock = checkActivityDefinition.ScheduledBlocks[3];

            Assert.That(checkActivityBlock.AssignedCampers.Count, Is.GreaterThan(0),
                        $"Number of campers in {checkActivityDefinition.Name}, block {checkActivityBlock.TimeSlot}");
        }