<?php
 namespace MongoDB\Tests\Operation;
 use MongoDB\Exception\InvalidArgumentException;
 use MongoDB\Operation\FindOneAndReplace;
 class FindOneAndReplaceTest extends TestCase {
 public function testConstructorFilterArgumentTypeCheck($filter) {
 $this->expectException(InvalidArgumentException::class);
 new FindOneAndReplace($this->getDatabaseName(), $this->getCollectionName(), $filter, []);
 }
 public function testConstructorReplacementArgumentTypeCheck($replacement) {
 $this->expectException(InvalidArgumentException::class);
 new FindOneAndReplace($this->getDatabaseName(), $this->getCollectionName(), [], $replacement);
 }
 public function testConstructorReplacementArgumentRequiresNoOperators() {
 $this->expectException(InvalidArgumentException::class);
 $this->expectExceptionMessage('First key in $replacement argument is an update operator');
 new FindOneAndReplace($this->getDatabaseName(), $this->getCollectionName(), [], ['$set' => ['x' => 1]]);
 }
 public function testConstructorOptionTypeChecks(array $options) {
 $this->expectException(InvalidArgumentException::class);
 new FindOneAndReplace($this->getDatabaseName(), $this->getCollectionName(), [], [], $options);
 }
 public function provideInvalidConstructorOptions() {
 $options = [];
 foreach ($this->getInvalidDocumentValues() as $value) {
 $options[][] = ['projection' => $value];
 }
 foreach ($this->getInvalidIntegerValues(true) as $value) {
 $options[][] = ['returnDocument' => $value];
 }
 return $options;
 }
 public function testConstructorReturnDocumentOption($returnDocument) {
 $this->expectException(InvalidArgumentException::class);
 new FindOneAndReplace($this->getDatabaseName(), $this->getCollectionName(), [], [], ['returnDocument' => $returnDocument]);
 }
 public function provideInvalidConstructorReturnDocumentOptions() {
 return $this->wrapValuesForDataProvider([-1, 0, 3]);
 }
 }
 