3 use Evenement\EventEmitterInterface
as EventEmitter
;
4 use Monolog\Handler\AbstractProcessingHandler
;
6 use Peridot\Configuration
;
7 use Peridot\Console\Application
;
8 use Peridot\Console\Environment
;
9 use Peridot\Core\Suite
;
10 use Peridot\Core\Test
;
11 use Peridot\Reporter\AbstractBaseReporter
;
12 use Peridot\Reporter\AnonymousReporter
;
13 use Peridot\Reporter\CodeCoverage\AbstractCodeCoverageReporter
;
14 use Peridot\Reporter\CodeCoverageReporters
;
15 use Peridot\Reporter\ReporterFactory
;
17 use Symfony\Component\Console\Input\InputInterface
;
18 use Symfony\Component\Console\Output\OutputInterface
;
20 return function(EventEmitter
$emitter) {
21 (new CodeCoverageReporters($emitter))->register();
23 $emitter->on('peridot.reporters', function(InputInterface
$input, ReporterFactory
$reporterFactory) {
24 $reporterFactory->register(
26 'Spec + Text Code coverage reporter',
27 function(AnonymousReporter
$ar) use ($reporterFactory) {
29 return new class($reporterFactory, $ar->getConfiguration(), $ar->getOutput(), $ar->getEventEmitter()) extends AbstractBaseReporter
{
30 private $reporters = [];
33 function __construct(ReporterFactory
$factory, Configuration
$configuration, OutputInterface
$output, EventEmitter
$eventEmitter) {
34 $this->factory
= $factory;
35 parent
::__construct($configuration, $output, $eventEmitter);
39 fprintf(STDERR
, "Creating reporters\n");
40 $this->reporters
[] = $this->factory
->create("spec");
41 if (extension_loaded("xdebug")) {
42 $this->reporters
[] = $this->factory
->create("text-code-coverage");
46 function X__call($method, array $args) {
47 fprintf(STDERR
, "Calling %s\n", $method);
48 foreach ($this->reporters
as $reporter) {
49 $output = $reporter->$method(...$args);
58 $emitter->on('code-coverage.start', function (AbstractCodeCoverageReporter
$reporter) {
59 $reporter->addDirectoryToWhitelist(__DIR__
."/lib")
60 ->addDirectoryToWhitelist(__DIR__
."/tests");
63 $emitter->on("peridot.start", function(Environment
$env, Application
$app) {
64 $app->setCatchExceptions(false);
65 $definition = $env->getDefinition();
66 $definition->getArgument("path")
67 ->setDefault(implode(" ", glob("tests/*")));
68 $definition->getOption("reporter")
69 ->setDefault("seekat");
72 $log = new class extends AbstractProcessingHandler
{
73 private $records = [];
74 protected function write(array $record) {
75 $this->records
[] = $record["formatted"];
80 function dump(OutputInterface
$output) {
82 $output->writeln(["\n", "Debug log:", "==========="]);
83 $output->write($this->records
);
88 $emitter->on("suite.start", function(Suite
$suite) use($log) {
90 if (($token = getenv("GITHUB_TOKEN"))) {
91 $headers["Authorization"] = "token $token";
92 } elseif (function_exists("posix_isatty") && defined("STDIN") && posix_isatty(STDIN
)) {
93 fprintf(STDOUT
, "GITHUB_TOKEN is not set in the environment, enter Y to continue without: ");
95 if (strncasecmp(fgets(STDIN
), "Y", 1)) {
99 throw new Exception("GITHUB_TOKEN is not set in the environment");
101 $suite->getScope()->api
= new API($headers, null, null, new Logger("seekat", [$log]));
104 $emitter->on("test.failed", function(Test
$test, \Throwable
$e) {
107 $emitter->on("test.passed", function() use($log) {
110 $emitter->on("peridot.end", function($exitCode, InputInterface
$input, OutputInterface
$output) use($log) {