$invalid = new TestIndex();
$t->diag('->get*(), ->set*()');
$t->is($index->getName(), 'TestIndex', '->getName() is initially the name of the class');
$index->setName('foobar');
$t->is($index->getName(), 'foobar', '->setName() changes the name');
$t->isa_ok($index->getServiceRegistry(), 'xfServiceRegistry', '->getServiceRegistry() returns a service registry');
$registry = new xfServiceRegistry();
$index->setServiceRegistry($registry);
$t->is($index->getServiceRegistry(), $registry, '->setServiceRegistry() changes the service registry');
$engine = new xfMockEngine();
$index->setEngine($engine);
$t->is($index->getEngine(), $engine, '->setEngine() changes the engine');
$t->ok(!$index->isSetup(), '->isSetup() is false initially');
$index = new TestIndex();
$registry = new xfServiceRegistry();
$registry->register(new xfService(new xfMockIdentifier()));
$engine = new xfMockEngine();
$index->setServiceRegistry($registry);
$index->setEngine($engine);
$t->diag('->insert(), ->remove()');
$index->insert('foo');
$t->ok($index->isSetup(), '->insert() automatically runs setup');
$t->is(count($engine->getDocuments()), 1, '->insert() adds a document');
$index->remove('foo');
$t->is(count($engine->getDocuments()), 0, '->remove() deletes a document');
try {
    $msg = '->insert() fails if an engine does not exist';
    $invalid->insert('foo');
    $t->fail($msg);
} catch (Exception $e) {
    $t->pass($msg);
require 'util/xfException.class.php';
require 'result/xfResultIterator.class.php';
require 'result/xfDocumentHit.class.php';
require 'result/xfResultException.class.php';
require 'mock/result/xfMockRetort.class.php';
require 'document/xfDocument.class.php';
require 'document/xfField.class.php';
require 'document/xfFieldValue.class.php';
require 'service/xfServiceRegistry.class.php';
require 'service/xfService.class.php';
require 'mock/service/xfMockIdentifier.class.php';
$service = new xfService(new xfMockIdentifier());
$retort = new xfMockRetort();
$service->addRetort($retort);
$registry = new xfServiceRegistry();
$registry->register($service);
$document = new xfDocument('guid');
$document->addField(new xfFieldValue(new xfField('_service', xfField::KEYWORD), 'foobar'));
$hit = new xfDocumentHit($document);
$array = array($hit, 'foo');
$iterator = new xfResultIterator(new ArrayIterator($array), $registry);
$t = new lime_test(9, new lime_output_color());
$t->diag('->current()');
$response = $iterator->current();
$t->isa_ok($response, 'xfDocumentHit', '->current() returns an xfDocumentHit');
$t->is($response->getDocument(), $document, '->current() returns an xfDocumentHit linked to the original document');
$iterator->next();
try {
    $msg = '->current() throws exception if internal iterator does not return an xfDocumentHit';
    $iterator->current();
    $t->fail($msg);