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
@@ -50,6 +53,7 @@ public function build(ReflectionClass $theClass, string $methodName, array $grou
5053 $ this ->shouldTestMethodBeRunInSeparateProcess ($ className , $ methodName ),
5154 $ this ->shouldGlobalStateBePreserved ($ className , $ methodName ),
5255 $ this ->shouldAllTestMethodsOfTestClassBeRunInSingleSeparateProcess ($ className ),
56+ $ this ->shouldForkIfPossible ($ className , $ methodName ),
5357 $ this ->backupSettings ($ className , $ methodName ),
5458 $ groups ,
5559 );
@@ -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 ,
@@ -99,6 +104,7 @@ private function buildDataProviderTestSuite(string $methodName, string $classNam
99104 $ runTestInSeparateProcess ,
100105 $ preserveGlobalState ,
101106 $ runClassInSeparateProcess ,
107+ $ forkIfPossible ,
102108 $ backupSettings ,
103109 );
104110
@@ -111,7 +117,7 @@ private function buildDataProviderTestSuite(string $methodName, string $classNam
111117 /**
112118 * @psalm-param array{backupGlobals: ?bool, backupGlobalsExcludeList: list<string>, backupStaticProperties: ?bool, backupStaticPropertiesExcludeList: array<string,list<string>>} $backupSettings
113119 */
114- private function configureTestCase (TestCase $ test , bool $ runTestInSeparateProcess , ?bool $ preserveGlobalState , bool $ runClassInSeparateProcess , array $ backupSettings ): void
120+ private function configureTestCase (TestCase $ test , bool $ runTestInSeparateProcess , ?bool $ preserveGlobalState , bool $ runClassInSeparateProcess , bool $ forkIfPossible , array $ backupSettings ): void
115121 {
116122 if ($ runTestInSeparateProcess ) {
117123 $ test ->setRunTestInSeparateProcess (true );
@@ -121,6 +127,10 @@ private function configureTestCase(TestCase $test, bool $runTestInSeparateProces
121127 $ test ->setRunClassInSeparateProcess (true );
122128 }
123129
130+ if ($ forkIfPossible ) {
131+ $ test ->setForkIfPossible (true );
132+ }
133+
124134 if ($ preserveGlobalState !== null ) {
125135 $ test ->setPreserveGlobalState ($ preserveGlobalState );
126136 }
@@ -273,4 +283,50 @@ private function shouldAllTestMethodsOfTestClassBeRunInSingleSeparateProcess(str
273283 {
274284 return MetadataRegistry::parser ()->forClass ($ className )->isRunClassInSeparateProcess ()->isNotEmpty ();
275285 }
286+
287+ /**
288+ * @psalm-param class-string $className
289+ * @psalm-param non-empty-string $methodName
290+ */
291+ private function shouldForkIfPossible (string $ className , string $ methodName ): bool
292+ {
293+ $ metadataForMethod = MetadataRegistry::parser ()->forMethod ($ className , $ methodName );
294+
295+ if ($ metadataForMethod ->isRunInSeparateProcess ()->isNotEmpty ()) {
296+ $ metadata = $ metadataForMethod ->isRunInSeparateProcess ()->asArray ()[0 ];
297+
298+ assert ($ metadata instanceof RunInSeparateProcess);
299+
300+ $ forkIfPossible = $ metadata ->forkIfPossible ();
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+ if ($ forkIfPossible !== null ) {
315+ return $ forkIfPossible ;
316+ }
317+ }
318+
319+ if ($ metadataForClass ->isRunClassInSeparateProcess ()->isNotEmpty ()) {
320+ $ metadata = $ metadataForClass ->isRunClassInSeparateProcess ()->asArray ()[0 ];
321+
322+ assert ($ metadata instanceof RunClassInSeparateProcess);
323+
324+ $ forkIfPossible = $ metadata ->forkIfPossible ();
325+ if ($ forkIfPossible !== null ) {
326+ return $ forkIfPossible ;
327+ }
328+ }
329+
330+ return false ;
331+ }
276332}
0 commit comments