public void CanRegisterMultipleSubscribers()
        {
            var p1 = A.Fake<IAnalyticsProvider>();
            var p2 = A.Fake<IAnalyticsProvider>();

            var analytics = new Analytics();
            analytics.Subscribe(p1);
            analytics.Subscribe(p2);

            analytics.TrackEvent(A.Dummy<string>());

            A.CallTo(() => p1.TrackEvent(A<string>._)).MustHaveHappened(Repeated.Exactly.Once);
            A.CallTo(() => p2.TrackEvent(A<string>._)).MustHaveHappened(Repeated.Exactly.Once);
        }
        public void CanTrackEventTwiceOnProvider()
        {
            var provider = A.Fake<IAnalyticsProvider>();
            var analytics = new Analytics();
            analytics.Subscribe(provider);

            analytics.TrackEvent(A.Dummy<string>());
            analytics.TrackEvent(A.Dummy<string>());

            A.CallTo(() => provider.TrackEvent(A<string>._)).MustHaveHappened(Repeated.Exactly.Twice);
        }
        public void CanTrackException()
        {
            var provider = A.Fake<IAnalyticsProvider>();
            var analytics = new Analytics();
            analytics.Subscribe(provider);

            analytics.TrackException(A.Dummy<Exception>());

            A.CallTo(() => provider.TrackException(A<Exception>._)).MustHaveHappened(Repeated.Exactly.Once);
            A.CallTo(() => provider.TrackEvent(A<string>._)).MustNotHaveHappened();
            A.CallTo(() => provider.TrackScreen(A<string>._)).MustNotHaveHappened();
        }
        public void CanTrackEventNTimesOnProvider()
        {
            var provider = A.Fake<IAnalyticsProvider>();
            var analytics = new Analytics();
            analytics.Subscribe(provider);

            var count = new Random().Next(1000);

            for (int i = 0; i < count; i++)
            {
                analytics.TrackEvent(A.Dummy<string>());
            }

            Console.WriteLine("Executed '{0}' times", count);
            A.CallTo(() => provider.TrackEvent(A<string>._)).MustHaveHappened(Repeated.Exactly.Times(count));
        }