<?php
declare(strict_types=1);
namespace JKingWeb\NewsSync;
require_once __DIR__.DIRECTORY_SEPARATOR."..".DIRECTORY_SEPARATOR."bootstrap.php";

use \org\bovigo\vfs\vfsStream;

trait TestingHelpers {
	function assertException(string $msg, string $prefix = "", string $type = "Exception") {
		$class = NS_BASE . ($prefix !== "" ? str_replace("/", "\\", $prefix) . "\\" : "") . $type;
		$msgID = ($prefix !== "" ? $prefix . "/" : "") . $type. ".$msg";
		if(array_key_exists($msgID, Exception::CODES)) {
			$code = Exception::CODES[$msgID];
		} else {
			$code = 0;
		}
		$this->expectException($class);
		$this->expectExceptionCode($code);
	}
}

trait LanguageTestingHelpers {
	static function setUpBeforeClass() {
		// this is required to keep from having exceptions in Lang::msg() in turn calling Lang::msg() and looping
		Lang\Exception::$test = true;
		// test files
		self::$files = [
			'en.php'    => '<?php return ["Test.presentText" => "and the Philosopher\'s Stone"];',
			'en_ca.php' => '<?php return ["Test.presentText" => "{0} and {1}"];',
			'en_us.php' => '<?php return ["Test.presentText" => "and the Sorcerer\'s Stone"];',
			'fr.php'    => '<?php return ["Test.presentText" => "à l\'école des sorciers"];',
			'ja.php'    => '<?php return ["Test.absentText"  => "賢者の石"];',
			'de.php'    => '<?php return ["Test.presentText" => "und der Stein der Weisen"];',
			'pt_br.php' => '<?php return ["Test.presentText" => "e a Pedra Filosofal"];',
			'vi.php'    => '<?php return [];',
			// corrupt files
			'it.php'    => '<?php return 0;',
			'zh.php'    => '<?php return 0',
			'ko.php'    => 'DEAD BEEF',
			'fr_ca.php' => '',
			// unreadable file
			'ru.php'    => '',
		];
		self::$vfs = vfsStream::setup("langtest", 0777, self::$files);
		self::$path = self::$vfs->url()."/";
		// set up a file without read access
		chmod(self::$path."ru.php", 0000);
		// make the Lang class use the vfs files
		self::$defaultPath = Lang::$path;
		Lang::$path = self::$path;
	}

	static function tearDownAfterClass() {
		Lang\Exception::$test = false;
		Lang::$path = self::$defaultPath;
		self::$path = null;
		self::$vfs = null;
		self::$files = null;
		Lang::set("", true);
		Lang::set(Lang::DEFAULT);
	}
}