@@ -487,50 +487,32 @@ public function setProcessUncoveredFilesFromWhitelist($flag)
487487 * @param array $linesToBeUsed
488488 * @throws PHP_CodeCoverage_Exception_UnintentionallyCoveredCode
489489 */
490- protected function applyCoversAnnotationFilter (&$ data , $ linesToBeCovered , array $ linesToBeUsed )
490+ protected function applyCoversAnnotationFilter (array &$ data , $ linesToBeCovered , array $ linesToBeUsed )
491491 {
492- if ($ linesToBeCovered === FALSE ) {
492+ if ($ linesToBeCovered === FALSE ||
493+ ($ this ->forceCoversAnnotation && empty ($ linesToBeCovered ))) {
493494 $ data = array ();
494495 return ;
495496 }
496497
497- if (!empty ($ linesToBeCovered )) {
498- $ count = count ($ data );
499- $ data = array_intersect_key ($ data , $ linesToBeCovered );
500-
501- if ($ this ->checkForUnintentionallyCoveredCode &&
502- $ count != count ($ data ) &&
503- empty ($ linesToBeUsed )) {
504- throw new PHP_CodeCoverage_Exception_UnintentionallyCoveredCode ;
505- }
506-
507- foreach (array_keys ($ data ) as $ filename ) {
508- $ _linesToBeCovered = array_flip ($ linesToBeCovered [$ filename ]);
498+ if (empty ($ linesToBeCovered )) {
499+ return ;
500+ }
509501
510- if (isset ( $ linesToBeUsed [ $ filename ]) ) {
511- $ _linesToBeUsed = array_flip ( $ linesToBeUsed [ $ filename ]);
512- } else {
513- $ _linesToBeUsed = FALSE ;
514- }
502+ if ($ this -> checkForUnintentionallyCoveredCode ) {
503+ $ this -> performUnintentionallyCoveredCodeCheck (
504+ $ data , $ linesToBeCovered , $ linesToBeUsed
505+ ) ;
506+ }
515507
516- if ($ this ->checkForUnintentionallyCoveredCode ) {
517- foreach ($ data [$ filename ] as $ k => $ v ) {
518- if ($ v == 1 &&
519- !(isset ($ _linesToBeCovered [$ k ]) ||
520- ($ _linesToBeUsed !== FALSE && isset ($ _linesToBeUsed [$ k ])))) {
521- throw new PHP_CodeCoverage_Exception_UnintentionallyCoveredCode ;
522- }
523- }
524- }
508+ $ data = array_intersect_key ($ data , $ linesToBeCovered );
525509
526- $ data [$ filename ] = array_intersect_key (
527- $ data [$ filename ], $ _linesToBeCovered
528- );
529- }
530- }
510+ foreach (array_keys ($ data ) as $ filename ) {
511+ $ _linesToBeCovered = array_flip ($ linesToBeCovered [$ filename ]);
531512
532- else if ($ this ->forceCoversAnnotation ) {
533- $ data = array ();
513+ $ data [$ filename ] = array_intersect_key (
514+ $ data [$ filename ], $ _linesToBeCovered
515+ );
534516 }
535517 }
536518
@@ -539,7 +521,7 @@ protected function applyCoversAnnotationFilter(&$data, $linesToBeCovered, array
539521 *
540522 * @param array $data
541523 */
542- protected function applyListsFilter (&$ data )
524+ protected function applyListsFilter (array &$ data )
543525 {
544526 foreach (array_keys ($ data ) as $ filename ) {
545527 if ($ this ->filter ->isFiltered ($ filename )) {
@@ -553,7 +535,7 @@ protected function applyListsFilter(&$data)
553535 *
554536 * @param array $data
555537 */
556- protected function applyIgnoredLinesFilter (&$ data )
538+ protected function applyIgnoredLinesFilter (array &$ data )
557539 {
558540 foreach (array_keys ($ data ) as $ filename ) {
559541 if (!$ this ->filter ->isFile ($ filename )) {
@@ -571,9 +553,10 @@ protected function applyIgnoredLinesFilter(&$data)
571553 }
572554
573555 /**
556+ * @param array $data
574557 * @since Method available since Release 1.1.0
575558 */
576- protected function initializeFilesThatAreSeenTheFirstTime ($ data )
559+ protected function initializeFilesThatAreSeenTheFirstTime (array $ data )
577560 {
578561 foreach ($ data as $ file => $ lines ) {
579562 if ($ this ->filter ->isFile ($ file ) && !isset ($ this ->data [$ file ])) {
@@ -816,4 +799,79 @@ protected function getLinesToBeIgnored($filename)
816799
817800 return $ this ->ignoredLines [$ filename ];
818801 }
802+
803+ /**
804+ * @param array $data
805+ * @param array $linesToBeCovered
806+ * @param array $linesToBeUsed
807+ * @throws PHP_CodeCoverage_Exception_UnintentionallyCoveredCode
808+ * @since Method available since Release 1.3.0
809+ */
810+ protected function performUnintentionallyCoveredCodeCheck (array &$ data , array $ linesToBeCovered , array $ linesToBeUsed )
811+ {
812+ $ allowedLines = $ this ->getAllowedLines (
813+ $ linesToBeCovered , $ linesToBeUsed
814+ );
815+
816+ $ message = '' ;
817+
818+ foreach ($ data as $ file => $ _data ) {
819+ foreach ($ _data as $ line => $ flag ) {
820+ if ($ flag == 1 &&
821+ (!isset ($ allowedLines [$ file ]) ||
822+ !isset ($ allowedLines [$ file ][$ line ]))) {
823+ $ message .= sprintf (
824+ '- %s:%d ' . PHP_EOL ,
825+ $ file ,
826+ $ line
827+ );
828+ }
829+ }
830+ }
831+
832+ if (!empty ($ message )) {
833+ throw new PHP_CodeCoverage_Exception_UnintentionallyCoveredCode (
834+ $ message
835+ );
836+ }
837+ }
838+
839+ /**
840+ * @param array $linesToBeCovered
841+ * @param array $linesToBeUsed
842+ * @return array
843+ * @since Method available since Release 1.3.0
844+ */
845+ protected function getAllowedLines (array $ linesToBeCovered , array $ linesToBeUsed )
846+ {
847+ $ allowedLines = array ();
848+
849+ foreach (array_keys ($ linesToBeCovered ) as $ file ) {
850+ if (!isset ($ allowedLines [$ file ])) {
851+ $ allowedLines [$ file ] = array ();
852+ }
853+
854+ $ allowedLines [$ file ] = array_merge (
855+ $ allowedLines [$ file ], $ linesToBeCovered [$ file ]
856+ );
857+ }
858+
859+ foreach (array_keys ($ linesToBeUsed ) as $ file ) {
860+ if (!isset ($ allowedLines [$ file ])) {
861+ $ allowedLines [$ file ] = array ();
862+ }
863+
864+ $ allowedLines [$ file ] = array_merge (
865+ $ allowedLines [$ file ], $ linesToBeUsed [$ file ]
866+ );
867+ }
868+
869+ foreach (array_keys ($ allowedLines ) as $ file ) {
870+ $ allowedLines [$ file ] = array_flip (
871+ array_unique ($ allowedLines [$ file ])
872+ );
873+ }
874+
875+ return $ allowedLines ;
876+ }
819877}
0 commit comments