1+ <?php
2+ namespace tester ;
3+
4+ use packager \Event ;
5+ use packager \JavaExec ;
6+ use packager \Vendor ;
7+ use php \lib \arr ;
8+ use php \lib \fs ;
9+ use phpx \parser \ClassRecord ;
10+ use phpx \parser \SourceFile ;
11+ use phpx \parser \SourceManager ;
12+
13+ /**
14+ *
15+ * @jppm-task-prefix tester
16+ *
17+ * @jppm-task run
18+ */
19+ class TesterPlugin
20+ {
21+ /**
22+ * @jppm-need-package
23+ *
24+ * @jppm-denendency-of test
25+ *
26+ * @jppm-description Run all tests.
27+ * @param $event
28+ */
29+ public function run (Event $ event )
30+ {
31+ $ vendor = new Vendor ($ event ->package ()->getConfigVendorPath ());
32+
33+ $ exec = new JavaExec ();
34+ $ exec ->setSystemProperties ([
35+ 'bootstrap.file ' => 'tester/.bootstrap.php '
36+ ]);
37+
38+ $ exec ->addPackageClassPath ($ event ->package ());
39+ $ exec ->addVendorClassPath ($ vendor );
40+ $ exec ->addClassPath ("./tests " );
41+
42+ $ files = fs::scan ("./tests/ " , ['extensions ' => ['php ' ]]);
43+
44+ $ manager = new SourceManager ();
45+
46+ $ testCases = [];
47+
48+ foreach ($ files as $ file ) {
49+ $ source = new SourceFile ($ file , fs::relativize ($ file , "./tests/ " ));
50+ $ source ->update ($ manager );
51+
52+ foreach ($ source ->moduleRecord ->getClasses () as $ class ) {
53+ if ($ this ->isTestCase ($ class , $ testCases )) {
54+ $ testCases [$ class ->name ] = $ class ->name ;
55+ }
56+ }
57+ }
58+
59+ foreach ($ files as $ file ) {
60+ $ source = new SourceFile ($ file , fs::relativize ($ file , "./tests/ " ));
61+ $ source ->update ($ manager );
62+
63+ foreach ($ source ->moduleRecord ->getClasses () as $ class ) {
64+ if ($ testCases [$ class ->name ]) continue ;
65+
66+ if ($ this ->isTestCase ($ class , $ testCases )) {
67+ $ testCases [$ class ->name ] = $ class ->name ;
68+ }
69+ }
70+ }
71+
72+ fs::format ($ vendor ->getDir () . "/tester.json " , [
73+ 'testCases ' => arr::values ($ testCases )
74+ ]);
75+ }
76+
77+ protected function isTestCase (ClassRecord $ record , array $ otherTestCases = [])
78+ {
79+ if ($ record ->parent && !$ record ->abstract && $ record ->type === 'CLASS ' ) {
80+ if ($ record ->parent ->name === 'tester\TestCase ' || $ otherTestCases [$ record ->parent ->name ]) {
81+ return true ;
82+ }
83+ }
84+
85+ return false ;
86+ }
87+ }
0 commit comments