<?php

namespace SilverStripe\Core\Tests;

use SilverStripe\Core\Environment;
use SilverStripe\Dev\SapphireTest;

class EnvironmentTest extends SapphireTest
{
    public function providerTestPutEnv()
    {
        return [
            ['_ENVTEST_BOOL=true', '_ENVTEST_BOOL', true],
            ['_ENVTEST_BOOL_QUOTED="true"', '_ENVTEST_BOOL_QUOTED', 'true'],
            ['_ENVTEST_NUMBER=1', '_ENVTEST_NUMBER', 1],
            ['_ENVTEST_NUMBER_QUOTED="1"', '_ENVTEST_NUMBER_QUOTED', '1'],
            ['_ENVTEST_NUMBER_SPECIAL="value=4"', '_ENVTEST_NUMBER_SPECIAL', 'value=4'],
            ['_ENVTEST_BLANK', '_ENVTEST_BLANK', false],
        ];
    }

    /**
     * @dataProvider providerTestPutenv
     */
    public function testPutEnv($put, $var, $value)
    {
        Environment::putEnv($put);
        $this->assertEquals($value, Environment::getEnv($var));
    }

    /**
     * @dataProvider providerTestPutEnv
     */
    public function testSetEnv($put, $var, $value)
    {
        Environment::setEnv($var, $value);
        $this->assertEquals($value, Environment::getEnv($var));
    }

    public function testRestoreEnv()
    {
        // Set and backup original vars
        Environment::putEnv('_ENVTEST_RESTORED=initial');
        $vars = Environment::getVariables();
        $this->assertEquals('initial', Environment::getEnv('_ENVTEST_RESTORED'));

        // Modify enironment
        Environment::putEnv('_ENVTEST_RESTORED=new');
        $this->assertEquals('initial', $vars['env']['_ENVTEST_RESTORED']);
        $this->assertEquals('new', Environment::getEnv('_ENVTEST_RESTORED'));

        // Restore
        Environment::setVariables($vars);
        $this->assertEquals('initial', Environment::getEnv('_ENVTEST_RESTORED'));
    }

    public function testGetVariables()
    {
        $GLOBALS['test'] = 'global';
        $vars = Environment::getVariables();
        $this->assertArrayHasKey('test', $vars);
        $this->assertEquals('global', $vars['test']);
        $this->assertEquals('global', $GLOBALS['test']);

        $vars['test'] = 'fail';
        $this->assertEquals('fail', $vars['test']);
        $this->assertEquals('global', $GLOBALS['test']);
    }
}