Commit 9918b971 authored by Jeremy Mikola's avatar Jeremy Mikola

Merge pull request #9 from jmikola/pedantry

Pedantry tests
parents 97ab718e 869c94a1
...@@ -79,44 +79,44 @@ class Client ...@@ -79,44 +79,44 @@ class Client
} }
/** /**
* Select a database. * Select a collection.
* *
* If a write concern or read preference is not specified, the write concern * If a write concern or read preference is not specified, the write concern
* or read preference of the Client will be applied, respectively. * or read preference of the Client will be applied, respectively.
* *
* @param string $databaseName Name of the database to select * @param string $databaseName Name of the database containing the collection
* @param string $collectionName Name of the collection to select
* @param WriteConcern $writeConcern Default write concern to apply * @param WriteConcern $writeConcern Default write concern to apply
* @param ReadPreference $readPreference Default read preference to apply * @param ReadPreference $readPreference Default read preference to apply
* @return Database * @return Collection
*/ */
public function selectDatabase($databaseName, WriteConcern $writeConcern = null, ReadPreference $readPreference = null) public function selectCollection($databaseName, $collectionName, WriteConcern $writeConcern = null, ReadPreference $readPreference = null)
{ {
$namespace = $databaseName . '.' . $collectionName;
// TODO: inherit from Manager options once PHPC-196 is implemented // TODO: inherit from Manager options once PHPC-196 is implemented
$writeConcern = $writeConcern ?: $this->writeConcern; $writeConcern = $writeConcern ?: $this->writeConcern;
$readPreference = $readPreference ?: $this->readPreference; $readPreference = $readPreference ?: $this->readPreference;
return new Database($this->manager, $databaseName, $writeConcern, $readPreference); return new Collection($this->manager, $namespace, $writeConcern, $readPreference);
} }
/** /**
* Select a collection. * Select a database.
* *
* If a write concern or read preference is not specified, the write concern * If a write concern or read preference is not specified, the write concern
* or read preference of the Client will be applied, respectively. * or read preference of the Client will be applied, respectively.
* *
* @param string $databaseName Name of the database containing the collection * @param string $databaseName Name of the database to select
* @param string $collectionName Name of the collection to select
* @param WriteConcern $writeConcern Default write concern to apply * @param WriteConcern $writeConcern Default write concern to apply
* @param ReadPreference $readPreference Default read preference to apply * @param ReadPreference $readPreference Default read preference to apply
* @return Collection * @return Database
*/ */
public function selectCollection($databaseName, $collectionName, WriteConcern $writeConcern = null, ReadPreference $readPreference = null) public function selectDatabase($databaseName, WriteConcern $writeConcern = null, ReadPreference $readPreference = null)
{ {
$namespace = $databaseName . '.' . $collectionName;
// TODO: inherit from Manager options once PHPC-196 is implemented // TODO: inherit from Manager options once PHPC-196 is implemented
$writeConcern = $writeConcern ?: $this->writeConcern; $writeConcern = $writeConcern ?: $this->writeConcern;
$readPreference = $readPreference ?: $this->readPreference; $readPreference = $readPreference ?: $this->readPreference;
return new Collection($this->manager, $namespace, $writeConcern, $readPreference); return new Database($this->manager, $databaseName, $writeConcern, $readPreference);
} }
} }
...@@ -28,53 +28,53 @@ class CollectionInfo ...@@ -28,53 +28,53 @@ class CollectionInfo
} }
/** /**
* Return the collection name. * Return the maximum number of documents to keep in the capped collection.
* *
* @return string * @return integer|null
*/ */
public function getName() public function getCappedMax()
{ {
return (string) $this->info['name']; return isset($this->info['options']['max']) ? (integer) $this->info['options']['max'] : null;
} }
/** /**
* Return the collection options. * Return the maximum size (in bytes) of the capped collection.
* *
* @return array * @return integer|null
*/ */
public function getOptions() public function getCappedSize()
{ {
return isset($this->info['options']) ? (array) $this->info['options'] : array(); return isset($this->info['options']['size']) ? (integer) $this->info['options']['size'] : null;
} }
/** /**
* Return whether the collection is a capped collection. * Return the collection name.
* *
* @return boolean * @return string
*/ */
public function isCapped() public function getName()
{ {
return ! empty($this->info['options']['capped']); return (string) $this->info['name'];
} }
/** /**
* Return the maximum number of documents to keep in the capped collection. * Return the collection options.
* *
* @return integer|null * @return array
*/ */
public function getCappedMax() public function getOptions()
{ {
return isset($this->info['options']['max']) ? (integer) $this->info['options']['max'] : null; return isset($this->info['options']) ? (array) $this->info['options'] : array();
} }
/** /**
* Return the maximum size (in bytes) of the capped collection. * Return whether the collection is a capped collection.
* *
* @return integer|null * @return boolean
*/ */
public function getCappedSize() public function isCapped()
{ {
return isset($this->info['options']['size']) ? (integer) $this->info['options']['size'] : null; return ! empty($this->info['options']['capped']);
} }
/** /**
......
...@@ -40,27 +40,6 @@ class CollectionInfoLegacyIterator extends FilterIterator implements CollectionI ...@@ -40,27 +40,6 @@ class CollectionInfoLegacyIterator extends FilterIterator implements CollectionI
parent::__construct($iterator); parent::__construct($iterator);
} }
/**
* Return the current element as a CollectionInfo instance.
*
* @see CollectionInfoIterator::current()
* @see http://php.net/iterator.current
* @return CollectionInfo
*/
public function current()
{
$info = parent::current();
// Trim the database prefix up to and including the first dot
$firstDot = strpos($info['name'], '.');
if ($firstDot !== false) {
$info['name'] = (string) substr($info['name'], $firstDot + 1);
}
return new CollectionInfo($info);
}
/** /**
* Filter out internal or invalid collections. * Filter out internal or invalid collections.
* *
...@@ -92,4 +71,25 @@ class CollectionInfoLegacyIterator extends FilterIterator implements CollectionI ...@@ -92,4 +71,25 @@ class CollectionInfoLegacyIterator extends FilterIterator implements CollectionI
return true; return true;
} }
/**
* Return the current element as a CollectionInfo instance.
*
* @see CollectionInfoIterator::current()
* @see http://php.net/iterator.current
* @return CollectionInfo
*/
public function current()
{
$info = parent::current();
// Trim the database prefix up to and including the first dot
$firstDot = strpos($info['name'], '.');
if ($firstDot !== false) {
$info['name'] = (string) substr($info['name'], $firstDot + 1);
}
return new CollectionInfo($info);
}
} }
...@@ -26,6 +26,17 @@ class DatabaseInfo ...@@ -26,6 +26,17 @@ class DatabaseInfo
$this->info = $info; $this->info = $info;
} }
/**
* Return the collection info as an array.
*
* @see http://php.net/oop5.magic#language.oop5.magic.debuginfo
* @return array
*/
public function __debugInfo()
{
return $this->info;
}
/** /**
* Return the database name. * Return the database name.
* *
...@@ -55,15 +66,4 @@ class DatabaseInfo ...@@ -55,15 +66,4 @@ class DatabaseInfo
{ {
return (boolean) $this->info['empty']; return (boolean) $this->info['empty'];
} }
/**
* Return the collection info as an array.
*
* @see http://php.net/oop5.magic#language.oop5.magic.debuginfo
* @return array
*/
public function __debugInfo()
{
return $this->info;
}
} }
...@@ -34,6 +34,17 @@ class IndexInfo implements ArrayAccess ...@@ -34,6 +34,17 @@ class IndexInfo implements ArrayAccess
$this->info = $info; $this->info = $info;
} }
/**
* Return the collection info as an array.
*
* @see http://php.net/oop5.magic#language.oop5.magic.debuginfo
* @return array
*/
public function __debugInfo()
{
return $this->info;
}
/** /**
* Return the index key. * Return the index key.
* *
...@@ -157,15 +168,4 @@ class IndexInfo implements ArrayAccess ...@@ -157,15 +168,4 @@ class IndexInfo implements ArrayAccess
{ {
throw new BadMethodCallException('IndexInfo is immutable'); throw new BadMethodCallException('IndexInfo is immutable');
} }
/**
* Return the collection info as an array.
*
* @see http://php.net/oop5.magic#language.oop5.magic.debuginfo
* @return array
*/
public function __debugInfo()
{
return $this->info;
}
} }
...@@ -61,24 +61,24 @@ class IndexInput implements Serializable ...@@ -61,24 +61,24 @@ class IndexInput implements Serializable
} }
/** /**
* Serialize the index information to BSON for index creation. * Return the index name.
* *
* @see MongoDB\Collection::createIndexes() * @param string
* @see http://php.net/bson-serializable.bsonserialize
*/ */
public function bsonSerialize() public function __toString()
{ {
return $this->index; return $this->index['name'];
} }
/** /**
* Return the index name. * Serialize the index information to BSON for index creation.
* *
* @param string * @see MongoDB\Collection::createIndexes()
* @see http://php.net/bson-serializable.bsonserialize
*/ */
public function __toString() public function bsonSerialize()
{ {
return $this->index['name']; return $this->index;
} }
/** /**
......
<?php
namespace MongoDB\Tests;
use ReflectionClass;
use ReflectionMethod;
class CollectionTest extends TestCase
{
public function testMethodOrder()
{
$class = new ReflectionClass('MongoDB\Collection');
$filters = array(
'public' => ReflectionMethod::IS_PUBLIC,
'protected' => ReflectionMethod::IS_PROTECTED,
'private' => ReflectionMethod::IS_PRIVATE,
);
foreach ($filters as $visibility => $filter) {
$methods = array_map(
function(ReflectionMethod $method) { return $method->getName(); },
$class->getMethods($filter)
);
$sortedMethods = $methods;
sort($sortedMethods);
$this->assertEquals($methods, $sortedMethods, sprintf('%s methods are declared alphabetically', ucfirst($visibility)));
}
}
}
<?php
namespace MongoDB\Tests;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use ReflectionClass;
use ReflectionMethod;
use RegexIterator;
/**
* Pedantic tests that have nothing to do with functional correctness.
*/
class PedantryTest extends \PHPUnit_Framework_TestCase
{
/**
* @dataProvider provideProjectClassNames
*/
public function testMethodsAreOrderedAlphabeticallyByVisibility($className)
{
$class = new ReflectionClass($className);
$methods = $class->getMethods();
$methods = array_filter(
$methods,
function(ReflectionMethod $method) use ($class) {
return $method->getDeclaringClass() == $class;
}
);
$getSortValue = function(ReflectionMethod $method) {
if ($method->getModifiers() & ReflectionMethod::IS_PRIVATE) {
return '2' . $method->getName();
}
if ($method->getModifiers() & ReflectionMethod::IS_PROTECTED) {
return '1' . $method->getName();
}
if ($method->getModifiers() & ReflectionMethod::IS_PUBLIC) {
return '0' . $method->getName();
}
};
$sortedMethods = $methods;
usort(
$sortedMethods,
function(ReflectionMethod $a, ReflectionMethod $b) use ($getSortValue) {
return strcasecmp($getSortValue($a), $getSortValue($b));
}
);
$methods = array_map(function(ReflectionMethod $method) { return $method->getName(); }, $methods);
$sortedMethods = array_map(function(ReflectionMethod $method) { return $method->getName(); }, $sortedMethods);
$this->assertEquals($sortedMethods, $methods);
}
public function provideProjectClassNames()
{
$classNames = array();
$srcDir = realpath(__DIR__ . '/../src/');
$files = new RegexIterator(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($srcDir)), '/\.php$/i');
foreach ($files as $file) {
$classNames[][] = 'MongoDB\\' . str_replace(DIRECTORY_SEPARATOR, '\\', substr($file->getRealPath(), strlen($srcDir) + 1, -4));
}
return $classNames;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment