コード例 #1
0
        public void Should_Wait_For_Request_To_Finish_And_Then_Wait_SettleNext()
        {
            var testScheduler = new TestScheduler();

            var(settler, requestSettler) = CreateSettler(testScheduler, TimeSpan.FromTicks(100), TimeSpan.FromTicks(800));

            testScheduler.ScheduleAbsolute(0, () => requestSettler.OnStartRequest());
            testScheduler.ScheduleAbsolute(300, () => requestSettler.OnEndRequest());
            var observer = testScheduler.Start(() => settler.SettleNextInternal(), 100, 100, ReactiveTest.Disposed);

            observer.Messages.Should().ContainInOrder(
                ReactiveTest.OnNext(401, Unit.Default),
                ReactiveTest.OnCompleted(401, Unit.Default)
                );
        }
コード例 #2
0
            public async Task SetsTheEmailFieldWhenInvalidCredentialsAreProvided()
            {
                arrangeCallToPasswordManagerWithInvalidCredentials();
                var observer = TestScheduler.CreateObserver <string>();

                ViewModel.Email.Subscribe(observer);

                ViewModel.StartPasswordManager.Execute();

                TestScheduler.Start();
                observer.Messages.AssertEqual(
                    ReactiveTest.OnNext(1, Email.Empty.ToString()),
                    ReactiveTest.OnNext(2, InvalidEmail.ToString())
                    );
            }
コード例 #3
0
        public void AddOneLabelObservableTest()
        {
            // Define the actions.
            _scheduler.Schedule(TimeSpan.FromTicks(10), () => _defaultTestMessage.Label = MessageLabel2);

            var expected = new[]
            {
                ReactiveTest.OnNext(1, MessageLabel1),
                ReactiveTest.OnNext(10, MessageLabel2)
            };
            var actual = _scheduler.Start(() => _defaultTestMessage.LabelChanged, 0, 0, 1000).Messages;

            // Assert
            ReactiveAssert.AreElementsEqual(expected, actual);
        }
コード例 #4
0
            public void DoesNotDisplayAnErrormessageWhenTheUserCancelsTheRequestOnTheGoogleService()
            {
                var observer = SchedulerProvider.TestScheduler.CreateObserver <string>();

                ViewModel.ErrorMessage.Subscribe(observer);
                LoginManager.LoginWithGoogle()
                .Returns(Observable.Throw <ITogglDataSource>(new GoogleLoginException(true)));

                ViewModel.GoogleLogin();

                SchedulerProvider.TestScheduler.Start();
                observer.Messages.AssertEqual(
                    ReactiveTest.OnNext(1, "")
                    );
            }
コード例 #5
0
        public void ChangeReceiverOnceObservableTest()
        {
            // Define the actions.
            _scheduler.Schedule(TimeSpan.FromTicks(10), () => _defaultTestMessage.Receiver = _testReceiver2);

            var expected = new[]
            {
                ReactiveTest.OnNext(1, _testReceiver1),
                ReactiveTest.OnNext(10, _testReceiver2),
            };
            var actual = _scheduler.Start(() => _defaultTestMessage.ReceiverChanged, 0, 0, 1000).Messages;

            // Assert
            ReactiveAssert.AreElementsEqual(expected, actual);
        }
コード例 #6
0
            public async ThreadingTask ReturnsTrueWhenThereAreNoSuggestionsAndNoTimeEntriesAndIsNotWelcome()
            {
                PrepareIsWelcome(false);
                await ViewModel.Initialize();

                var observer = TestScheduler.CreateObserver <bool>();

                ViewModel.ShouldShowWelcomeBack.Subscribe(observer);

                TestScheduler.Start();
                observer.Messages.AssertEqual(
                    ReactiveTest.OnNext(1, false),
                    ReactiveTest.OnNext(2, true)
                    );
            }
コード例 #7
0
            public async Task SetsTheCountryButtonTitleToSelectCountryWhenApiCallFails()
            {
                var observer = TestScheduler.CreateObserver <string>();

                ViewModel.CountryButtonTitle.Subscribe(observer);

                Api.Location.Get().Returns(Observable.Throw <ILocation>(new Exception()));

                await ViewModel.Initialize();

                TestScheduler.Start();
                observer.Messages.AssertEqual(
                    ReactiveTest.OnNext(1, Resources.SelectCountry)
                    );
            }
