<?php
 namespace MongoDB\Tests\Model;
 use MongoDB\Exception\BadMethodCallException;
 use MongoDB\Model\IndexInfo;
 use MongoDB\Tests\TestCase;
 class IndexInfoTest extends TestCase {
 public function testBasicIndex() {
 $info = new IndexInfo([ 'v' => 1, 'key' => ['x' => 1], 'name' => 'x_1', 'ns' => 'foo.bar', ]);
 $this->assertSame(1, $info->getVersion());
 $this->assertSame(['x' => 1], $info->getKey());
 $this->assertSame('x_1', $info->getName());
 $this->assertSame('foo.bar', $info->getNamespace());
 $this->assertFalse($info->is2dSphere());
 $this->assertFalse($info->isGeoHaystack());
 $this->assertFalse($info->isSparse());
 $this->assertFalse($info->isText());
 $this->assertFalse($info->isTtl());
 $this->assertFalse($info->isUnique());
 }
 public function testSparseIndex() {
 $info = new IndexInfo([ 'v' => 1, 'key' => ['y' => 1], 'name' => 'y_sparse', 'ns' => 'foo.bar', 'sparse' => true, ]);
 $this->assertSame(1, $info->getVersion());
 $this->assertSame(['y' => 1], $info->getKey());
 $this->assertSame('y_sparse', $info->getName());
 $this->assertSame('foo.bar', $info->getNamespace());
 $this->assertFalse($info->is2dSphere());
 $this->assertFalse($info->isGeoHaystack());
 $this->assertTrue($info->isSparse());
 $this->assertFalse($info->isText());
 $this->assertFalse($info->isTtl());
 $this->assertFalse($info->isUnique());
 }
 public function testUniqueIndex() {
 $info = new IndexInfo([ 'v' => 1, 'key' => ['z' => 1], 'name' => 'z_unique', 'ns' => 'foo.bar', 'unique' => true, ]);
 $this->assertSame(1, $info->getVersion());
 $this->assertSame(['z' => 1], $info->getKey());
 $this->assertSame('z_unique', $info->getName());
 $this->assertSame('foo.bar', $info->getNamespace());
 $this->assertFalse($info->is2dSphere());
 $this->assertFalse($info->isGeoHaystack());
 $this->assertFalse($info->isSparse());
 $this->assertFalse($info->isText());
 $this->assertFalse($info->isTtl());
 $this->assertTrue($info->isUnique());
 }
 public function testTtlIndex() {
 $info = new IndexInfo([ 'v' => 1, 'key' => ['z' => 1], 'name' => 'z_unique', 'ns' => 'foo.bar', 'expireAfterSeconds' => 100, ]);
 $this->assertSame(1, $info->getVersion());
 $this->assertSame(['z' => 1], $info->getKey());
 $this->assertSame('z_unique', $info->getName());
 $this->assertSame('foo.bar', $info->getNamespace());
 $this->assertFalse($info->is2dSphere());
 $this->assertFalse($info->isGeoHaystack());
 $this->assertFalse($info->isSparse());
 $this->assertFalse($info->isText());
 $this->assertTrue($info->isTtl());
 $this->assertFalse($info->isUnique());
 $this->assertArrayHasKey('expireAfterSeconds', $info);
 $this->assertSame(100, $info['expireAfterSeconds']);
 }
 public function testDebugInfo() {
 $expectedInfo = [ 'v' => 1, 'key' => ['x' => 1], 'name' => 'x_1', 'ns' => 'foo.bar', ];
 $info = new IndexInfo($expectedInfo);
 $this->assertSame($expectedInfo, $info->__debugInfo());
 }
 public function testImplementsArrayAccess() {
 $info = new IndexInfo([ 'v' => 1, 'key' => ['x' => 1], 'name' => 'x_1', 'ns' => 'foo.bar', ]);
 $this->assertInstanceOf('ArrayAccess', $info);
 $this->assertArrayHasKey('name', $info);
 $this->assertSame('x_1', $info['name']);
 }
 public function testOffsetSetCannotBeCalled() {
 $info = new IndexInfo([ 'v' => 1, 'key' => ['x' => 1], 'name' => 'x_1', 'ns' => 'foo.bar', ]);
 $this->expectException(BadMethodCallException::class);
 $this->expectExceptionMessage(IndexInfo::class . ' is immutable');
 $info['v'] = 2;
 }
 public function testOffsetUnsetCannotBeCalled() {
 $info = new IndexInfo([ 'v' => 1, 'key' => ['x' => 1], 'name' => 'x_1', 'ns' => 'foo.bar', ]);
 $this->expectException(BadMethodCallException::class);
 $this->expectExceptionMessage(IndexInfo::class . ' is immutable');
 unset($info['v']);
 }
 public function testIs2dSphere() {
 $info = new IndexInfo([ 'v' => 2, 'key' => ['pos' => '2dsphere'], 'name' => 'pos_2dsphere', 'ns' => 'foo.bar', ]);
 $this->assertSame(2, $info->getVersion());
 $this->assertSame(['pos' => '2dsphere'], $info->getKey());
 $this->assertSame('pos_2dsphere', $info->getName());
 $this->assertSame('foo.bar', $info->getNamespace());
 $this->assertTrue($info->is2dSphere());
 $this->assertFalse($info->isGeoHaystack());
 $this->assertFalse($info->isSparse());
 $this->assertFalse($info->isText());
 $this->assertFalse($info->isTtl());
 $this->assertFalse($info->isUnique());
 }
 public function testIsGeoHaystack() {
 $info = new IndexInfo([ 'v' => 2, 'key' => ['pos2' => 'geoHaystack', 'x' => 1], 'name' => 'pos2_geoHaystack_x_1', 'ns' => 'foo.bar', ]);
 $this->assertSame(2, $info->getVersion());
 $this->assertSame(['pos2' => 'geoHaystack', 'x' => 1], $info->getKey());
 $this->assertSame('pos2_geoHaystack_x_1', $info->getName());
 $this->assertSame('foo.bar', $info->getNamespace());
 $this->assertFalse($info->is2dSphere());
 $this->assertTrue($info->isGeoHaystack());
 $this->assertFalse($info->isSparse());
 $this->assertFalse($info->isText());
 $this->assertFalse($info->isTtl());
 $this->assertFalse($info->isUnique());
 }
 public function testIsText() {
 $info = new IndexInfo([ 'v' => 2, 'key' => ['_fts' => 'text', '_ftsx' => 1], 'name' => 'title_text_description_text', 'ns' => 'foo.bar', ]);
 $this->assertSame(2, $info->getVersion());
 $this->assertSame(['_fts' => 'text', '_ftsx' => 1], $info->getKey());
 $this->assertSame('title_text_description_text', $info->getName());
 $this->assertSame('foo.bar', $info->getNamespace());
 $this->assertFalse($info->is2dSphere());
 $this->assertFalse($info->isGeoHaystack());
 $this->assertFalse($info->isSparse());
 $this->assertTrue($info->isText());
 $this->assertFalse($info->isTtl());
 $this->assertFalse($info->isUnique());
 }
 }
 