コード例 #1
0
        public void execute_async_executes_each_exercise()
        {
            var action1 = new ActionMock(MockBehavior.Loose);
            var action2 = new ActionMock(MockBehavior.Loose);

            var sut = new ExerciseProgramBuilder()
                      .AddExercise(new ExerciseBuilder()
                                   .WithBeforeExerciseAction(action1))
                      .AddExercise(new ExerciseBuilder()
                                   .WithBeforeExerciseAction(action2))
                      .Build();

            using (var executionContext = new ExecutionContext())
            {
                sut.ExecuteAsync(executionContext);

                action1
                .Verify(x => x.ExecuteAsync(executionContext))
                .WasCalledExactlyOnce();

                action2
                .Verify(x => x.ExecuteAsync(executionContext))
                .WasCalledExactlyOnce();
            }
        }
コード例 #2
0
        public void execute_executes_each_exercise()
        {
            var action1 = new ActionMock(MockBehavior.Loose);
            var action2 = new ActionMock(MockBehavior.Loose);

            var sut = new ExerciseProgramBuilder()
                      .WithExercise(new ExerciseBuilder()
                                    .WithBeforeExerciseAction(action1))
                      .WithExercise(new ExerciseBuilder()
                                    .WithBeforeExerciseAction(action2))
                      .Build();
            var executionContext = new ExecutionContext();

            sut
            .Execute(executionContext)
            .Subscribe();

            action1
            .Verify(x => x.Execute(executionContext))
            .WasCalledExactlyOnce();

            action2
            .Verify(x => x.Execute(executionContext))
            .WasCalledExactlyOnce();
        }
コード例 #3
0
        public void execute_executes_each_child_action()
        {
            var action1 = new ActionMock(MockBehavior.Loose);
            var action2 = new ActionMock(MockBehavior.Loose);
            var action3 = new ActionMock(MockBehavior.Loose);
            var sut     = new SequenceActionBuilder()
                          .WithChild(action1)
                          .WithChild(action2)
                          .WithChild(action3)
                          .Build();

            using (var context = new ExecutionContext())
            {
                sut.Execute(context).Subscribe();

                action1
                .Verify(x => x.Execute(context))
                .WasCalledExactlyOnce();

                action2
                .Verify(x => x.Execute(context))
                .WasCalledExactlyOnce();

                action3
                .Verify(x => x.Execute(context))
                .WasCalledExactlyOnce();
            }
        }
コード例 #4
0
        public void execute_async_stops_executing_if_the_context_is_cancelled()
        {
            var action1 = new ActionMock(MockBehavior.Loose);
            var action2 = new ActionMock(MockBehavior.Loose);
            var action3 = new ActionMock(MockBehavior.Loose);
            var sut     = new SequenceActionBuilder()
                          .AddChild(action1)
                          .AddChild(action2)
                          .AddChild(action3)
                          .Build();

            using (var context = new ExecutionContext())
            {
                action2
                .When(x => x.ExecuteAsync(It.IsAny <ExecutionContext>()))
                .Do(() => context.Cancel())
                .Return(Observable.Return(Unit.Default));

                Assert.ThrowsAsync <OperationCanceledException>(async() => await sut.ExecuteAsync(context));

                action1
                .Verify(x => x.ExecuteAsync(context))
                .WasCalledExactlyOnce();

                action2
                .Verify(x => x.ExecuteAsync(context))
                .WasCalledExactlyOnce();

                action3
                .Verify(x => x.ExecuteAsync(context))
                .WasNotCalled();
            }
        }