コード例 #8
0
        public void ChangePartyTypeOnceObservableTest()
        {
            // Define the actions.
            _scheduler.Schedule(TimeSpan.FromTicks(10), () => _defaultTestParty.Type = Party.PartyType.Object);

            var expected = new[]
            {
                ReactiveTest.OnNext(1, DefaultPartyType),
                ReactiveTest.OnNext(10, Party.PartyType.Object)
            };
            var actual = _scheduler.Start(() => _defaultTestParty.TypeChanged, 0, 0, 1000).Messages;

            // Assert
            ReactiveAssert.AreElementsEqual(expected, actual);
        }
コード例 #9
0
    private static void Main(string[] args)
    {
        ReactiveTest rx1     = null;
        ReactiveTest rx2     = null;
        var          thread1 = new Thread(() => rx1 = new ReactiveTest());
        var          thread2 = new Thread(() => rx2 = new ReactiveTest());

        thread1.Start();
        thread2.Start();
        Thread.Sleep(TimeSpan.FromSeconds(1));
        thread1.Join();
        thread2.Join();
        rx1.Dispose();
        rx2.Dispose();
    }
コード例 #10
0
        public void Should_Timeout_If_A_Request_Takes_To_Long_SettleNext()
        {
            var testScheduler = new TestScheduler();

            var(settler, requestSettler) = CreateSettler(testScheduler, TimeSpan.FromTicks(200), TimeSpan.FromTicks(800));

            testScheduler.ScheduleAbsolute(0, () => requestSettler.OnStartRequest());
            testScheduler.ScheduleAbsolute(ReactiveTest.Disposed, () => requestSettler.OnEndRequest());
            var observer = testScheduler.Start(() => settler.SettleNextInternal(), 100, 100, ReactiveTest.Disposed);

            observer.Messages.Should().ContainInOrder(
                ReactiveTest.OnNext(902, Unit.Default),
                ReactiveTest.OnCompleted(902, Unit.Default)
                );
        }
コード例 #11
0
            public async Task SetsThePasswordFieldWhenValidCredentialsAreProvided()
            {
                arrangeCallToPasswordManagerWithValidCredentials();
                var observer = TestScheduler.CreateObserver <string>();

                ViewModel.Password.Subscribe(observer);

                await ViewModel.StartPasswordManager();

                TestScheduler.Start();
                observer.Messages.AssertEqual(
                    ReactiveTest.OnNext(1, Password.Empty.ToString()),
                    ReactiveTest.OnNext(2, ValidPassword.ToString())
                    );
            }
コード例 #12
0
                public void SetsIsLoadingToFalse()
                {
                    var observer = TestScheduler.CreateObserver <bool>();

                    ViewModel.IsLoading.Subscribe(observer);

                    ViewModel.Login();

                    TestScheduler.Start();
                    observer.Messages.AssertEqual(
                        ReactiveTest.OnNext(1, false),
                        ReactiveTest.OnNext(2, true),
                        ReactiveTest.OnNext(3, false)
                        );
                }
