1919use PHPUnit \Metadata \ExcludeStaticPropertyFromBackup ;
2020use PHPUnit \Metadata \Parser \Registry as MetadataRegistry ;
2121use PHPUnit \Metadata \PreserveGlobalState ;
22+ use PHPUnit \Metadata \RunClassInSeparateProcess ;
23+ use PHPUnit \Metadata \RunInSeparateProcess ;
24+ use PHPUnit \Metadata \RunTestsInSeparateProcesses ;
2225use PHPUnit \TextUI \Configuration \Registry as ConfigurationRegistry ;
2326use ReflectionClass ;
2427
@@ -51,6 +54,7 @@ public function build(ReflectionClass $theClass, string $methodName, array $grou
5154 $ this ->shouldTestMethodBeRunInSeparateProcess ($ className , $ methodName ),
5255 $ this ->shouldGlobalStateBePreserved ($ className , $ methodName ),
5356 $ this ->shouldAllTestMethodsOfTestClassBeRunInSingleSeparateProcess ($ className ),
57+ $ this ->shouldForkIfPossible ($ className , $ methodName ),
5458 $ this ->backupSettings ($ className , $ methodName ),
5559 $ groups ,
5660 );
@@ -64,6 +68,7 @@ public function build(ReflectionClass $theClass, string $methodName, array $grou
6468 $ this ->shouldTestMethodBeRunInSeparateProcess ($ className , $ methodName ),
6569 $ this ->shouldGlobalStateBePreserved ($ className , $ methodName ),
6670 $ this ->shouldAllTestMethodsOfTestClassBeRunInSingleSeparateProcess ($ className ),
71+ $ this ->shouldForkIfPossible ($ className , $ methodName ),
6772 $ this ->backupSettings ($ className , $ methodName ),
6873 );
6974
@@ -76,7 +81,7 @@ public function build(ReflectionClass $theClass, string $methodName, array $grou
7681 * @psalm-param array{backupGlobals: ?bool, backupGlobalsExcludeList: list<string>, backupStaticProperties: ?bool, backupStaticPropertiesExcludeList: array<string,list<string>>} $backupSettings
7782 * @psalm-param list<non-empty-string> $groups
7883 */
79- private function buildDataProviderTestSuite (string $ methodName , string $ className , array $ data , bool $ runTestInSeparateProcess , ?bool $ preserveGlobalState , bool $ runClassInSeparateProcess , array $ backupSettings , array $ groups ): DataProviderTestSuite
84+ private function buildDataProviderTestSuite (string $ methodName , string $ className , array $ data , bool $ runTestInSeparateProcess , ?bool $ preserveGlobalState , bool $ runClassInSeparateProcess , bool $ forkIfPossible , array $ backupSettings , array $ groups ): DataProviderTestSuite
8085 {
8186 $ dataProviderTestSuite = DataProviderTestSuite::empty (
8287 $ className . ':: ' . $ methodName ,
@@ -98,6 +103,7 @@ private function buildDataProviderTestSuite(string $methodName, string $classNam
98103 $ runTestInSeparateProcess ,
99104 $ preserveGlobalState ,
100105 $ runClassInSeparateProcess ,
106+ $ forkIfPossible ,
101107 $ backupSettings ,
102108 );
103109
@@ -110,7 +116,7 @@ private function buildDataProviderTestSuite(string $methodName, string $classNam
110116 /**
111117 * @psalm-param array{backupGlobals: ?bool, backupGlobalsExcludeList: list<string>, backupStaticProperties: ?bool, backupStaticPropertiesExcludeList: array<string,list<string>>} $backupSettings
112118 */
113- private function configureTestCase (TestCase $ test , bool $ runTestInSeparateProcess , ?bool $ preserveGlobalState , bool $ runClassInSeparateProcess , array $ backupSettings ): void
119+ private function configureTestCase (TestCase $ test , bool $ runTestInSeparateProcess , ?bool $ preserveGlobalState , bool $ runClassInSeparateProcess , bool $ forkIfPossible , array $ backupSettings ): void
114120 {
115121 if ($ runTestInSeparateProcess ) {
116122 $ test ->setRunTestInSeparateProcess (true );
@@ -120,6 +126,10 @@ private function configureTestCase(TestCase $test, bool $runTestInSeparateProces
120126 $ test ->setRunClassInSeparateProcess (true );
121127 }
122128
129+ if ($ forkIfPossible ) {
130+ $ test ->setForkIfPossible (true );
131+ }
132+
123133 if ($ preserveGlobalState !== null ) {
124134 $ test ->setPreserveGlobalState ($ preserveGlobalState );
125135 }
@@ -272,4 +282,53 @@ private function shouldAllTestMethodsOfTestClassBeRunInSingleSeparateProcess(str
272282 {
273283 return MetadataRegistry::parser ()->forClass ($ className )->isRunClassInSeparateProcess ()->isNotEmpty ();
274284 }
285+
286+ /**
287+ * @psalm-param class-string $className
288+ * @psalm-param non-empty-string $methodName
289+ */
290+ private function shouldForkIfPossible (string $ className , string $ methodName ): bool
291+ {
292+ $ metadataForMethod = MetadataRegistry::parser ()->forMethod ($ className , $ methodName );
293+
294+ if ($ metadataForMethod ->isRunInSeparateProcess ()->isNotEmpty ()) {
295+ $ metadata = $ metadataForMethod ->isRunInSeparateProcess ()->asArray ()[0 ];
296+
297+ assert ($ metadata instanceof RunInSeparateProcess);
298+
299+ $ forkIfPossible = $ metadata ->forkIfPossible ();
300+
301+ if ($ forkIfPossible !== null ) {
302+ return $ forkIfPossible ;
303+ }
304+ }
305+
306+ $ metadataForClass = MetadataRegistry::parser ()->forClass ($ className );
307+
308+ if ($ metadataForClass ->isRunTestsInSeparateProcesses ()->isNotEmpty ()) {
309+ $ metadata = $ metadataForClass ->isRunTestsInSeparateProcesses ()->asArray ()[0 ];
310+
311+ assert ($ metadata instanceof RunTestsInSeparateProcesses);
312+
313+ $ forkIfPossible = $ metadata ->forkIfPossible ();
314+
315+ if ($ forkIfPossible !== null ) {
316+ return $ forkIfPossible ;
317+ }
318+ }
319+
320+ if ($ metadataForClass ->isRunClassInSeparateProcess ()->isNotEmpty ()) {
321+ $ metadata = $ metadataForClass ->isRunClassInSeparateProcess ()->asArray ()[0 ];
322+
323+ assert ($ metadata instanceof RunClassInSeparateProcess);
324+
325+ $ forkIfPossible = $ metadata ->forkIfPossible ();
326+
327+ if ($ forkIfPossible !== null ) {
328+ return $ forkIfPossible ;
329+ }
330+ }
331+
332+ return false ;
333+ }
275334}
0 commit comments