blob: e4401e6885f6f4ff48bed2b76c1a8336db67fe60 [file] [log] [blame]
<?php
/**
* Driver library base class unit test
*/
class Driver_test extends CI_TestCase {
/**
* Set up test framework
*/
public function set_up()
{
// Set our subclass prefix
$this->subclass = 'Mock_Libraries_';
$this->ci_set_config('subclass_prefix', $this->subclass);
// Mock Loader->get_package_paths
$paths = 'get_package_paths';
$ldr = $this->getMockBuilder('CI_Loader')->setMethods(array($paths))->getMock();
$ldr->expects($this->any())->method($paths)->will($this->returnValue(array(APPPATH, BASEPATH)));
$this->ci_instance_var('load', $ldr);
// Create mock driver library
$this->name = 'Driver';
$this->lib = new Mock_Libraries_Driver();
}
/**
* Test driver child loading
*/
public function test_load_driver()
{
// Create driver file
$driver = 'basic';
$file = $this->name.'_'.$driver;
$class = 'CI_'.$file;
$prop = 'called';
$content = '<?php class '.$class.' extends CI_Driver { public $'.$prop.' = FALSE; '.
'public function decorate($parent) { $this->'.$prop.' = TRUE; } }';
$this->ci_vfs_create($file, $content, $this->ci_base_root, array('libraries', $this->name, 'drivers'));
// Make driver valid
$this->lib->driver_list($driver);
// Load driver
$this->assertNotNull($this->lib->load_driver($driver));
// Did lib name get set?
$this->assertEquals($this->name, $this->lib->get_name());
// Was driver loaded?
$this->assertObjectHasAttribute($driver, $this->lib);
$this->assertAttributeInstanceOf($class, $driver, $this->lib);
$this->assertAttributeInstanceOf('CI_Driver', $driver, $this->lib);
// Was decorate called?
$this->assertObjectHasAttribute($prop, $this->lib->$driver);
$this->assertTrue($this->lib->$driver->$prop);
// Do we get an error for an invalid driver?
$driver = 'unlisted';
$this->setExpectedException('RuntimeException', 'CI Error: Invalid driver requested: '.$this->name.'_'.$driver);
$this->lib->load_driver($driver);
}
/**
* Test loading lowercase from app path
*/
public function test_load_app_driver()
{
// Create driver file
$driver = 'lowpack';
$file = $this->name.'_'.$driver;
$class = 'CI_'.$file;
$content = '<?php class '.$class.' extends CI_Driver { }';
$this->ci_vfs_create($file, $content, $this->ci_app_root,
array('libraries', $this->name, 'drivers'));
// Make valid list
$nodriver = 'absent';
$this->lib->driver_list(array($driver, $nodriver));
// Load driver
$this->assertNotNull($this->lib->load_driver($driver));
// Was driver loaded?
$this->assertObjectHasAttribute($driver, $this->lib);
$this->assertAttributeInstanceOf($class, $driver, $this->lib);
$this->assertAttributeInstanceOf('CI_Driver', $driver, $this->lib);
// Do we get an error for a non-existent driver?
$this->setExpectedException('RuntimeException', 'CI Error: Unable to load the requested driver: CI_'.
$this->name.'_'.$nodriver);
$this->lib->load_driver($nodriver);
}
/**
* Test loading driver extension
*/
public function test_load_driver_ext()
{
// Create base file
$driver = 'extend';
$base = $this->name.'_'.$driver;
$baseclass = 'CI_'.$base;
$content = '<?php class '.$baseclass.' extends CI_Driver { }';
$this->ci_vfs_create($base, $content, $this->ci_base_root, array('libraries', $this->name, 'drivers'));
// Create driver file
$class = $this->subclass.$base;
$content = '<?php class '.$class.' extends '.$baseclass.' { }';
$this->ci_vfs_create($class, $content, $this->ci_app_root, array('libraries', $this->name, 'drivers'));
// Make valid list
$this->lib->driver_list($driver);
// Load driver
$this->assertNotNull($this->lib->load_driver($driver));
// Was driver loaded?
$this->assertObjectHasAttribute($driver, $this->lib);
$this->assertAttributeInstanceOf($class, $driver, $this->lib);
$this->assertAttributeInstanceOf($baseclass, $driver, $this->lib);
$this->assertAttributeInstanceOf('CI_Driver', $driver, $this->lib);
// Create driver extension without base
$driver = 'baseless';
$base = $this->name.'_'.$driver;
$class = $this->subclass.$base;
$content = '<?php class '.$class.' extends CI_Driver { }';
$this->ci_vfs_create($class, $content, $this->ci_app_root, array('libraries', $this->name, 'drivers'));
$this->lib->driver_list($driver);
// Do we get an error when base class isn't found?
$this->setExpectedException('RuntimeException', 'CI Error: Unable to load the requested class: CI_'.$base);
$this->lib->load_driver($driver);
}
/**
* Test decorating driver with parent attributes
*/
public function test_decorate()
{
// Create parent with a method and property to access
$pclass = 'Test_Parent';
$prop = 'parent_prop';
$value = 'initial';
$method = 'parent_func';
$return = 'func return';
$code = 'class '.$pclass.' { public $'.$prop.' = \''.$value.'\'; '.
'public function '.$method.'() { return \''.$return.'\'; } }';
eval($code);
$parent = new $pclass();
// Create child driver to decorate
$class = 'Test_Driver';
eval('class '.$class.' extends CI_Driver { }');
$child = new $class();
// Decorate child
$child->decorate($parent);
// Do we get the initial parent property value?
$this->assertEquals($value, $child->$prop);
// Can we change the parent property?
$newval = 'changed';
$child->$prop = $newval;
$this->assertEquals($newval, $parent->$prop);
// Do we get back the updated value?
$this->assertEquals($newval, $child->$prop);
// Can we call the parent method?
$this->assertEquals($return, $child->$method());
}
}