コード例 #5
0
        public void execute_async_skips_actions_that_are_shorter_than_the_skip_ahead_even_if_the_context_is_paused()
        {
            var action1       = new ActionMock(MockBehavior.Loose);
            var action2       = new ActionMock(MockBehavior.Loose);
            var action3       = new ActionMock(MockBehavior.Loose);
            var eventMatcher1 = new EventMatcherMock();
            var eventMatcher2 = new EventMatcherMock();
            var eventMatcher3 = new EventMatcherMock();

            action1
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(10));

            action2
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(3));

            action3
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(1));

            action1
            .When(x => x.ExecuteAsync(It.IsAny <ExecutionContext>()))
            .Throw();

            action2
            .When(x => x.ExecuteAsync(It.IsAny <ExecutionContext>()))
            .Throw();

            eventMatcher1
            .When(x => x.Matches(It.IsAny <IEvent>()))
            .Return((IEvent @event) => @event is BeforeExerciseEvent);

            eventMatcher2
            .When(x => x.Matches(It.IsAny <IEvent>()))
            .Return((IEvent @event) => @event is BeforeExerciseEvent);

            eventMatcher3
            .When(x => x.Matches(It.IsAny <IEvent>()))
            .Return((IEvent @event) => @event is BeforeExerciseEvent);

            var sut = new ExerciseBuilder()
                      .AddMatcherWithAction(new MatcherWithAction(eventMatcher1, action1))
                      .AddMatcherWithAction(new MatcherWithAction(eventMatcher2, action2))
                      .AddMatcherWithAction(new MatcherWithAction(eventMatcher3, action3))
                      .Build();

            using (var executionContext = new ExecutionContext(TimeSpan.FromSeconds(13)))
            {
                executionContext.IsPaused = true;
                sut.ExecuteAsync(executionContext);

                action3
                .Verify(x => x.ExecuteAsync(executionContext))
                .WasCalledExactlyOnce();
            }
        }
コード例 #6
0
        public void execute_executes_each_child_action()
        {
            var action1 = new ActionMock(MockBehavior.Loose);
            var action2 = new ActionMock(MockBehavior.Loose);
            var action3 = new ActionMock(MockBehavior.Loose);
            var action4 = new ActionMock(MockBehavior.Loose);

            action1
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(1));

            action2
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(2));

            action3
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(3));

            action4
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(4));

            var sut = new ParallelActionBuilder()
                      .WithChild(action1)
                      .WithChild(action2)
                      .WithChild(action3)
                      .WithChild(action4)
                      .Build();

            using (var context = new ExecutionContext())
            {
                sut.Execute(context);

                action1
                .Verify(x => x.Execute(It.IsAny <ExecutionContext>()))
                .WasCalledExactlyOnce();

                action2
                .Verify(x => x.Execute(It.IsAny <ExecutionContext>()))
                .WasCalledExactlyOnce();

                action3
                .Verify(x => x.Execute(It.IsAny <ExecutionContext>()))
                .WasCalledExactlyOnce();

                action4
                .Verify(x => x.Execute(It.IsAny <ExecutionContext>()))
                .WasCalledExactlyOnce();
            }
        }
コード例 #7
0
        public void execute_async_executes_all_appropriate_actions()
        {
            var action1       = new ActionMock(MockBehavior.Loose);
            var action2       = new ActionMock(MockBehavior.Loose);
            var action3       = new ActionMock(MockBehavior.Loose);
            var eventMatcher1 = new EventMatcherMock();
            var eventMatcher2 = new EventMatcherMock();
            var eventMatcher3 = new EventMatcherMock();

            eventMatcher1
            .When(x => x.Matches(It.IsAny <IEvent>()))
            .Return((IEvent @event) => @event is BeforeExerciseEvent);

            eventMatcher2
            .When(x => x.Matches(It.IsAny <IEvent>()))
            .Return((IEvent @event) => @event is DuringRepetitionEvent);

            eventMatcher3
            .When(x => x.Matches(It.IsAny <IEvent>()))
            .Return((IEvent @event) => @event is AfterSetEvent);

            var sut = new ExerciseBuilder()
                      .WithSetCount(2)
                      .WithRepetitionCount(3)
                      .AddMatcherWithAction(new MatcherWithAction(eventMatcher1, action1))
                      .AddMatcherWithAction(new MatcherWithAction(eventMatcher2, action2))
                      .AddMatcherWithAction(new MatcherWithAction(eventMatcher3, action3))
                      .Build();

            using (var executionContext = new ExecutionContext())
            {
                sut.ExecuteAsync(executionContext);

                action1
                .Verify(x => x.ExecuteAsync(executionContext))
                .WasCalledExactlyOnce();

                action2
                .Verify(x => x.ExecuteAsync(executionContext))
                .WasCalledExactly(times: 6);

                action3
                .Verify(x => x.ExecuteAsync(executionContext))
                .WasCalledExactly(times: 2);
            }
        }
