public void CreateView_should_execute_a_CreateViewOperation_with_the_expected_SerializerRegistry(
            [Values(false, true)]
            bool isSerializerRegistryNull,
            [Values(false, true)]
            bool async)
        {
            var mockPipeline = new Mock<PipelineDefinition<BsonDocument, BsonDocument>>();
            var documentSerializer = BsonSerializer.SerializerRegistry.GetSerializer<BsonDocument>();
            var mockSerializerRegistry = new Mock<IBsonSerializerRegistry>();
            mockSerializerRegistry.Setup(r => r.GetSerializer(typeof(BsonDocument))).Returns(BsonDocumentSerializer.Instance);
            mockSerializerRegistry.Setup(r => r.GetSerializer<BsonDocument>()).Returns(BsonDocumentSerializer.Instance);
            var serializerRegistry = isSerializerRegistryNull ? null : mockSerializerRegistry.Object;
            var stages = new[] { new BsonDocument("$match", new BsonDocument("x", 1)) };
            var renderedPipeline = new RenderedPipelineDefinition<BsonDocument>(stages, BsonDocumentSerializer.Instance);
            mockPipeline.Setup(p => p.Render(documentSerializer, serializerRegistry ?? BsonSerializer.SerializerRegistry)).Returns(renderedPipeline);

            var options = new CreateViewOptions<BsonDocument>
            {
                SerializerRegistry = serializerRegistry
            };

            if (async)
            {
                _subject.CreateViewAsync<BsonDocument, BsonDocument>("viewName", "viewOn", mockPipeline.Object, options, CancellationToken.None).GetAwaiter().GetResult();
            }
            else
            {
                _subject.CreateView<BsonDocument, BsonDocument>("viewName", "viewOn", mockPipeline.Object, options, CancellationToken.None);
            }

            var call = _operationExecutor.GetWriteCall<BsonDocument>();
            var operation = call.Operation.Should().BeOfType<CreateViewOperation>().Subject;
            operation.Pipeline.Should().Equal(stages); // test output of call to Render
        }
        public static Task <BsonDocument> ExplainAggregation <TDocument, TResult>(
            this IMongoCollection <TDocument> collection
            , PipelineDefinition <TDocument, TResult> aggregationPipeline, ExplainVerbosity verbosity)
        {
            IBsonSerializerRegistry     serializerRegistry = collection.Settings.SerializerRegistry;
            IBsonSerializer <TDocument> serializer         = serializerRegistry.GetSerializer <TDocument>();
            MessageEncoderSettings      encoderSettings    = collection.GetMessageEncoderSettings();

            RenderedPipelineDefinition <TResult> renderedDefinition = aggregationPipeline.Render(serializer, serializerRegistry);

            IReadOperation <BsonDocument> explainOperation = new AggregateOperation <TResult>(
                collection.CollectionNamespace,
                renderedDefinition.Documents,
                renderedDefinition.OutputSerializer,
                encoderSettings)
                                                             .ToExplainOperation(verbosity);

            ICluster           cluster = GetCluster(collection);
            ICoreSessionHandle session = NoCoreSession.NewHandle();

            using (IReadBinding binding = new ReadPreferenceBinding(cluster, collection.Settings.ReadPreference, session))
            {
                var cancelToken = new CancellationToken();
                return(explainOperation.ExecuteAsync(binding, cancelToken));
            }
        }