public void WriteMoreThanPageSizeEventsWritesInCorrectOrder(
            AtomEventWriteUsage usage,
            [Frozen(As = typeof(ITypeResolver))] TestEventTypeResolver dummyResolver,
            [Frozen(As = typeof(IContentSerializer))] XmlContentSerializer dummySerializer,
            [Frozen(As = typeof(IAtomEventStorage))] SpyAtomEventStore spyStore,
            AtomEventWriterFactory <XmlAttributedTestEventX> writerFactory,
            AtomEventObserver <XmlAttributedTestEventX> sut,
            Generator <XmlAttributedTestEventX> eventGenerator)
        {
            var events = eventGenerator.Take(sut.PageSize + 1).ToList();
            var writer = writerFactory.Create(usage);

            events.ForEach(e => writer.WriteTo(sut, e));

            var writtenFeeds = spyStore.Feeds.Select(ParseAtomFeed);
            var firstPage    = FindFirstPage(writtenFeeds, sut.Id);
            var nextPage     = FindNextPage(firstPage, writtenFeeds);
            var expected     = new[] { nextPage.Id, firstPage.Id, sut.Id };
            var actual       = spyStore
                               .ObservedArguments
                               .OfType <AtomFeed>()
                               .Select(f => f.Id)
                               .Reverse()
                               .Take(3)
                               .Reverse();

            Assert.Equal(expected, actual);
        }
        public void AppendAsyncWritesPreviousPageBeforeIndex(
            [Frozen(As = typeof(IAtomEventStorage))] SpyAtomEventStore spyStore,
            AtomEventStream <XmlAttributedTestEventX> sut,
            Generator <XmlAttributedTestEventX> eventGenerator)
        {
            var events = eventGenerator.Take(sut.PageSize + 1).ToList();

            events.ForEach(e => sut.AppendAsync(e).Wait());

            var feed = Assert.IsAssignableFrom <AtomFeed>(
                spyStore.ObservedArguments.Last());

            Assert.Equal(sut.Id, feed.Id);
        }
        public void WriteFirstEventWritesPageBeforeIndex(
            AtomEventWriteUsage usage,
            [Frozen(As = typeof(ITypeResolver))] TestEventTypeResolver dummyResolver,
            [Frozen(As = typeof(IContentSerializer))] XmlContentSerializer dummySerializer,
            [Frozen(As = typeof(IAtomEventStorage))] SpyAtomEventStore spyStore,
            AtomEventWriterFactory <XmlAttributedTestEventX> writerFactory,
            AtomEventObserver <XmlAttributedTestEventX> sut,
            XmlAttributedTestEventX @event)
        {
            writerFactory.Create(usage).WriteTo(sut, @event);

            var feed = Assert.IsAssignableFrom <AtomFeed>(
                spyStore.ObservedArguments.Last());

            Assert.Equal(sut.Id, feed.Id);
        }
        public void WriteTwoEventsOnlyWritesIndexOnce(
            AtomEventWriteUsage usage,
            [Frozen(As = typeof(ITypeResolver))] TestEventTypeResolver dummyResolver,
            [Frozen(As = typeof(IContentSerializer))] XmlContentSerializer dummySerializer,
            [Frozen(As = typeof(IAtomEventStorage))] SpyAtomEventStore spyStore,
            AtomEventWriterFactory <XmlAttributedTestEventX> writerFactory,
            AtomEventObserver <XmlAttributedTestEventX> sut,
            Generator <XmlAttributedTestEventX> eventGenerator)
        {
            var events = eventGenerator.Take(2).ToList();
            var writer = writerFactory.Create(usage);

            events.ForEach(e => writer.WriteTo(sut, e));

            var writtenIds = spyStore.ObservedArguments
                             .OfType <AtomFeed>()
                             .Select(f => f.Id);

            Assert.Equal(1, writtenIds.Count(id => sut.Id == id));
        }