<?php
 namespace MongoDB\Tests\Operation;
 use MongoDB\Exception\InvalidArgumentException;
 use MongoDB\Operation\Aggregate;
 class AggregateTest extends TestCase {
 public function testConstructorPipelineArgumentMustBeAList() {
 $this->expectException(InvalidArgumentException::class);
 $this->expectExceptionMessage('$pipeline is not a list (unexpected index: "1")');
 new Aggregate($this->getDatabaseName(), $this->getCollectionName(), [1 => ['$match' => ['x' => 1]]]);
 }
 public function testConstructorOptionTypeChecks(array $options) {
 $this->expectException(InvalidArgumentException::class);
 new Aggregate($this->getDatabaseName(), $this->getCollectionName(), [['$match' => ['x' => 1]]], $options);
 }
 public function provideInvalidConstructorOptions() {
 $options = [];
 foreach ($this->getInvalidBooleanValues(true) as $value) {
 $options[][] = ['allowDiskUse' => $value];
 }
 foreach ($this->getInvalidIntegerValues() as $value) {
 $options[][] = ['batchSize' => $value];
 }
 foreach ($this->getInvalidBooleanValues() as $value) {
 $options[][] = ['bypassDocumentValidation' => $value];
 }
 foreach ($this->getInvalidDocumentValues() as $value) {
 $options[][] = ['collation' => $value];
 }
 foreach ($this->getInvalidStringValues() as $value) {
 $options[][] = ['comment' => $value];
 }
 foreach ($this->getInvalidHintValues() as $value) {
 $options[][] = ['hint' => $value];
 }
 foreach ($this->getInvalidBooleanValues() as $value) {
 $options[][] = ['explain' => $value];
 }
 foreach ($this->getInvalidIntegerValues() as $value) {
 $options[][] = ['maxAwaitTimeMS' => $value];
 }
 foreach ($this->getInvalidIntegerValues() as $value) {
 $options[][] = ['maxTimeMS' => $value];
 }
 foreach ($this->getInvalidReadConcernValues() as $value) {
 $options[][] = ['readConcern' => $value];
 }
 foreach ($this->getInvalidReadPreferenceValues() as $value) {
 $options[][] = ['readPreference' => $value];
 }
 foreach ($this->getInvalidSessionValues() as $value) {
 $options[][] = ['session' => $value];
 }
 foreach ($this->getInvalidArrayValues() as $value) {
 $options[][] = ['typeMap' => $value];
 }
 foreach ($this->getInvalidBooleanValues(true) as $value) {
 $options[][] = ['useCursor' => $value];
 }
 foreach ($this->getInvalidWriteConcernValues() as $value) {
 $options[][] = ['writeConcern' => $value];
 }
 return $options;
 }
 public function testConstructorBatchSizeOptionRequiresUseCursor() {
 $this->expectException(InvalidArgumentException::class);
 $this->expectExceptionMessage('"batchSize" option should not be used if "useCursor" is false');
 new Aggregate( $this->getDatabaseName(), $this->getCollectionName(), [['$match' => ['x' => 1]]], ['batchSize' => 100, 'useCursor' => false] );
 }
 private function getInvalidHintValues() {
 return [123, 3.14, true];
 }
 }
 