silverstripe-framework/src/Dev/State/KernelTestState.php

95 lines
1.8 KiB
PHP

<?php
namespace SilverStripe\Dev\State;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Kernel;
use SilverStripe\Dev\TestKernel;
use SilverStripe\Dev\SapphireTest;
/**
* Handles nesting of kernel before / after tests
*/
class KernelTestState implements TestState
{
/**
* Stack of kernels
*
* @var TestKernel[]
*/
protected $kernels = [];
/**
* Get active Kernel instance
*
* @return \SilverStripe\Dev\TestKernel
*/
protected function kernel()
{
return end($this->kernels);
}
/**
* Called on setup
*
* @param SapphireTest $test
*/
public function setUp(SapphireTest $test)
{
$this->nest();
}
/**
* Called on tear down
*
* @param SapphireTest $test
*/
public function tearDown(SapphireTest $test)
{
$this->unnest();
}
/**
* Called once on setup
*
* @param string $class Class being setup
*/
public function setUpOnce($class)
{
// If first run, get initial kernel
if (empty($this->kernels)) {
$this->kernels[] = Injector::inst()->get(Kernel::class);
}
$this->nest();
}
/**
* Called once on tear down
*
* @param string $class Class being torn down
*/
public function tearDownOnce($class)
{
$this->unnest();
}
/**
* Nest the current kernel
*/
protected function nest()
{
// Reset state
$this->kernel()->reset();
$this->kernels[] = $this->kernel()->nest();
}
protected function unnest()
{
// Unnest and reset
array_pop($this->kernels);
$this->kernel()->activate();
$this->kernel()->reset();
}
}