<?php
 namespace MongoDB\Tests\Operation;
 use MongoDB\Operation\Count;
 use MongoDB\Operation\CreateIndexes;
 use MongoDB\Operation\InsertMany;
 use MongoDB\Tests\CommandObserver;
 use function version_compare;
 class CountFunctionalTest extends FunctionalTestCase {
 public function testDefaultReadConcernIsOmitted() {
 (new CommandObserver())->observe( function () {
 $operation = new Count( $this->getDatabaseName(), $this->getCollectionName(), [], ['readConcern' => $this->createDefaultReadConcern()] );
 $operation->execute($this->getPrimaryServer());
 }
, function (array $event) {
 $this->assertObjectNotHasAttribute('readConcern', $event['started']->getCommand());
 }
 );
 }
 public function testHintOption() {
 $insertMany = new InsertMany($this->getDatabaseName(), $this->getCollectionName(), [ ['x' => 1], ['x' => 2], ['y' => 3], ]);
 $insertMany->execute($this->getPrimaryServer());
 $createIndexes = new CreateIndexes($this->getDatabaseName(), $this->getCollectionName(), [ ['key' => ['x' => 1], 'sparse' => true, 'name' => 'sparse_x'], ['key' => ['y' => 1]], ]);
 $createIndexes->execute($this->getPrimaryServer());
 $hintsUsingSparseIndex = [ ['x' => 1], 'sparse_x', ];
 $filter = ['_id' => ['$exists' => true]];
 foreach ($hintsUsingSparseIndex as $hint) {
 $operation = new Count($this->getDatabaseName(), $this->getCollectionName(), $filter, ['hint' => $hint]);
 $this->assertSame(2, $operation->execute($this->getPrimaryServer()));
 }
 $hintsNotUsingSparseIndex = [ ['_id' => 1], ['y' => 1], 'y_1', ];
 foreach ($hintsNotUsingSparseIndex as $hint) {
 $operation = new Count($this->getDatabaseName(), $this->getCollectionName(), $filter, ['hint' => $hint]);
 $this->assertSame(3, $operation->execute($this->getPrimaryServer()));
 }
 }
 public function testSessionOption() {
 if (version_compare($this->getServerVersion(), '3.6.0', '<')) {
 $this->markTestSkipped('Sessions are not supported');
 }
 (new CommandObserver())->observe( function () {
 $operation = new Count( $this->getDatabaseName(), $this->getCollectionName(), [], ['session' => $this->createSession()] );
 $operation->execute($this->getPrimaryServer());
 }
, function (array $event) {
 $this->assertObjectHasAttribute('lsid', $event['started']->getCommand());
 }
 );
 }
 }
 