コード例 #8
0
        public void execute_skips_exercises_that_are_shorter_than_the_skip_ahead()
        {
            var action1 = new ActionMock(MockBehavior.Loose);
            var action2 = new ActionMock(MockBehavior.Loose);
            var action3 = new ActionMock(MockBehavior.Loose);

            action1
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(13));

            action2
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(10));

            action3
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(5));

            action1
            .When(x => x.Execute(It.IsAny <ExecutionContext>()))
            .Throw();

            action2
            .When(x => x.Execute(It.IsAny <ExecutionContext>()))
            .Throw();

            var sut = new ExerciseProgramBuilder()
                      .WithExercise(new ExerciseBuilder()
                                    .WithBeforeExerciseAction(action1))
                      .WithExercise(new ExerciseBuilder()
                                    .WithBeforeExerciseAction(action2))
                      .WithExercise(new ExerciseBuilder()
                                    .WithBeforeExerciseAction(action3))
                      .Build();
            var executionContext = new ExecutionContext(TimeSpan.FromSeconds(23));

            sut
            .Execute(executionContext)
            .Subscribe();

            action3
            .Verify(x => x.Execute(executionContext))
            .WasCalledExactlyOnce();
        }
コード例 #9
0
        public void execute_correctly_handles_a_skip_ahead_value_that_exceeds_even_the_longest_child_actions_duration()
        {
            var action1 = new ActionMock(MockBehavior.Loose);
            var action2 = new ActionMock(MockBehavior.Loose);
            var action3 = new ActionMock(MockBehavior.Loose);

            action1
            .When(x => x.Duration)
            .Return(TimeSpan.FromMinutes(1));

            action2
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(10));

            action3
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(71));

            var sut = new ParallelActionBuilder()
                      .WithChild(action1)
                      .WithChild(action2)
                      .WithChild(action3)
                      .Build();

            using (var context = new ExecutionContext(TimeSpan.FromMinutes(3)))
            {
                sut.Execute(context);

                action1
                .Verify(x => x.Execute(It.IsAny <ExecutionContext>()))
                .WasNotCalled();

                action2
                .Verify(x => x.Execute(It.IsAny <ExecutionContext>()))
                .WasNotCalled();

                action3
                .Verify(x => x.Execute(It.IsAny <ExecutionContext>()))
                .WasNotCalled();

                Assert.Equal(TimeSpan.FromSeconds(71), context.Progress);
            }
        }
コード例 #10
0
        public void execute_skips_actions_that_are_shorter_than_the_skip_ahead_even_if_the_execution_context_is_paused()
        {
            var action1 = new ActionMock(MockBehavior.Loose);
            var action2 = new ActionMock(MockBehavior.Loose);
            var action3 = new ActionMock(MockBehavior.Loose);

            action1
            .When(x => x.Duration)
            .Return(TimeSpan.FromMinutes(1));

            action2
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(10));

            action3
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(71));

            var sut = new ParallelActionBuilder()
                      .WithChild(action1)
                      .WithChild(action2)
                      .WithChild(action3)
                      .Build();

            using (var context = new ExecutionContext(TimeSpan.FromSeconds(70)))
            {
                context.IsPaused = true;
                sut.Execute(context);

                action1
                .Verify(x => x.Execute(It.IsAny <ExecutionContext>()))
                .WasNotCalled();

                action2
                .Verify(x => x.Execute(It.IsAny <ExecutionContext>()))
                .WasNotCalled();

                action3
                .Verify(x => x.Execute(It.IsAny <ExecutionContext>()))
                .WasCalledExactlyOnce();
            }
        }
