Преглед изворни кода

:wrench: estimated bit length was correct, add a safety margin instead

smiley пре 1 година
родитељ
комит
df49b3ffa4
3 измењених фајлова са 14 додато и 6 уклоњено
  1. 4 4
      src/Data/QRData.php
  2. 8 1
      tests/Data/DataInterfaceTestAbstract.php
  3. 2 1
      tests/Data/QRDataTest.php

+ 4 - 4
src/Data/QRData.php

@@ -164,9 +164,9 @@ final class QRData{
 
 			// it seems that in some cases the estimated total length is not 100% accurate,
 			// so we substract 4 bits from the total when not in mixed mode
-#			if(count($this->dataSegments) <= 1){
-#				$length -= 4;
-#			}
+			if(count($this->dataSegments) <= 1){
+				$length -= 4;
+			}
 
 			// we've got a match!
 			// or let's see if there's a higher version number available
@@ -194,7 +194,7 @@ final class QRData{
 
 		// guess the version number within the given range
 		for($version = $this->options->versionMin; $version <= $this->options->versionMax; $version++){
-			if($total <= $this->maxBitsForEcc[$version]){
+			if($total <= ($this->maxBitsForEcc[$version] - 4)){
 				return new Version($version);
 			}
 		}

+ 8 - 1
tests/Data/DataInterfaceTestAbstract.php

@@ -16,6 +16,7 @@ use chillerlan\QRCode\QROptions;
 use chillerlan\QRCodeTest\QRMaxLengthTrait;
 use Exception, Generator;
 use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\ExpectationFailedException;
 use PHPUnit\Framework\TestCase;
 use function array_map, hex2bin, mb_strlen, mb_substr, sprintf, str_repeat, strlen, substr;
 
@@ -178,7 +179,13 @@ abstract class DataInterfaceTestAbstract extends TestCase{
 
 		$minimumVersionNumber = $this->QRData->getMinimumVersion()->getVersionNumber();
 
-		$this::assertSame($version->getVersionNumber(), $minimumVersionNumber);
+		try{
+			$this::assertSame($version->getVersionNumber(), $minimumVersionNumber);
+		}
+		catch(ExpectationFailedException $e){
+			$this::assertSame(($version->getVersionNumber() + 1), $minimumVersionNumber, 'safety margin');
+		}
+
 		// verify the encoded data
 		$this::assertSame($this->dataMode::DATAMODE, $bitBuffer->read(4));
 		$this::assertSame($str, $this->dataMode::decodeSegment($bitBuffer, $minimumVersionNumber));

+ 2 - 1
tests/Data/QRDataTest.php

@@ -86,7 +86,8 @@ final class QRDataTest extends TestCase{
 
 		$qrData = new QRData($options, [new Byte($str)]);
 
-		$this::assertSame(980, $qrData->estimateTotalBitLength());
+		$this::assertSame(976, $qrData->estimateTotalBitLength());
+		$this::assertSame(11, $qrData->getMinimumVersion()->getVersionNumber()); // version adjusted to 11
 	}
 
 }