public void ChangeStreamOperation_should_not_calculate_effective_options_for_non_resume_process()
        {
            var pipeline               = new BsonDocument[0];
            var resultSerializer       = new ChangeStreamDocumentSerializer <BsonDocument>(BsonDocumentSerializer.Instance);
            var messageEncoderSettings = new MessageEncoderSettings();

            var resumeAfter          = new BsonDocument("a", 1);
            var startAfter           = new BsonDocument("b", 2);
            var startAtOperationTime = BsonTimestamp.Create(3L);
            var documentResumeToken  = new BsonDocument("c", 3);

            ChangeStreamOperation <ChangeStreamDocument <BsonDocument> > subject = new ChangeStreamOperation <ChangeStreamDocument <BsonDocument> >(_collectionNamespace, pipeline, resultSerializer, messageEncoderSettings)
            {
                ResumeAfter          = resumeAfter,
                StartAfter           = startAfter,
                StartAtOperationTime = startAtOperationTime,
                DocumentResumeToken  = documentResumeToken
            };

            var result = subject.CreateChangeStreamStage(false);

            var changeStream = result.GetValue("$changeStream").AsBsonDocument;

            changeStream.GetValue("resumeAfter").Should().Be(resumeAfter);
            changeStream.GetValue("startAfter").Should().Be(startAfter);
            changeStream.GetValue("startAtOperationTime").Should().Be(startAtOperationTime);
        }
        public void ChangeStreamOperation_should_have_expected_change_stream_operation_options_for_resume_process_after_resumable_error(
            string resumeAfterJson,
            string startAfterJson,
            object startAtOperationTimeValue,
            string documentResumeTokenJson,
            object initialOperationTime,
            string expectedResumeAfter,
            object expectedStartAtOperationTimeValue)
        {
            var pipeline               = new BsonDocument[0];
            var resultSerializer       = new ChangeStreamDocumentSerializer <BsonDocument>(BsonDocumentSerializer.Instance);
            var messageEncoderSettings = new MessageEncoderSettings();

            var resumeAfter = resumeAfterJson != null?BsonDocument.Parse(resumeAfterJson) : null;

            var startAfter = startAfterJson != null?BsonDocument.Parse(startAfterJson) : null;

            var startAtOperationTime = startAtOperationTimeValue != null?BsonTimestamp.Create(startAtOperationTimeValue) : null;

            var documentResumeToken = documentResumeTokenJson != null?BsonDocument.Parse(documentResumeTokenJson) : null;

            ChangeStreamOperation <ChangeStreamDocument <BsonDocument> > subject = new ChangeStreamOperation <ChangeStreamDocument <BsonDocument> >(_collectionNamespace, pipeline, resultSerializer, messageEncoderSettings)
            {
                ResumeAfter          = resumeAfter,
                StartAfter           = startAfter,
                StartAtOperationTime = startAtOperationTime,
                DocumentResumeToken  = documentResumeToken
            };

            if (initialOperationTime != null)
            {
                subject._initialOperationTime(BsonTimestamp.Create(initialOperationTime));
            }

            var result = subject.CreateChangeStreamStage(true);

            var changeStream = result.GetValue("$changeStream").AsBsonDocument;

            changeStream.GetValue("resumeAfter", null).Should().Be(expectedResumeAfter != null ? BsonDocument.Parse(expectedResumeAfter) : null);
            changeStream.TryGetValue("startAfter", out _).Should().BeFalse();
            changeStream.GetValue("startAtOperationTime", null).Should().Be(expectedStartAtOperationTimeValue != null ? BsonTimestamp.Create(expectedStartAtOperationTimeValue) : null);
        }