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}"); }