protected function setup()
{
// Set config
$this->refConfig = new ReflectionProperty(OptionalPackages::class, 'config');
$this->refConfig->setAccessible(true);
$this->refConfig->setValue(require 'src/ExpressiveInstaller/config.php');
$this->io = $this->prophesize('Composer\\IO\\IOInterface');
// Set composer.json
$composerFile = Factory::getComposerFile();
$json = new JsonFile($composerFile);
$localConfig = $json->read();
$this->refComposerDefinition = new ReflectionProperty(OptionalPackages::class, 'composerDefinition');
$this->refComposerDefinition->setAccessible(true);
$this->refComposerDefinition->setValue($localConfig);
// Load parsed package data
$manager = $this->prophesize(RepositoryManager::class);
$composerConfig = new Config();
$composerConfig->merge(['repositories' => ['packagist' => false]]);
$loader = new RootPackageLoader($manager->reveal(), $composerConfig);
$package = $loader->load($localConfig);
// Set package data
$this->refComposerRequires = new ReflectionProperty(OptionalPackages::class, 'composerRequires');
$this->refComposerRequires->setAccessible(true);
$this->refComposerRequires->setValue($package->getRequires());
$this->refComposerDevRequires = new ReflectionProperty(OptionalPackages::class, 'composerDevRequires');
$this->refComposerDevRequires->setAccessible(true);
$this->refComposerDevRequires->setValue($package->getDevRequires());
$this->refStabilityFlags = new ReflectionProperty(OptionalPackages::class, 'stabilityFlags');
$this->refStabilityFlags->setAccessible(true);
$this->refStabilityFlags->setValue($package->getStabilityFlags());
// Set project root
$this->refProjectRoot = new ReflectionProperty(OptionalPackages::class, 'projectRoot');
$this->refProjectRoot->setAccessible(true);
$this->refProjectRoot->setValue(realpath(dirname($composerFile)));
// Cleanup old install files
$this->cleanup();
}