public void TestFindAndModify()
{
_collection.RemoveAll();
_collection.Insert(new BsonDocument { { "_id", 1 }, { "priority", 1 }, { "inprogress", false }, { "name", "abc" } });
_collection.Insert(new BsonDocument { { "_id", 2 }, { "priority", 2 }, { "inprogress", false }, { "name", "def" } });
var query = Query.EQ("inprogress", false);
var sortBy = SortBy.Descending("priority");
var started = DateTime.UtcNow;
started = started.AddTicks(-(started.Ticks % 10000)); // adjust for MongoDB DateTime precision
var update = Update.Set("inprogress", true).Set("started", started);
var result = _collection.FindAndModify(query, sortBy, update, false); // return old
Assert.IsTrue(result.Ok);
Assert.AreEqual(2, result.ModifiedDocument["_id"].AsInt32);
Assert.AreEqual(2, result.ModifiedDocument["priority"].AsInt32);
Assert.AreEqual(false, result.ModifiedDocument["inprogress"].AsBoolean);
Assert.AreEqual("def", result.ModifiedDocument["name"].AsString);
Assert.IsFalse(result.ModifiedDocument.Contains("started"));
started = DateTime.UtcNow;
started = started.AddTicks(-(started.Ticks % 10000)); // adjust for MongoDB DateTime precision
update = Update.Set("inprogress", true).Set("started", started);
result = _collection.FindAndModify(query, sortBy, update, true); // return new
Assert.IsTrue(result.Ok);
Assert.AreEqual(1, result.ModifiedDocument["_id"].AsInt32);
Assert.AreEqual(1, result.ModifiedDocument["priority"].AsInt32);
Assert.AreEqual(true, result.ModifiedDocument["inprogress"].AsBoolean);
Assert.AreEqual("abc", result.ModifiedDocument["name"].AsString);
Assert.AreEqual(started, result.ModifiedDocument["started"].ToUniversalTime());
}