public void ShouldConsumeAllRecords()
 {
     var result = ResultCreator.CreateResult(0, 3);
     result.Consume();
     result.Count().Should().Be(0);
     result.Peek().Should().BeNull();
 }
 public void ShouldReturnNullIfAtEnd()
 {
     var result = ResultCreator.CreateResult(1);
     result.Take(1).ToList();
     var record = result.Peek();
     record.Should().BeNull();
 }
            public void ShouldReturnRecordIfSingle()
            {
                var result = ResultCreator.CreateResult(1);
                var record = result.Single();

                record.Should().NotBeNull();
                record.Keys.Count.Should().Be(1);
            }
            public void ShouldReturnNextRecordWithoutMovingCurrentRecord()
            {
                var result = ResultCreator.CreateResult(1);
                var record = result.Peek();
                record.Should().NotBeNull();

                result.GetEnumerator().Current.Should().BeNull();
            }
            public void ShouldThrowInvalidOperationExceptionIfMoreThanOneRecordFound()
            {
                var result = ResultCreator.CreateResult(1, 2);
                var ex     = Xunit.Record.Exception(() => result.Single());

                ex.Should().BeOfType <InvalidOperationException>();
                // INFO: Changed message because use of Enumerable.Single for simpler implementation
                ex.Message.Should().Be("Sequence contains more than one element");
            }
            public void ShouldThrowNoExceptionWhenCallingMultipleTimes()
            {
                var result = ResultCreator.CreateResult(1);

                result.Consume();
                var ex = Xunit.Record.Exception(() => result.Consume());

                ex.Should().BeNull();
            }
            public void ShouldGetTheFirstRecordAndMoveToNextPosition()
            {
                var result = ResultCreator.CreateResult(1, 3);
                var record = result.First();
                record[0].ValueAs<string>().Should().Be("record0:key0");

                record = result.First();
                record[0].ValueAs<string>().Should().Be("record1:key0");
            }
            public void ShouldCallGetSummaryWhenGetSummaryIsNotNull()
            {
                bool getSummaryCalled = false;
                var  result           = ResultCreator.CreateResult(1, 0, () => { getSummaryCalled = true; return(null); });

                // ReSharper disable once UnusedVariable
                var summary = result.Summary;

                getSummaryCalled.Should().BeTrue();
            }
            public void ShouldThrowInvalidOperationExceptionWhenNotAtEnd()
            {
                var result = ResultCreator.CreateResult(1);

                result.AtEnd.Should().BeFalse();

                var ex = Xunit.Record.Exception(() => result.Summary);

                ex.Should().BeOfType <InvalidOperationException>();
            }
            public void ShouldConsumeRecordCorrectly()
            {
                var result = ResultCreator.CreateResult(1, 3);

                result.Consume();
                result.Count().Should().Be(0); // the records left after consume

                result.GetEnumerator().Current.Should().BeNull();
                result.GetEnumerator().MoveNext().Should().BeFalse();
            }
            public void ShouldReturnExistingSummaryWhenSummaryHasBeenRetrieved()
            {
                int getSummaryCalled = 0;
                var result = ResultCreator.CreateResult(1, 0, () => { getSummaryCalled++; return new FakeSummary(); });

                // ReSharper disable once NotAccessedVariable
                var summary = result.Summary;
                // ReSharper disable once RedundantAssignment
                summary = result.Summary;
                getSummaryCalled.Should().Be(1);
            }
            public void ShouldAlwaysAdvanceRecordPosition()
            {
                var result     = ResultCreator.CreateResult(1, 3);
                var enumerable = result.Take(1);
                var records    = result.Take(2).ToList();

                records[0][0].As <string>().Should().Be("record0:key0");
                records[1][0].As <string>().Should().Be("record1:key0");

                records = enumerable.ToList();
                records[0][0].As <string>().Should().Be("record2:key0");
            }
            public void ShouldThrowInvalidOperationExceptionIfNotTheFistRecord()
            {
                var result     = ResultCreator.CreateResult(1, 2);
                var enumerator = result.GetEnumerator();

                enumerator.MoveNext().Should().BeTrue();
                enumerator.Current.Should().NotBeNull();

                var ex = Xunit.Record.Exception(() => result.Single());

                ex.Should().BeOfType <InvalidOperationException>();
                ex.Message.Should().Be("The first record is already consumed.");
            }
            public void ShouldConsumeSummaryCorrectly()
            {
                int getSummaryCalled = 0;
                var result           = ResultCreator.CreateResult(1, 0, () => { getSummaryCalled++; return(new FakeSummary()); });


                result.Consume();
                getSummaryCalled.Should().Be(1);

                // the same if we call it multiple times
                result.Consume();
                getSummaryCalled.Should().Be(1);
            }
            public void ShouldReturnNullWhenGetSummaryIsNull()
            {
                var result = ResultCreator.CreateResult(1, 0);

                result.Summary.Should().BeNull();
            }