typeof
[m6w6/seekat] / peridot.php
1 <?php
2
3 use Evenement\EventEmitterInterface as EventEmitter;
4 use Monolog\Handler\AbstractProcessingHandler;
5 use Monolog\Logger;
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;
16 use seekat\API;
17 use Symfony\Component\Console\Input\InputInterface;
18 use Symfony\Component\Console\Output\OutputInterface;
19
20 return function(EventEmitter $emitter) {
21 (new CodeCoverageReporters($emitter))->register();
22
23 $emitter->on('peridot.reporters', function(InputInterface $input, ReporterFactory $reporterFactory) {
24 $reporterFactory->register(
25 'seekat',
26 'Spec + Text Code coverage reporter',
27 function(AnonymousReporter $ar) use ($reporterFactory) {
28
29 return new class($reporterFactory, $ar->getConfiguration(), $ar->getOutput(), $ar->getEventEmitter()) extends AbstractBaseReporter {
30 private $reporters = [];
31 private $factory;
32
33 function __construct(ReporterFactory $factory, Configuration $configuration, OutputInterface $output, EventEmitter $eventEmitter) {
34 $this->factory = $factory;
35 parent::__construct($configuration, $output, $eventEmitter);
36 }
37
38 function init() {
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");
43 }
44 }
45
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);
50 }
51 return $output;
52 }
53 };
54 }
55 );
56 });
57
58 $emitter->on('code-coverage.start', function (AbstractCodeCoverageReporter $reporter) {
59 $reporter->addDirectoryToWhitelist(__DIR__."/lib")
60 ->addDirectoryToWhitelist(__DIR__."/tests");
61 });
62
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");
70 });
71
72 $log = new class extends AbstractProcessingHandler {
73 private $records = [];
74 protected function write(array $record) {
75 $this->records[] = $record["formatted"];
76 }
77 function clean() {
78 $this->records = [];
79 }
80 function dump(OutputInterface $output) {
81 if ($this->records) {
82 $output->writeln(["\n", "Debug log:", "==========="]);
83 $output->write($this->records);
84 $this->clean();
85 }
86 }
87 };
88 $emitter->on("suite.start", function(Suite $suite) use($log) {
89 $headers = [];
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: ");
94 fflush(STDOUT);
95 if (strncasecmp(fgets(STDIN), "Y", 1)) {
96 exit;
97 }
98 } else {
99 throw new Exception("GITHUB_TOKEN is not set in the environment");
100 }
101 $suite->getScope()->api = new API($headers, null, null, new Logger("seekat", [$log]));
102 });
103
104 $emitter->on("test.failed", function(Test $test, \Throwable $e) {
105
106 });
107 $emitter->on("test.passed", function() use($log) {
108 $log->clean();
109 });
110 $emitter->on("peridot.end", function($exitCode, InputInterface $input, OutputInterface $output) use($log) {
111 $log->dump($output);
112 });
113 };