コード例 #13
0
        public void SkipUntil_SourceCompletedBeforeCheckpoint_FailAndReload()
        {
            var store    = new InMemoryStateStore("someId");
            var engine   = CreateQueryEngine();
            var reactive = engine.GetReactiveService();

            var source = GetTestableQbservable(reactive, "source",
                                               OnNext(100, 1),        // 110
                                               OnNext(200, 2),        // 210
                                               OnNext(300, 3),        // 310
                                               OnNext(400, 4),        // 410
                                               OnCompleted <int>(490) // 500
                                                                      // crash at 600
                                               );

            Assert.IsNotNull(source);

            var triggeringSource = GetTestableQbservable(reactive, "triggeringSource",
                                                         OnNext <int>(510, 1) // 520
                                                         );

            Assert.IsNotNull(triggeringSource);

            var result = GetTestableQbserver <int>(reactive, "result");

            Scheduler.ScheduleAbsolute(10, () => source.SkipUntil(triggeringSource).Subscribe(result, new Uri("s:/sub1"), null));
            Scheduler.ScheduleAbsolute(510, () => Checkpoint(engine, store));
            Scheduler.ScheduleAbsolute(600, () => RemoveQueryEngine(engine));
            Scheduler.ScheduleAbsolute(800, () => Recover(CreateQueryEngine(), store));

            Scheduler.Start();

            var sub = GetTestableSubscribable <int>("source");

            sub.Subscriptions.AssertEqual(
                ReactiveTest.Subscribe(10, 10 + 490),
                ReactiveTest.Subscribe(800, 800));

            var subTrigger = GetTestableSubscribable <int>("triggeringSource");

            subTrigger.Subscriptions.AssertEqual(
                ReactiveTest.Subscribe(10, 10 + 510),
                ReactiveTest.Subscribe(800, 800 + 510));

            var res = GetTestableObserver <int>("result");

            res.Messages.AssertEqual();
        }
コード例 #14
0
        public void MessageTimeoutIsStartedAgainIfMessageIsUpdated()
        {
            var expected        = messageA.Merge(new Message(A));
            var messageSequence = testScheduler.CreateColdObservable(
                ReactiveTest.OnNext(MessageAOnNextTick, messageA),
                ReactiveTest.OnNext(3.Seconds(), expected)
                );

            var sut = CreateKeysController(messageSequence);

            sut.Start();
            testScheduler.AdvanceBy(6.Seconds());

            messages.Single().IsDeleting.ShouldBe(false);
            messages.Single().ShouldBe(expected);
        }
コード例 #15
0
        public void LabelTextChangesWhenOneKeyTyped()
        {
            _labelView.IsInEditMode = true;
            ScheduleTypeTextInLabelView("TEST");
            var expected = new[]
            {
                ReactiveTest.OnNext(1, ""),
                ReactiveTest.OnNext(10, "T"),
                ReactiveTest.OnNext(20, "TE"),
                ReactiveTest.OnNext(30, "TES"),
                ReactiveTest.OnNext(40, "TEST")
            };
            var actual = _scheduler.Start(() => _labelView.TextChanged, 0, 0, 1000).Messages;

            ReactiveAssert.AreElementsEqual(expected, actual);
        }
コード例 #16
0
        public void Should_Timeout_If_A_Request_Takes_To_Long(SettlerType settlerType)
        {
            var testScheduler = new TestScheduler();

            var(settler, matcher) = CreateSettlers(testScheduler, TimeSpan.FromTicks(200), TimeSpan.FromTicks(500));

            matcher.ScheduleAbsoluteStart(settlerType, 0);
            matcher.ScheduleAbsoluteEnd(settlerType, ReactiveTest.Disposed);

            var observer = testScheduler.Start(() => settler.Settle(), 100, 100, ReactiveTest.Disposed);

            observer.Messages.Should().ContainInOrder(
                ReactiveTest.OnNext(601, Unit.Default),
                ReactiveTest.OnCompleted(802, Unit.Default)
                );
        }
コード例 #17
0
                public void SetsTheErrorMessageToNothingWhenGoogleLoginWasCanceled()
                {
                    var observer  = TestScheduler.CreateObserver <string>();
                    var exception = new GoogleLoginException(true);

                    ViewModel.ErrorMessage.Subscribe(observer);
                    LoginManager.Login(Arg.Any <Email>(), Arg.Any <Password>())
                    .Returns(Observable.Throw <ITogglDataSource>(exception));

                    ViewModel.Login();

                    TestScheduler.Start();
                    observer.Messages.AssertEqual(
                        ReactiveTest.OnNext(1, "")
                        );
                }
