public void Adding_Developer_Should_Throw_NotSupportedException_In_FinishedState() { // Arrange Project project = new Project("Test Project", new Person("Bas", ERole.Lead)); SprintFactory factory = new SprintFactory(); Person p1 = new Person("Tom", ERole.Developer); Person p2 = new Person("Jan Peter", ERole.Tester); Person p3 = new Person("Dick Bruna", ERole.Developer); ISprint sprint = factory.MakeReviewSprint("Sprint 1", DateTime.Parse("2010-10-10T00:00:00Z"), DateTime.Parse("2010-10-10T00:00:00Z").AddDays(14), project, p1, new List <Person>() { p2 }); project.AddSprint(sprint); sprint.GetState().ToNextState(); sprint.GetState().ToNextState(); // Act // Assert Assert.Throws <NotSupportedException>(() => project.GetSprints().First().GetState().AddDeveloper(p3)); Assert.DoesNotContain(p3, sprint.GetDevelopers()); }
public void Set_Review_Should_Throw_SecurityException_In_FinishedState_When_Added_By_Someone_Else_But_ScrumMaster() { // Arrange Project project = new Project("Test Project", new Person("Bas", ERole.Lead)); SprintFactory factory = new SprintFactory(); Person p1 = new Person("Tom", ERole.Developer); Person p2 = new Person("Jan Peter", ERole.Tester); ISprint sprint = factory.MakeReviewSprint("Sprint 1", DateTime.Now, DateTime.Now.AddDays(14), project, p1, new List <Person>() { p2 }); project.AddSprint(sprint); sprint.GetState().ToNextState(); sprint.GetState().ToNextState(); Review review = new Review(sprint, p2, "Good work guys!"); // Act // Assert Assert.Throws <SecurityException>(() => project.GetSprints().First().GetState().SetReview(review)); }
public void Adding_Developer_Should_Not_Throw_Exception_In_ActiveState() { // Arrange Project project = new Project("Test Project", new Person("Bas", ERole.Lead)); SprintFactory factory = new SprintFactory(); Person p1 = new Person("Tom", ERole.Developer); Person p2 = new Person("Jan Peter", ERole.Tester); Person p3 = new Person("Dick Bruna", ERole.Developer); ISprint sprint = factory.MakeReleaseSprint("Sprint 1", DateTime.Parse("2010-10-10T00:00:00Z"), DateTime.Parse("2010-10-10T00:00:00Z").AddDays(14), project, p1, new List <Person>() { p2 }); project.AddSprint(sprint); sprint.GetState().ToNextState(); // Act sprint.GetState().AddDeveloper(p3); // Assert Assert.Contains(p3, sprint.GetDevelopers()); }
public void Changing_To_Previous_State_Should_Not_Throw_Exception_In_ActiveState() { // Arrange Project project = new Project("Test Project", new Person("Bas", ERole.Lead)); SprintFactory factory = new SprintFactory(); Person p1 = new Person("Tom", ERole.Developer); Person p2 = new Person("Jan Peter", ERole.Tester); ISprint sprint = factory.MakeReleaseSprint("Sprint 1", DateTime.Now, DateTime.Now.AddDays(14), project, p1, new List <Person>() { p2 }); project.AddSprint(sprint); sprint.GetState().ToNextState(); // Act project.GetSprints().First().GetState().ToPreviousState(); // Assert Assert.Equal("InitializedState", project.GetSprints().First().GetState().GetType().Name); }
public bool Finish(ISprint model) { try { var sprint = _mapper.Map <Sprint>(model as SprintViewModel); sprint.IsFinished = true; sprint.FinishedOn = DateTime.UtcNow; var nonFinishedTasks = _dbContext.Tasks .Where(x => x.SprintId == sprint.Id && !x.IsFinished) .ToList(); var backlogTasks = _mapper .Map <List <BacklogTask> >(nonFinishedTasks); _dbContext.Sprints.Update(sprint); _dbContext.BacklogTasks.AddRange(backlogTasks); _dbContext.Tasks.RemoveRange(nonFinishedTasks); _dbContext.SaveChanges(); return(true); } catch (Exception ex) { return(false); } }
public IGraphModel Make(ISprint sprint) { // タスクを抽出 var tasks = sprint.Tasks.OfType<ITaskWithRecord>().ToArray(); // 無かったら空っぽを返す if (tasks.Any()==false) { return new GraphModel(); } // まずは期間を確定させる。 // 未設定の場合は登録されているメモやレコードから推測する var records = tasks.SelectMany(x => x.Records).ToArray(); var comments = tasks.SelectMany(x => x.Comments).ToArray(); var pvList = MakePv(sprint, tasks, records, comments); var evList = records.Select(x => new GraphPoint { Day = x.Day, Value = x.Value }).ToArray(); var acList = records.Select(x => new GraphPoint { Day = x.Day, Value = x.WorkValue }).ToArray(); // 期間未定はPVを計れないので実績に合わせる if (pvList.Any() == false) { pvList = evList.ToArray(); } return new GraphModel { Pv = pvList, Ac = acList, Ev = evList, }; }
private string ToText(ISprint model) { return (string.Format(@"# {0} {1} {2} {3}" , model.Id.ToString("[00]") , model.Name , model.Left.HasValue ? model.Left.Value.ToString("@yyyy/MM/dd") : "" , model.Right.HasValue ? model.Right.Value.ToString("@yyyy/MM/dd") : "")); }
public static Report BuildAvansPlusReport(ISprint sprint, List <string> contents, string reportVersion, DateTime date, EReportFormat format) { IReportBuilder builder = new AvansPlusReportBuilder(); builder.BuildContent(contents); builder.BuildFooter(); builder.BuildHeader(sprint, reportVersion, date); return(builder.GetReport(format)); }
public static HourInfoList HourFetchInfoList(ISprint sprint) { return(HourInfoList.FetchHourInfoList( new HourDataCriteria { ProjectId = new[] { sprint.ProjectId }, SprintId = sprint.SprintId })); }
public static HourInfoList HourFetchInfoList(ISprint sprint) { return HourInfoList.FetchHourInfoList( new HourDataCriteria { ProjectId = new[] { sprint.ProjectId }, SprintId = sprint.SprintId }); }
public void Notification_Todo_State_Update() { // Arrange Project project = new Project("Test Project", new Person("Bas", ERole.Lead)); SprintFactory factory = new SprintFactory(); ChannelFactory channel = new ChannelFactory(); Person p1 = new Person("Tom", ERole.Developer); Person p2 = new Person("Jan Roos", ERole.Developer); p1.AddChannel(channel.CreateSlackChannel("@tom")); ISprint sprint = factory.MakeReleaseSprint("Sprint 1", DateTime.Now, DateTime.Now.AddDays(14), project, p1, new List <Person>() { p2 }); project.AddSprint(sprint); var backlog = new Backlog(project); var backlogItem = new BacklogItem("User can login into the platform", "Foo", p2, 3, backlog); backlogItem.AssignPerson(p2); backlog.AddBacklogItem(backlogItem); sprint.AddToSprintBacklog(backlogItem); project.AddBacklog(backlog); var task1 = new Task("Bar", p1); backlogItem.GetState().AddTask(task1); var backlogItemObserver = new BacklogItemObserver(); // Act backlogItem.Register(backlogItemObserver); backlogItem.GetState().NextState(); // Backlog is in DoingState, set tasks backlogItem.GetTasks().First().NextState(); backlogItem.GetTasks().First().NextState(); task1.NextState(); task1.NextState(); backlogItem.GetState().NextState(); backlogItem.GetState().NextState(); // Backlog is in TestingState backlogItem.GetState().NextState(); // Assert Assert.NotEmpty(backlogItem.GetObservers()); }
private void ToSprintGraph(ISprint model) { eventAgg.GetEvent <NavigateInProjectViewEvent>() .Publish(ViewNames.PROJECT_IN_SPRINT_REPORT , new NavigateParams { { "ProjectId", this.Project.Id }, { "SprintIds", new [] { model.Id } } }); }
public static DbSprint ToDbModel(this ISprint @this) { return(new DbSprint { Id = @this.Id, Name = @this.Name, Left = @this.Left, Right = @this.Right, }); }
public static StoryInfoList StoryFetchInfoList(ISprint sprint) { ProjectUserRepository.AuthorizeProjectUser(sprint.ProjectId); return(StoryInfoList.FetchStoryInfoList( new StoryDataCriteria { ProjectId = new[] { sprint.ProjectId }, SprintId = sprint.SprintId })); }
public void BuildHeader(ISprint sprint, string reportVersion, DateTime date) { this._report.Header = new Header() { CompanyColor = "#d1ecbb", CompanyName = "Avans+", CompanyLogoURL = "https://avansplus.nl/logo.png", Date = date, ReportVersion = reportVersion, SprintName = sprint.GetName() }; }
public bool Update(ISprint model) { try { var sprint = _mapper.Map <Sprint>(model as SprintViewModel); _dbContext.Sprints.Update(sprint); _dbContext.SaveChanges(); return(true); } catch (Exception ex) { return(false); } }
public bool Add(ISprint model) { try { var sprint = _mapper.Map <Sprint>(model as SprintViewModel); sprint.Id = Guid.NewGuid(); _dbContext.Sprints.Add(sprint); _dbContext.SaveChanges(); return(true); } catch (Exception ex) { return(false); } }
private IEnumerable <IGraphPoint> MakePv(ISprint sprint, ITaskWithRecord[] tasks, ITaskRecord[] records, ITaskComment[] comments) { // 期間未定はPVを計れない if ((sprint.Left.HasValue && sprint.Right.HasValue) == false) { return(Enumerable.Empty <IGraphPoint>()); } var dateList = records.Select(x => x.Day).Concat(comments.Select(x => x.Day)).ToArray(); var left = sprint.Left ?? (dateList.Any() ? dateList.Min() : DateTime.Now); var right = sprint.Right ?? (dateList.Any() ? dateList.Max() : DateTime.Now); // 次にPV(計画) // 休日を除く日で総Valueを案分する var alldays = (from i in Enumerable.Range(0, (right - left).Days + 1) let day = left.AddDays(i) select day).ToArray(); var workDays = (from day in alldays where this.isWorkday(day) select day).ToArray(); // 稼働日が無い場合は先頭日に全部押し付ける if (workDays.Any() == false) { workDays = new[] { left }; } // 計画値の総量 var pvAll = tasks.Sum(x => x.Value ?? 0.0); // 1日あたりの量 var pvAve = pvAll / workDays.Length; var pvList = workDays.Select(x => new GraphPoint { Day = x, Value = pvAve }).ToArray(); var inHolidays = alldays.Select(x => new GraphPoint { Day = x, Value = 0.0 }).ToArray(); return(Merge(pvList, inHolidays)); }
public void Changing_SprintName_Should_Throw_NotSupportedException_In_ActiveState() { // Arrange Project project = new Project("Test Project", new Person("Bas", ERole.Lead)); SprintFactory factory = new SprintFactory(); Person p1 = new Person("Tom", ERole.Developer); Person p2 = new Person("Jan Peter", ERole.Tester); ISprint sprint = factory.MakeReleaseSprint("Sprint 1", DateTime.Now, DateTime.Now.AddDays(14), project, p1, new List <Person>() { p2 }); project.AddSprint(sprint); sprint.GetState().ToNextState(); // Act // Assert Assert.Throws <NotSupportedException>(() => project.GetSprints().First().GetState().SetName("Foo")); }
public void Backlog_Can_Register_Multiple_Observers() { // Arrange Project project = new Project("Test Project", new Person("Bas", ERole.Lead)); SprintFactory factory = new SprintFactory(); Person p1 = new Person("Tom", ERole.Developer); Person p2 = new Person("Jan Roos", ERole.Developer); ISprint sprint = factory.MakeReleaseSprint("Sprint 1", DateTime.Now, DateTime.Now.AddDays(14), project, p1, new List <Person>() { p2 }); project.AddSprint(sprint); var backlog = new Backlog(project); var backlogItem = new BacklogItem("User can login into the platform", "Foo", p2, 3, backlog); backlogItem.AssignPerson(p2); backlog.AddBacklogItem(backlogItem); sprint.AddToSprintBacklog(backlogItem); project.AddBacklog(backlog); var task1 = new Task("Bar", p1); backlogItem.GetState().AddTask(task1); var backlogItemObserver = new BacklogItemObserver(); // Act // TODO: Add sprint observer backlogItem.Register(backlogItemObserver); // Assert Assert.Single(backlogItem.GetObservers()); }
public void Changing_SprintName_Should_Not_Throw_Exception_In_InitializedState() { // Arrange Project project = new Project("Test Project", new Person("Bas", ERole.Lead)); SprintFactory factory = new SprintFactory(); Person p1 = new Person("Tom", ERole.Developer); Person p2 = new Person("Jan Peter", ERole.Tester); ISprint sprint = factory.MakeReviewSprint("Sprint 1", DateTime.Now, DateTime.Now.AddDays(14), project, p1, new List <Person>() { p2 }); project.AddSprint(sprint); // Act sprint.GetState().SetName("foo"); // Assert Assert.Equal("foo", project.GetSprints().First().GetName()); }
public IGraphModel Make(ISprint sprint) { // タスクを抽出 var tasks = sprint.Tasks.OfType <ITaskWithRecord>().ToArray(); // 無かったら空っぽを返す if (tasks.Any() == false) { return(new GraphModel()); } // まずは期間を確定させる。 // 未設定の場合は登録されているメモやレコードから推測する var records = tasks.SelectMany(x => x.Records).ToArray(); var comments = tasks.SelectMany(x => x.Comments).ToArray(); var pvList = MakePv(sprint, tasks, records, comments); var evList = records.Select(x => new GraphPoint { Day = x.Day, Value = x.Value }).ToArray(); var acList = records.Select(x => new GraphPoint { Day = x.Day, Value = x.WorkValue }).ToArray(); // 期間未定はPVを計れないので実績に合わせる if (pvList.Any() == false) { pvList = evList.ToArray(); } return(new GraphModel { Pv = pvList, Ac = acList, Ev = evList, }); }
public void Set_Review_Should_Throw_NotSupportedException_In_InitializedState() { // Arrange Project project = new Project("Test Project", new Person("Bas", ERole.Lead)); SprintFactory factory = new SprintFactory(); Person p1 = new Person("Tom", ERole.Developer); Person p2 = new Person("Jan Peter", ERole.Tester); ISprint sprint = factory.MakeReleaseSprint("Sprint 1", DateTime.Now, DateTime.Now.AddDays(14), project, p1, new List <Person>() { p2 }); project.AddSprint(sprint); Review review = new Review(sprint, p1, "No good"); // Act // Assert Assert.Throws <NotSupportedException>(() => project.GetSprints().First().GetState().SetReview(review)); }
public void Changing_EndDate_Should_Not_Throw_Exception_In_InitializedState() { // Arrange Project project = new Project("Test Project", new Person("Bas", ERole.Lead)); SprintFactory factory = new SprintFactory(); Person p1 = new Person("Tom", ERole.Developer); Person p2 = new Person("Jan Peter", ERole.Tester); ISprint sprint = factory.MakeReleaseSprint("Sprint 1", DateTime.Parse("2010-10-10T00:00:00Z"), DateTime.Parse("2010-10-10T00:00:00Z").AddDays(14), project, p1, new List <Person>() { p2 }); project.AddSprint(sprint); // Act sprint.GetState().SetEndDate(DateTime.Parse("2010-10-10T00:00:00Z").AddDays(7)); // Assert Assert.Equal(DateTime.Parse("2010-10-17T00:00:00Z"), project.GetSprints().First().GetEndDate()); }
public void TestPipeline_Should_Fire_When_ReviewSprint_Reaches_FinishedState() { // Arrange Project project = new Project("Test Project", new Person("Bas", ERole.Lead)); SprintFactory factory = new SprintFactory(); Person p1 = new Person("Tom", ERole.Developer); Person p2 = new Person("Jan Peter", ERole.Tester); ISprint sprint = factory.MakeReviewSprint("Sprint 1", DateTime.Now, DateTime.Now.AddDays(14), project, p1, new List <Person>() { p2 }); project.AddSprint(sprint); sprint.GetState().ToNextState(); sprint.GetState().ToNextState(); // Act sprint.GetState().StartStateAction(); // Assert }
public void AddSprint(ISprint sprint) { this._sprints.Add(sprint); }
private string ToText(ISprint model) { return string.Format(@"# {0} {1} {2} {3}" , model.Id.ToString("[00]") , model.Name , model.Left.HasValue ? model.Left.Value.ToString("@yyyy/MM/dd") : "" , model.Right.HasValue ? model.Right.Value.ToString("@yyyy/MM/dd") : ""); }
public InitializedState(ISprint sprint) { this._sprint = sprint; }
private IEnumerable<IGraphPoint> MakePv(ISprint sprint, ITaskWithRecord[] tasks, ITaskRecord[] records, ITaskComment[] comments) { // 期間未定はPVを計れない if ((sprint.Left.HasValue && sprint.Right.HasValue) == false) { return Enumerable.Empty<IGraphPoint>(); } var dateList = records.Select(x => x.Day).Concat(comments.Select(x => x.Day)).ToArray(); var left = sprint.Left ?? (dateList.Any() ? dateList.Min() : DateTime.Now); var right = sprint.Right ?? (dateList.Any() ? dateList.Max() : DateTime.Now); // 次にPV(計画) // 休日を除く日で総Valueを案分する var alldays = (from i in Enumerable.Range(0, (right - left).Days + 1) let day = left.AddDays(i) select day).ToArray(); var workDays = (from day in alldays where this.workdayService.IsWorkday(day) select day).ToArray(); // 稼働日が無い場合は先頭日に全部押し付ける if (workDays.Any() == false) { workDays = new[] { left }; } // 計画値の総量 var pvAll = tasks.Sum(x => x.Value ?? 0.0); // 1日あたりの量 var pvAve = pvAll / workDays.Length; var pvList = workDays.Select(x => new GraphPoint { Day = x, Value = pvAve }).ToArray(); var inHolidays = alldays.Select(x => new GraphPoint { Day = x, Value = 0.0 }).ToArray(); return Merge(pvList, inHolidays); }
public FinishedState(ISprint sprint) { this._sprint = sprint; }
public DevelopmentPipeline(ISprint sprint, EPipelineConfig config) { _sprint = sprint; _config = config; _state = new SourceState(this); }
public Review(ISprint sprint, Person author, string review) { this._sprint = sprint; this._author = author; this._review = review; }
public void Generating_A_Report_Should_Not_Throw_Exception() { // Arrange Project project = new Project("Test Project", new Person("Bas", ERole.Lead)); SprintFactory factory = new SprintFactory(); Person p1 = new Person("Tom", ERole.Developer); Person p2 = new Person("Jan Peter", ERole.Tester); ISprint sprint = factory.MakeReviewSprint("Sprint 1", DateTime.Now, DateTime.Now.AddDays(14), project, p1, new List <Person>() { p2 }); ISprint sprint2 = factory.MakeReleaseSprint("Sprint 2", DateTime.Now, DateTime.Now.AddDays(14), project, p1, new List <Person>() { p2 }); project.AddSprint(sprint); project.AddSprint(sprint2); // Act DateTime now = DateTime.Now; Report sprint1GeneratedAvansReport = sprint.GenerateReport(EReportBranding.Avans, new List <string>() { "Burndown chart: foo", "Velocity: 21" }, "v1.0", now, EReportFormat.PDF); Report sprint1GeneratedAvansPlusReport = sprint.GenerateReport(EReportBranding.AvansPlus, new List <string>() { "Burndown chart: bar", "Velocity: 13" }, "v2.0", now, EReportFormat.PNG); Report sprint2GeneratedAvansReport = sprint.GenerateReport(EReportBranding.Avans, new List <string>() { "Burndown chart: foo", "Velocity: 21" }, "v1.0", now, EReportFormat.PDF); Report sprint2GeneratedAvansPlusReport = sprint.GenerateReport(EReportBranding.AvansPlus, new List <string>() { "Burndown chart: bar", "Velocity: 13" }, "v2.0", now, EReportFormat.PNG); // Assert Assert.Equal(now, sprint1GeneratedAvansReport.Header.Date); Assert.Equal("Avans", sprint1GeneratedAvansReport.Header.CompanyName); Assert.Equal(new List <string>() { "Burndown chart: foo", "Velocity: 21" }, sprint1GeneratedAvansReport.Contents); Assert.Equal("v1.0", sprint1GeneratedAvansReport.Header.ReportVersion); Assert.Equal(EReportFormat.PDF, sprint1GeneratedAvansReport.Format); Assert.Equal(now, sprint1GeneratedAvansPlusReport.Header.Date); Assert.Equal("Avans+", sprint1GeneratedAvansPlusReport.Header.CompanyName); Assert.Equal(new List <string>() { "Burndown chart: bar", "Velocity: 13" }, sprint2GeneratedAvansPlusReport.Contents); Assert.Equal("v2.0", sprint1GeneratedAvansPlusReport.Header.ReportVersion); Assert.Equal(EReportFormat.PNG, sprint1GeneratedAvansPlusReport.Format); Assert.Equal(now, sprint2GeneratedAvansReport.Header.Date); Assert.Equal("Avans", sprint2GeneratedAvansReport.Header.CompanyName); Assert.Equal(new List <string>() { "Burndown chart: foo", "Velocity: 21" }, sprint2GeneratedAvansReport.Contents); Assert.Equal("v1.0", sprint2GeneratedAvansReport.Header.ReportVersion); Assert.Equal(EReportFormat.PDF, sprint1GeneratedAvansReport.Format); Assert.Equal(now, sprint2GeneratedAvansPlusReport.Header.Date); Assert.Equal("Avans+", sprint2GeneratedAvansPlusReport.Header.CompanyName); Assert.Equal(new List <string>() { "Burndown chart: bar", "Velocity: 13" }, sprint2GeneratedAvansPlusReport.Contents); Assert.Equal("v2.0", sprint2GeneratedAvansPlusReport.Header.ReportVersion); Assert.Equal(EReportFormat.PNG, sprint2GeneratedAvansPlusReport.Format); }
public static StoryInfoList StoryFetchInfoList(ISprint sprint) { ProjectUserRepository.AuthorizeProjectUser(sprint.ProjectId); return StoryInfoList.FetchStoryInfoList( new StoryDataCriteria { ProjectId = new[] { sprint.ProjectId }, SprintId = sprint.SprintId }); }
public ActiveState(ISprint sprint) { this._sprint = sprint; }
private void FillLine(Line line, ISprint sprint, Issue[] issues, IEnumerable<string> ignoreTypes) { var sprintStart = new DateTime(sprint.Start.Ticks, DateTimeKind.Local); issues = issues.Where(i => !ignoreTypes.Contains(i.Type)).ToArray(); var issueCount = issues.Count(i => i.Value.HasValue); var issueTotal = issues.Sum(i => i.Value != null ? i.Value.Value : 0); var averageValue = issueTotal/issueCount; issueTotal = issues.Sum(i => i.Value != null ? i.Value.Value : averageValue); line.AddPoint(issueTotal, sprintStart); var pointIssues = issues.Where(i => i.Timestamp.HasValue).OrderBy(i => i.Timestamp.Value); foreach (var pointIssue in pointIssues) { var value = pointIssue.Value.HasValue ? pointIssue.Value.Value : averageValue; var change = (float) (value*-1.0); var timestamp = pointIssue.Timestamp.Value; if (timestamp < sprintStart) timestamp = sprintStart; var point = line.AddPointByChange(change, timestamp); point.Label = pointIssue.Id; point.Description = pointIssue.Summary; point.Estimate = pointIssue.Value.HasValue ? (int) pointIssue.Value.Value : (int?) null; point.Url = "http://davidweekleyhomes.myjetbrains.com/youtrack/issue/" + pointIssue.Id; } }