public void Should_process_a_query_with_modifiers()
        {
            var expectedCommand = new BsonDocument
            {
                { "find", MessageHelper.DefaultCollectionNamespace.CollectionName },
                { "projection", new BsonDocument("b", 1) },
                { "skip", 1 },
                { "batchSize", 2 },
                { "limit", 100 },
                { "awaitData", true },
                { "noCursorTimeout", true },
                { "allowPartialResults", true },
                { "tailable", true },
                { "oplogReplay", true },
                { "filter", new BsonDocument("x", 1) },
                { "sort", new BsonDocument("a", -1) },
                { "comment", "funny" },
                { "maxTimeMS", 20 },
                { "showRecordId", true },
            };
            var expectedReplyDocuments = new[]
            {
                new BsonDocument("first", 1),
                new BsonDocument("second", 2)
            };
            var expectedReply = new BsonDocument
            {
                { "cursor", new BsonDocument
                  {
                      { "id", 20L },
                      { "ns", MessageHelper.DefaultCollectionNamespace.FullName },
                      { "firstBatch", new BsonArray(expectedReplyDocuments) }
                  } },
                { "ok", 1 }
            };
            var query = new BsonDocument
            {
                { "$query", expectedCommand["filter"] },
                { "$orderby", expectedCommand["sort"] },
                { "$comment", expectedCommand["comment"] },
                { "$maxTimeMS", expectedCommand["maxTimeMS"] },
                { "$showDiskLoc", expectedCommand["showRecordId"] },
            };
            var requestMessage = MessageHelper.BuildQuery(
                query,
                fields: (BsonDocument)expectedCommand["projection"],
                requestId: 10,
                skip: expectedCommand["skip"].ToInt32(),
                batchSize: expectedCommand["batchSize"].ToInt32(),
                noCursorTimeout: expectedCommand["noCursorTimeout"].ToBoolean(),
                awaitData: expectedCommand["awaitData"].ToBoolean(),
                partialOk: expectedCommand["allowPartialResults"].ToBoolean(),
                tailableCursor: expectedCommand["tailable"].ToBoolean(),
                oplogReplay: expectedCommand["oplogReplay"].ToBoolean());

            using (EventContext.BeginFind(expectedCommand["batchSize"].ToInt32(), expectedCommand["limit"].ToInt32()))
            {
                SendMessages(requestMessage);
            }

            var replyMessage = MessageHelper.BuildReply <BsonDocument>(
                expectedReplyDocuments,
                BsonDocumentSerializer.Instance,
                responseTo: requestMessage.RequestId,
                cursorId: expectedReply["cursor"]["id"].ToInt64());

            ReceiveMessages(replyMessage);

            var commandStartedEvent   = (CommandStartedEvent)_capturedEvents.Next();
            var commandSucceededEvent = (CommandSucceededEvent)_capturedEvents.Next();

            commandStartedEvent.CommandName.Should().Be(expectedCommand.GetElement(0).Name);
            commandStartedEvent.Command.Should().Be(expectedCommand);
            commandStartedEvent.ConnectionId.Should().Be(_subject.ConnectionId);
            commandStartedEvent.DatabaseNamespace.Should().Be(MessageHelper.DefaultDatabaseNamespace);
            commandStartedEvent.OperationId.Should().Be(EventContext.OperationId);
            commandStartedEvent.RequestId.Should().Be(requestMessage.RequestId);

            commandSucceededEvent.CommandName.Should().Be(commandStartedEvent.CommandName);
            commandSucceededEvent.ConnectionId.Should().Be(commandStartedEvent.ConnectionId);
            commandSucceededEvent.Duration.Should().BeGreaterThan(TimeSpan.Zero);
            commandSucceededEvent.OperationId.Should().Be(commandStartedEvent.OperationId);
            commandSucceededEvent.Reply.Should().Be(expectedReply);
            commandSucceededEvent.RequestId.Should().Be(commandStartedEvent.RequestId);
        }