コード例 #18
0
        public void Should_Wait_For_Request_To_Finish_And_Then_Wait(SettlerType settlerType)
        {
            var testScheduler = new TestScheduler();

            var(settler, matcher) = CreateSettlers(testScheduler, TimeSpan.FromTicks(100), TimeSpan.FromTicks(800));

            matcher.ScheduleRelativeStart(settlerType, 0);
            matcher.ScheduleRelativeEnd(settlerType, 300);

            var observer = testScheduler.Start(() => settler.Settle().Take(1), 100, 100, ReactiveTest.Disposed);

            observer.Messages.Should().ContainInOrder(
                ReactiveTest.OnNext(401, Unit.Default),
                ReactiveTest.OnCompleted(401, Unit.Default)
                );
        }
コード例 #19
0
                    public void SetsGenereicErrorForAnyOtherException()
                    {
                        var observer = TestScheduler.CreateObserver <string>();

                        ViewModel.ErrorMessage.Subscribe(observer);

                        prepareException(new Exception());

                        ViewModel.Signup.Execute();

                        TestScheduler.Start();
                        observer.Messages.AssertEqual(
                            ReactiveTest.OnNext(1, ""),
                            ReactiveTest.OnNext(2, Resources.GenericSignUpError)
                            );
                    }
コード例 #20
0
            public async Task EmitsWheneverTheShouldShowOnboardingObservablesOmits()
            {
                PermissionsService.CalendarPermissionGranted.Returns(Observable.Return(false));
                var observer = TestScheduler.CreateObserver <bool>();

                ViewModel.SettingsAreVisible.Subscribe(observer);
                PermissionsService.CalendarPermissionGranted.Returns(Observable.Return(true));
                ViewModel.GetStarted.Execute();

                TestScheduler.Start();

                observer.Messages.AssertEqual(
                    ReactiveTest.OnNext(0, false),
                    ReactiveTest.OnNext(0, true)
                    );
            }
コード例 #21
0
            public void SetsIsPasswordMaskedToTrueWhenItIsFalse()
            {
                var observer = TestScheduler.CreateObserver <bool>();

                ViewModel.IsPasswordMasked.Subscribe(observer);

                ViewModel.TogglePasswordVisibility();
                ViewModel.TogglePasswordVisibility();

                TestScheduler.Start();
                observer.Messages.AssertEqual(
                    ReactiveTest.OnNext(1, true),
                    ReactiveTest.OnNext(2, false),
                    ReactiveTest.OnNext(3, true)
                    );
            }
コード例 #22
0
            public async Task SetsFailedToGetCountryToTrueWhenApiCallFails()
            {
                var observer = TestScheduler.CreateObserver <bool>();

                ViewModel.IsCountryErrorVisible.Subscribe(observer);

                Api.Location.Get().Returns(Observable.Throw <ILocation>(new Exception()));

                await ViewModel.Initialize();

                TestScheduler.Start();
                observer.Messages.AssertEqual(
                    ReactiveTest.OnNext(1, false),
                    ReactiveTest.OnNext(2, true)
                    );
            }
コード例 #23
0
        public void OnFuturesQuote_WithAValidContract_StreamsQuoteWithContract()
        {
            var validFuturesQuote = new FuturesQuote
            {
                Symbol = "CZ2013"
            };
            var scheduler                = new TestScheduler();
            var futuresQuotes            = scheduler.CreateColdObservable(ReactiveTest.OnNext(0, validFuturesQuote));
            var quotesWithContractClient = new AntiCorruptionLayerObservableClient(futuresQuotes);

            var quotesWithContracts = scheduler.Start(() => quotesWithContractClient.Quotes);

            quotesWithContracts.Messages.Should().HaveCount(1);
            var quoteWithContract = quotesWithContracts.Messages.Single().Value.Value;

            quoteWithContract.Quote.ShouldBeEquivalentTo(validFuturesQuote);
        }
コード例 #24
0
                    public void SetsIsLoadingToFalse()
                    {
                        var observer = TestScheduler.CreateObserver <bool>();

                        ViewModel.IsLoading.Subscribe(observer);

                        prepareException(new Exception());

                        ViewModel.Signup.Execute();

                        TestScheduler.Start();
                        observer.Messages.AssertEqual(
                            ReactiveTest.OnNext(1, false),
                            ReactiveTest.OnNext(2, true),
                            ReactiveTest.OnNext(3, false)
                            );
                    }
