public void SetScrumMaster_ScrumMasterIsAlreadySet_InvalidOperationException() { // Arrange var name = "test"; var target = new ScrumTeam("test team"); target.SetScrumMaster("master"); // Act var result = target.SetScrumMaster(name); }
public void EstimationParticipants_MemberEstimated_MemberEstimatedButNotScrumMaster() { // Arrange var target = new ScrumTeam("test team"); var master = target.SetScrumMaster("master"); var member = target.Join("member", false); master.StartEstimation(); // Act var result = target.EstimationParticipants; // Verify Assert.IsNotNull(result); Assert.AreEqual <int>(2, result.Count()); var masterParticipant = result.First(p => p.MemberName == master.Name); Assert.IsNotNull(masterParticipant); Assert.IsFalse(masterParticipant.Estimated); var memberParticipant = result.First(p => p.MemberName == member.Name); Assert.IsNotNull(memberParticipant); Assert.IsFalse(memberParticipant.Estimated); }
public void DisconnectInactiveObservers_EstimationStartedActiveScrumMasterInactiveMember_ScrumMasterGetsEstimationResult() { // Arrange var dateTimeProvider = new DateTimeProviderMock(); dateTimeProvider.SetUtcNow(new DateTime(2012, 1, 1, 3, 2, 20)); var target = new ScrumTeam("test team", dateTimeProvider); var master = target.SetScrumMaster("master"); var member = (Member)target.Join("member", false); master.StartEstimation(); dateTimeProvider.SetUtcNow(new DateTime(2012, 1, 1, 3, 2, 30)); master.Estimation = new Estimation(); master.UpdateActivity(); dateTimeProvider.SetUtcNow(new DateTime(2012, 1, 1, 3, 2, 55)); TestHelper.ClearMessages(master); // Act target.DisconnectInactiveObservers(TimeSpan.FromSeconds(30.0)); // Verify Assert.AreEqual <TeamState>(TeamState.EstimationFinished, target.State); Assert.IsNotNull(target.EstimationResult); Assert.IsTrue(master.HasMessage); master.PopMessage(); Assert.IsTrue(master.HasMessage); var message = master.PopMessage(); Assert.AreEqual <MessageType>(MessageType.EstimationEnded, message.MessageType); }
public void Estimation_SetOnAllMembers_EstimationResultIsGeneratedForScrumTeam() { // Arrange var team = new ScrumTeam("test team"); var master = team.SetScrumMaster("master"); var member = (Member)team.Join("member", false); master.StartEstimation(); MessageReceivedEventArgs eventArgs = null; team.MessageReceived += new EventHandler <MessageReceivedEventArgs>((s, e) => eventArgs = e); var masterEstimation = new Estimation(); var memberEstimation = new Estimation(); // Act master.Estimation = masterEstimation; member.Estimation = memberEstimation; // Verify Assert.IsNotNull(eventArgs); var message = eventArgs.Message; Assert.IsInstanceOfType(message, typeof(EstimationResultMessage)); var estimationResultMessage = (EstimationResultMessage)message; Assert.AreEqual <EstimationResult>(team.EstimationResult, estimationResultMessage.EstimationResult); }
public void Estimation_SetOnAllMembers_EstimationResultIsGeneratedForMember() { // Arrange var team = new ScrumTeam("test team"); var master = team.SetScrumMaster("master"); var member = (Member)team.Join("member", false); master.StartEstimation(); var masterEstimation = new Estimation(1); var memberEstimation = new Estimation(1); // Act master.Estimation = masterEstimation; member.ClearMessages(); member.Estimation = memberEstimation; // Verify Assert.IsTrue(member.HasMessage); Assert.AreEqual(2, member.Messages.Count()); var message = member.Messages.Last(); Assert.IsInstanceOfType(message, typeof(EstimationResultMessage)); var estimationResultMessage = (EstimationResultMessage)message; Assert.AreEqual <EstimationResult>(team.EstimationResult, estimationResultMessage.EstimationResult); }
private static ScrumTeam CreateBasicTeam() { var result = new ScrumTeam(TeamName); result.SetScrumMaster(ScrumMasterName); return(result); }
/// <summary> /// Creates new Scrum team with specified Scrum master. /// </summary> /// <param name="teamName">Name of the team.</param> /// <param name="scrumMasterName">Name of the Scrum master.</param> /// <param name="deck">Selected deck of estimation cards to use in the team.</param> /// <returns> /// The new Scrum team. /// </returns> public IScrumTeamLock CreateScrumTeam(string teamName, string scrumMasterName, Deck deck) { if (string.IsNullOrEmpty(teamName)) { throw new ArgumentNullException(nameof(teamName)); } if (string.IsNullOrEmpty(scrumMasterName)) { throw new ArgumentNullException(nameof(scrumMasterName)); } OnBeforeCreateScrumTeam(teamName, scrumMasterName); var availableEstimations = _deckProvider.GetDeck(deck); var team = new ScrumTeam(teamName, availableEstimations, DateTimeProvider, GuidProvider); team.SetScrumMaster(scrumMasterName); var teamLock = new object(); var teamTuple = new Tuple <ScrumTeam, object>(team, teamLock); // loads team from repository and adds it to in-memory collection LoadScrumTeam(teamName); if (!_scrumTeams.TryAdd(teamName, teamTuple)) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Resources.Error_ScrumTeamAlreadyExists, teamName), nameof(teamName)); } OnTeamAdded(team); _logger.LogInformation(Resources.Info_ScrumTeamCreated, team.Name, team.ScrumMaster.Name); return(new ScrumTeamLock(teamTuple.Item1, teamTuple.Item2)); }
public void CreateScrumTeam_ExpiredTeamInRepository_CreatesNewTeamAndDeletesOldOne() { // Arrange var timeProvider = new DateTimeProviderMock(); var configuration = new Mock <IPlanningPokerConfiguration>(MockBehavior.Strict); configuration.SetupGet(c => c.ClientInactivityTimeout).Returns(TimeSpan.FromMinutes(15)); timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 0, 0, DateTimeKind.Utc)); var availableEstimations = DeckProvider.Default.GetDefaultDeck(); var team = new ScrumTeam("team", availableEstimations, timeProvider, null); var master = team.SetScrumMaster("master"); master.UpdateActivity(); var repository = new Mock <IScrumTeamRepository>(MockBehavior.Strict); repository.Setup(r => r.LoadScrumTeam("team")).Returns(team); repository.Setup(r => r.DeleteScrumTeam("team")); timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 16, 0, DateTimeKind.Utc)); var target = CreatePlanningPokerController(timeProvider, configuration.Object, repository.Object); // Act using (var teamLock = target.CreateScrumTeam("team", "master", Deck.Standard)) { // Verify Assert.AreNotEqual <ScrumTeam>(team, teamLock.Team); repository.Verify(r => r.LoadScrumTeam("team"), Times.Once()); repository.Verify(r => r.DeleteScrumTeam("team"), Times.Once()); } }
public void Disconnect_EstimationStarted_OnlyScrumMasterIsInEstimationResult() { // Arrange var target = new ScrumTeam("test team"); var master = target.SetScrumMaster("master"); var member = (Member)target.Join("member", false); master.StartEstimation(); var masterEstimation = new Estimation(); // Act target.Disconnect(member.Name); master.Estimation = masterEstimation; // Verify Assert.AreEqual <TeamState>(TeamState.EstimationFinished, target.State); Assert.IsNotNull(target.EstimationResult); var expectedResult = new KeyValuePair <Member, Estimation>[] { new KeyValuePair <Member, Estimation>(master, masterEstimation), new KeyValuePair <Member, Estimation>(member, null) }; CollectionAssert.AreEquivalent(expectedResult, target.EstimationResult.ToList()); }
public void Estimation_SetOnAllMembers_EstimationResultIsGenerated() { // Arrange var team = new ScrumTeam("test team"); var master = team.SetScrumMaster("master"); var member = (Member)team.Join("member", false); master.StartEstimation(); var masterEstimation = new Estimation(); var memberEstimation = new Estimation(); // Act master.Estimation = masterEstimation; member.Estimation = memberEstimation; // Verify Assert.IsNotNull(team.EstimationResult); var expectedResult = new KeyValuePair <Member, Estimation>[] { new KeyValuePair <Member, Estimation>(master, masterEstimation), new KeyValuePair <Member, Estimation>(member, memberEstimation), }; CollectionAssert.AreEquivalent(expectedResult, team.EstimationResult.ToList()); }
public void GetScrumTeam_ExpiredTeamInRepository_ThrowsException() { // Arrange var timeProvider = new DateTimeProviderMock(); var configuration = new Mock <IPlanningPokerConfiguration>(MockBehavior.Strict); configuration.SetupGet(c => c.ClientInactivityTimeout).Returns(TimeSpan.FromMinutes(15)); timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 0, 0, DateTimeKind.Utc)); var team = new ScrumTeam("team", timeProvider); var master = team.SetScrumMaster("master"); master.UpdateActivity(); var repository = new Mock <IScrumTeamRepository>(MockBehavior.Strict); repository.Setup(r => r.LoadScrumTeam("team")).Returns(team); repository.Setup(r => r.DeleteScrumTeam("team")); timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 16, 0, DateTimeKind.Utc)); var target = CreatePlanningPokerController(timeProvider, configuration.Object, repository.Object); // Act target.GetScrumTeam("team"); }
public void SerializeAndDeserialize_ReceivedMessages_MessageHasNextId() { // Arrange var team = new ScrumTeam("test"); var master = team.SetScrumMaster("master"); team.Join("member", false); team.Join("observer", true); master.StartEstimation(); var lastMessage = master.Messages.Last(); master.ClearMessages(); // Act var result = VerifySerialization(team); // Verify var member = (Member)result.FindMemberOrObserver("member"); member.Estimation = result.AvailableEstimations.First(e => e.Value == 5); Assert.IsTrue(result.ScrumMaster.HasMessage); var message = result.ScrumMaster.Messages.First(); Assert.AreEqual(lastMessage.Id + 1, message.Id); }
public void Estimation_SetOnAllMembers_EstimationResultIsGeneratedForObserver() { // Arrange var team = new ScrumTeam("test team"); var master = team.SetScrumMaster("master"); var member = (Member)team.Join("member", false); var observer = team.Join("observer", true); master.StartEstimation(); var masterEstimation = new Estimation(); var memberEstimation = new Estimation(); // Act master.Estimation = masterEstimation; TestHelper.ClearMessages(observer); member.Estimation = memberEstimation; // Verify observer.PopMessage(); var message = observer.PopMessage(); Assert.IsInstanceOfType(message, typeof(EstimationResultMessage)); var estimationResultMessage = (EstimationResultMessage)message; Assert.AreEqual <EstimationResult>(team.EstimationResult, estimationResultMessage.EstimationResult); }
public void Estimation_SetOnMemberOnly_ObserverGetsMemberEstimatedMessage() { // Arrange var team = new ScrumTeam("test team"); var master = team.SetScrumMaster("master"); var member = (Member)team.Join("member", false); var observer = team.Join("observer", true); master.StartEstimation(); TestHelper.ClearMessages(observer); var memberEstimation = new Estimation(); // Act member.Estimation = memberEstimation; // Verify Assert.IsTrue(observer.HasMessage); var message = observer.PopMessage(); Assert.AreEqual <MessageType>(MessageType.MemberEstimated, message.MessageType); Assert.IsInstanceOfType(message, typeof(MemberMessage)); var memberMessage = (MemberMessage)message; Assert.AreEqual <Observer>(member, memberMessage.Member); }
/// <summary> /// Creates new Scrum team with specified Scrum master. /// </summary> /// <param name="teamName">Name of the team.</param> /// <param name="scrumMasterName">Name of the Scrum master.</param> /// <returns> /// The new Scrum team. /// </returns> public IScrumTeamLock CreateScrumTeam(string teamName, string scrumMasterName) { if (string.IsNullOrEmpty(teamName)) { throw new ArgumentNullException("teamName"); } if (string.IsNullOrEmpty(scrumMasterName)) { throw new ArgumentNullException("scrumMasterName"); } this.OnBeforeCreateScrumTeam(teamName, scrumMasterName); var team = new ScrumTeam(teamName, this.DateTimeProvider); team.SetScrumMaster(scrumMasterName); var teamLock = new object(); var teamTuple = new Tuple<ScrumTeam, object>(team, teamLock); // loads team from repository and adds it to in-memory collection this.LoadScrumTeam(teamName); if (!this.scrumTeams.TryAdd(teamName, teamTuple)) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Properties.Resources.Error_ScrumTeamAlreadyExists, teamName), "teamName"); } this.OnTeamAdded(team); return new ScrumTeamLock(teamTuple.Item1, teamTuple.Item2); }
public void Estimation_SetOnAllMembers_ObserverGetEstimationEndedMessage() { // Arrange var team = new ScrumTeam("test team"); var master = team.SetScrumMaster("master"); var member = (Member)team.Join("member", false); var observer = team.Join("observer", true); master.StartEstimation(); var masterEstimation = new Estimation(); var memberEstimation = new Estimation(); // Act master.Estimation = masterEstimation; TestHelper.ClearMessages(observer); member.Estimation = memberEstimation; // Verify Assert.IsTrue(observer.HasMessage); observer.PopMessage(); Assert.IsTrue(observer.HasMessage); var message = observer.PopMessage(); Assert.IsNotNull(message); Assert.AreEqual <MessageType>(MessageType.EstimationEnded, message.MessageType); Assert.IsFalse(observer.HasMessage); }
public void GetScrumTeam_TeamAlreadyLoaded_NotLoadingAgain() { // Arrange var timeProvider = new DateTimeProviderMock(); var configuration = new Mock <IPlanningPokerConfiguration>(MockBehavior.Strict); configuration.SetupGet(c => c.ClientInactivityTimeout).Returns(TimeSpan.FromMinutes(15)); timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 0, 0, DateTimeKind.Utc)); var team = new ScrumTeam("team"); var master = team.SetScrumMaster("master"); master.UpdateActivity(); var repository = new Mock <IScrumTeamRepository>(MockBehavior.Strict); repository.Setup(r => r.LoadScrumTeam("team")).Returns(team); timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 14, 0, DateTimeKind.Utc)); var target = CreatePlanningPokerController(timeProvider, configuration.Object, repository.Object); // Act using (target.GetScrumTeam("team")) { } using (var teamLock = target.GetScrumTeam("team")) { // Verify Assert.AreEqual <ScrumTeam>(team, teamLock.Team); repository.Verify(r => r.LoadScrumTeam("team"), Times.Once()); repository.Verify(r => r.DeleteScrumTeam("team"), Times.Never()); } }
public void DisconnectInactiveObservers_ActiveObserverAndInactiveMember_ObserverMessageReceived() { // Arrange var dateTimeProvider = new DateTimeProviderMock(); dateTimeProvider.SetUtcNow(new DateTime(2012, 1, 1, 3, 2, 20)); var target = new ScrumTeam("test team", dateTimeProvider); var master = target.SetScrumMaster("master"); var member = target.Join("member", false); dateTimeProvider.SetUtcNow(new DateTime(2012, 1, 1, 3, 2, 30)); var observer = target.Join("observer", true); EventArgs eventArgs = null; observer.MessageReceived += new EventHandler((s, e) => eventArgs = e); dateTimeProvider.SetUtcNow(new DateTime(2012, 1, 1, 3, 2, 55)); // Act target.DisconnectInactiveObservers(TimeSpan.FromSeconds(30.0)); // Verify Assert.IsNotNull(eventArgs); Assert.IsTrue(observer.HasMessage); var message = observer.PopMessage(); Assert.AreEqual <MessageType>(MessageType.MemberDisconnected, message.MessageType); }
public void Estimation_SetOnAllMembers_ScrumTeamGetEstimationEndedMessage() { // Arrange var team = new ScrumTeam("test team"); var master = team.SetScrumMaster("master"); var member = (Member)team.Join("member", false); master.StartEstimation(); MessageReceivedEventArgs eventArgs = null; team.MessageReceived += new EventHandler <MessageReceivedEventArgs>((s, e) => eventArgs = e); var masterEstimation = new Estimation(); var memberEstimation = new Estimation(); // Act master.Estimation = masterEstimation; member.Estimation = memberEstimation; // Verify Assert.IsNotNull(eventArgs); var message = eventArgs.Message; Assert.IsNotNull(message); Assert.AreEqual <MessageType>(MessageType.EstimationEnded, message.MessageType); }
public void CreateScrumTeam_TeamInRepository_DoesNotDeleteOldTeam() { // Arrange var timeProvider = new DateTimeProviderMock(); var configuration = new Mock <IPlanningPokerConfiguration>(MockBehavior.Strict); configuration.SetupGet(c => c.ClientInactivityTimeout).Returns(TimeSpan.FromMinutes(15)); timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 0, 0, DateTimeKind.Utc)); var team = new ScrumTeam("team"); var master = team.SetScrumMaster("master"); master.UpdateActivity(); var repository = new Mock <IScrumTeamRepository>(MockBehavior.Strict); repository.Setup(r => r.LoadScrumTeam("team")).Returns(team); timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 14, 0, DateTimeKind.Utc)); var target = CreatePlanningPokerController(timeProvider, configuration.Object, repository.Object); // Act try { target.CreateScrumTeam("team", "master"); } catch (ArgumentException) { // expected exception when adding same team } // Verify repository.Verify(r => r.LoadScrumTeam("team"), Times.Once()); repository.Verify(r => r.DeleteScrumTeam("team"), Times.Never()); }
public void AttachScrumTeam_TeamInRepository_DoesNotCreateNewTeam() { // Arrange var timeProvider = new DateTimeProviderMock(); var configuration = new Mock <IPlanningPokerConfiguration>(MockBehavior.Strict); configuration.SetupGet(c => c.ClientInactivityTimeout).Returns(TimeSpan.FromMinutes(15)); timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 0, 0, DateTimeKind.Utc)); var team = new ScrumTeam("team"); var master = team.SetScrumMaster("master"); master.UpdateActivity(); var repository = new Mock <IScrumTeamRepository>(MockBehavior.Strict); repository.Setup(r => r.LoadScrumTeam("team")).Returns(team); timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 14, 0, DateTimeKind.Utc)); var target = CreatePlanningPokerController(timeProvider, configuration.Object, repository.Object); var inputTeam = new ScrumTeam("team"); // Act Assert.ThrowsException <ArgumentException>(() => target.AttachScrumTeam(inputTeam)); }
public void GetScrumTeam_TeamCreatedWhileLoading_DoesNotCreateNewTeam() { // Arrange var timeProvider = new DateTimeProviderMock(); var configuration = new Mock <IPlanningPokerConfiguration>(MockBehavior.Strict); configuration.SetupGet(c => c.ClientInactivityTimeout).Returns(TimeSpan.FromMinutes(15)); timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 0, 0, DateTimeKind.Utc)); var team = new ScrumTeam("team"); var master = team.SetScrumMaster("master"); master.UpdateActivity(); bool firstLoad = true; bool firstReturn = true; PlanningPokerController target = null; ScrumTeam createdTeam = null; var repository = new Mock <IScrumTeamRepository>(MockBehavior.Strict); repository.Setup(r => r.LoadScrumTeam("team")) .Callback <string>(n => { if (firstLoad) { firstLoad = false; using (var teamLock = target.CreateScrumTeam("team", "master")) { createdTeam = teamLock.Team; } } }).Returns <string>(n => { if (firstReturn) { firstReturn = false; return(null); } else { return(team); } }); target = CreatePlanningPokerController(timeProvider, configuration.Object, repository.Object); // Act using (var teamLock = target.GetScrumTeam("team")) { // Verify Assert.AreNotEqual <ScrumTeam>(team, createdTeam); Assert.AreNotEqual <ScrumTeam>(team, teamLock.Team); Assert.AreEqual <ScrumTeam>(createdTeam, teamLock.Team); repository.Verify(r => r.LoadScrumTeam("team"), Times.Exactly(2)); repository.Verify(r => r.DeleteScrumTeam("team"), Times.Never()); } }
public void SetScrumMaster_NameIsEmpty_ArgumentNullException() { // Arrange var name = string.Empty; var target = new ScrumTeam("test team"); // Act var result = target.SetScrumMaster(name); }
public void CreateScrumTeam_TeamCreatedWhileLoading_DoesNotCreateNewTeam() { // Arrange var timeProvider = new DateTimeProviderMock(); var configuration = new Mock <IPlanningPokerConfiguration>(MockBehavior.Strict); configuration.SetupGet(c => c.ClientInactivityTimeout).Returns(TimeSpan.FromMinutes(15)); timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 0, 0, DateTimeKind.Utc)); var team = new ScrumTeam("team"); var master = team.SetScrumMaster("master"); master.UpdateActivity(); bool firstLoad = true; bool firstReturn = true; PlanningPokerController target = null; var repository = new Mock <IScrumTeamRepository>(MockBehavior.Strict); repository.Setup(r => r.LoadScrumTeam("team")) .Callback <string>(n => { if (firstLoad) { firstLoad = false; try { using (var teamLock = target.CreateScrumTeam("team", "master", Deck.Standard)) { Assert.AreNotEqual <ScrumTeam>(team, teamLock.Team); } } catch (ArgumentException) { // if ArgumentException is here, test should fail } } }).Returns <string>(n => { if (firstReturn) { firstReturn = false; return(null); } else { return(team); } }); target = CreatePlanningPokerController(timeProvider, configuration.Object, repository.Object); // Act Assert.ThrowsException <ArgumentException>(() => target.CreateScrumTeam("team", "master", Deck.Standard)); }
private static ScrumTeam CreateScrumTeam(string name = "The team") { var team = new ScrumTeam(name); team.SetScrumMaster("master"); team.Join("member", false); team.ScrumMaster.StartEstimation(); team.ScrumMaster.Estimation = team.AvailableEstimations.First(e => e.Value == 5); return(team); }
public void Constructor_DuplicateMember_InvalidOperationException() { // Arrange var team = new ScrumTeam("test team"); var master = team.SetScrumMaster("master"); var member = (Member)team.Join("member", false); // Act var result = new EstimationResult(new Member[] { master, member, master }); }
public void IndexerGet_MemberNotInResult_KeyNotFoundException() { // Arrange var team = new ScrumTeam("test team"); var master = team.SetScrumMaster("master"); var member = (Member)team.Join("member", false); var target = new EstimationResult(new Member[] { master }); // Act var estimation = target[member]; }
public void SetScrumMaster_ObserverWithSpecifiedNameExists_ArgumentException() { // Arrange var name = "test"; var target = new ScrumTeam("test team"); target.Join("test", true); // Act var result = target.SetScrumMaster(name); }
public void SerializeAndDeserialize_WithoutAvailableEstimations_CopyOfTheTeam() { // Arrange var team = new ScrumTeam("test"); team.SetScrumMaster("master"); // Act // Verify VerifySerialization(team, removeAvailableEstimations: true); }
public void SerializeAndDeserialize_TeamWithScrumMaster_CopyOfTheTeam() { // Arrange var team = new ScrumTeam("test"); team.SetScrumMaster("master"); // Act // Verify VerifySerialization(team); }