コード例 #11
0
        public void execute_skips_child_actions_that_are_shorter_than_the_skip_ahead_even_if_the_context_is_paused()
        {
            var action1 = new ActionMock();
            var action2 = new ActionMock();
            var action3 = new ActionMock(MockBehavior.Loose);

            action1
            .When(x => x.Execute(It.IsAny <ExecutionContext>()))
            .Throw();

            action2
            .When(x => x.Execute(It.IsAny <ExecutionContext>()))
            .Throw();

            action1
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(3));

            action2
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(8));

            action3
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(2));

            var sut = new SequenceActionBuilder()
                      .WithChild(action1)
                      .WithChild(action2)
                      .WithChild(action3)
                      .Build();

            using (var context = new ExecutionContext(TimeSpan.FromSeconds(11)))
            {
                context.IsPaused = true;
                sut.Execute(context).Subscribe();

                action3
                .Verify(x => x.Execute(context))
                .WasCalledExactlyOnce();
            }
        }
コード例 #12
0
        public void execute_async_skips_child_actions_that_are_shorter_than_the_skip_ahead()
        {
            var action1 = new ActionMock();
            var action2 = new ActionMock();
            var action3 = new ActionMock(MockBehavior.Loose);

            action1
            .When(x => x.ExecuteAsync(It.IsAny <ExecutionContext>()))
            .Throw();

            action2
            .When(x => x.ExecuteAsync(It.IsAny <ExecutionContext>()))
            .Throw();

            action1
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(3));

            action2
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(8));

            action3
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(2));

            var sut = new SequenceActionBuilder()
                      .AddChild(action1)
                      .AddChild(action2)
                      .AddChild(action3)
                      .Build();

            using (var context = new ExecutionContext(TimeSpan.FromSeconds(11)))
            {
                sut.ExecuteAsync(context);

                action3
                .Verify(x => x.ExecuteAsync(context))
                .WasCalledExactlyOnce();
            }
        }
コード例 #13
0
        public void execute_async_does_not_skip_zero_duration_actions()
        {
            var action       = new ActionMock(MockBehavior.Loose);
            var eventMatcher = new EventMatcherMock();

            eventMatcher
            .When(x => x.Matches(It.IsAny <IEvent>()))
            .Return((IEvent @event) => @event is BeforeExerciseEvent);

            var sut = new ExerciseBuilder()
                      .AddMatcherWithAction(new MatcherWithAction(eventMatcher, action))
                      .Build();

            using (var executionContext = new ExecutionContext())
            {
                sut.ExecuteAsync(executionContext);

                action
                .Verify(x => x.ExecuteAsync(executionContext))
                .WasCalledExactlyOnce();
            }
        }
コード例 #14
0
        public void execute_ensures_progress_of_child_actions_does_not_compound_when_skipping()
        {
            var action1 = new ActionMock();
            var action2 = new ActionMock();
            var action3 = new ActionMock();
            var action4 = new ActionMock();

            action1
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(3));

            action2
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(8));

            action3
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(10));

            action4
            .When(x => x.Duration)
            .Return(TimeSpan.FromSeconds(4));

            action1
            .When(x => x.Execute(It.IsAny <ExecutionContext>()))
            .Do <ExecutionContext>(ec => ec.AddProgress(action1.Duration))
            .Return(Observables.Unit);

            action2
            .When(x => x.Execute(It.IsAny <ExecutionContext>()))
            .Do <ExecutionContext>(ec => ec.AddProgress(action2.Duration))
            .Return(Observables.Unit);

            action3
            .When(x => x.Execute(It.IsAny <ExecutionContext>()))
            .Do <ExecutionContext>(ec => ec.AddProgress(action3.Duration))
            .Return(Observables.Unit);

            action4
            .When(x => x.Execute(It.IsAny <ExecutionContext>()))
            .Do <ExecutionContext>(ec => ec.AddProgress(action4.Duration))
            .Return(Observables.Unit);

            var sut = new ParallelActionBuilder()
                      .WithChild(action1)
                      .WithChild(action2)
                      .WithChild(action3)
                      .WithChild(action4)
                      .Build();
            var context = new ExecutionContext(TimeSpan.FromSeconds(5));

            sut.Execute(context);

            Assert.Equal(TimeSpan.FromSeconds(10), context.Progress);

            action1
            .Verify(x => x.Execute(It.IsAny <ExecutionContext>()))
            .WasNotCalled();

            action4
            .Verify(x => x.Execute(It.IsAny <ExecutionContext>()))
            .WasNotCalled();
        }