コード例 #25
0
                public void SetsTheIsLoadingPropertyToTrue()
                {
                    var observer = TestScheduler.CreateObserver <bool>();

                    ViewModel.IsLoading.Subscribe(observer);

                    UserAccessManager.SignUpWithGoogle(true, Arg.Any <int>(), Arg.Any <string>()).Returns(
                        Observable.Never <ITogglDataSource>());

                    ViewModel.GoogleSignup.Execute();

                    TestScheduler.Start();
                    observer.Messages.AssertEqual(
                        ReactiveTest.OnNext(1, false),
                        ReactiveTest.OnNext(2, true)
                        );
                }
コード例 #26
0
        public void VisibilityChangeTest()
        {
            int scheduleTicks = 10;

            _scheduler.Schedule(TimeSpan.FromTicks(scheduleTicks),
                                () => _communicationDiagramView.ViewModel.IsVisible = true);

            var expected = new[]
            {
                ReactiveTest.OnNext(1, false),
                ReactiveTest.OnNext(10, true)
            };
            var actual = _scheduler.Start(() => _communicationDiagramView.IsVisibleChanged, 0, 0, 1000).Messages;

            // Assert that the visibility changed as expected.
            ReactiveAssert.AreElementsEqual(expected, actual);
        }
コード例 #27
0
        private static IEnumerable <Recorded <Notification <T> > > ToNotificationStream <T>(IEnumerable <T> stream,
                                                                                            Func <T, DateTimeOffset> getTimestamp, DateTimeOffset?startAt,
                                                                                            DateTimeOffset?endAt)
        {
            // ReSharper disable once PossibleMultipleEnumeration
            startAt = startAt ?? getTimestamp(stream.First());

            // ReSharper disable once PossibleMultipleEnumeration
            endAt = endAt ?? getTimestamp(stream.Last());

            // ReSharper disable once PossibleMultipleEnumeration
            var notifications = stream.Select(x => ReactiveTest.OnNext(getTimestamp(x).Ticks - startAt.Value.Ticks, x))
                                .Concat(new[] { ReactiveTest.OnCompleted <T>(endAt.Value.Ticks - startAt.Value.Ticks) })
                                .ToArray();

            return(notifications);
        }
コード例 #28
0
                public void SetsIsLoadingToFalse()
                {
                    var observer = TestScheduler.CreateObserver <bool>();

                    ViewModel.IsLoading.Subscribe(observer);
                    LoginManager.Login(Arg.Any <Email>(), Arg.Any <Password>())
                    .Returns(Observable.Throw <ITogglDataSource>(new Exception()));

                    ViewModel.Login();

                    TestScheduler.Start();
                    observer.Messages.AssertEqual(
                        ReactiveTest.OnNext(1, false),
                        ReactiveTest.OnNext(2, true),
                        ReactiveTest.OnNext(3, false)
                        );
                }
コード例 #29
0
                public void SetsTheErrorMessageToGenericLoginErrorForAnyOtherException()
                {
                    var observer  = TestScheduler.CreateObserver <string>();
                    var exception = new Exception();

                    ViewModel.ErrorMessage.Subscribe(observer);
                    LoginManager.Login(Arg.Any <Email>(), Arg.Any <Password>())
                    .Returns(Observable.Throw <ITogglDataSource>(exception));

                    ViewModel.Login();

                    TestScheduler.Start();
                    observer.Messages.AssertEqual(
                        ReactiveTest.OnNext(1, ""),
                        ReactiveTest.OnNext(2, Resources.GenericLoginError)
                        );
                }
コード例 #30
0
            public void StopsTheViewModelLoadStateWhenItErrors()
            {
                var observer = TestScheduler.CreateObserver <bool>();

                ViewModel.IsLoading.Subscribe(observer);
                LoginManager.LoginWithGoogle()
                .Returns(Observable.Throw <ITogglDataSource>(new GoogleLoginException(false)));

                ViewModel.GoogleLogin();

                TestScheduler.Start();
                observer.Messages.AssertEqual(
                    ReactiveTest.OnNext(1, false),
                    ReactiveTest.OnNext(2, true),
                    ReactiveTest.OnNext(3, false)
                    );
            }