203 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?PHP
 | |
| /**
 | |
|  * Tests for PUQI.
 | |
|  *
 | |
|  * @author Joshua Ramon Enslin <joshua@museum-digital.de>
 | |
|  */
 | |
| declare(strict_types = 1);
 | |
| 
 | |
| use PHPUnit\Framework\TestCase;
 | |
| use PHPUnit\Framework\Attributes\DataProvider;
 | |
| use PHPUnit\Framework\Attributes\CoversClass;
 | |
| use PHPUnit\Framework\Attributes\Small;
 | |
| 
 | |
| /**
 | |
|  * Tests for PUQI.
 | |
|  */
 | |
| #[small]
 | |
| #[CoversClass(\MDPuqi::class)]
 | |
| final class MDPuqiTest extends TestCase {
 | |
|     /**
 | |
|      * Provider for licenses.
 | |
|      *
 | |
|      * @return Generator<array{0: string, 1: MDPuqiMessageStatus, 2: bool}>
 | |
|      */
 | |
|     public static function licenseProvider():Generator {
 | |
| 
 | |
|         yield 'Empty' => ['', MDPuqiMessageStatus::warning, false];
 | |
|         yield 'Open' => ['CC0', MDPuqiMessageStatus::praise, true];
 | |
|         yield 'Open Attr' => ['CC BY', MDPuqiMessageStatus::praise, true];
 | |
|         yield 'Closed' => ['RR-F', MDPuqiMessageStatus::warning, false];
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Provider for image sizes. 0: width, 1: height, 2: expected status, 3: expected score.
 | |
|      *
 | |
|      * @return Generator<array{0: int, 1: int, 2: MDPuqiMessageStatus, 3: int}>
 | |
|      */
 | |
|     public static function imgSizesProvider():Generator {
 | |
| 
 | |
|         yield 'Both too small' => [MDPuqi::THRESHOLD_IMG_TOO_SMALL - 1, MDPuqi::THRESHOLD_IMG_TOO_SMALL - 1, MDPuqiMessageStatus::warning, MDPuqi::QI_PENALTY_IMAGE_TOO_SMALL];
 | |
|         yield 'Width too small' => [MDPuqi::THRESHOLD_IMG_TOO_SMALL - 1, MDPuqi::THRESHOLD_IMG_TOO_SMALL, MDPuqiMessageStatus::warning, MDPuqi::QI_PENALTY_IMAGE_SMALL];
 | |
|         yield 'Height too small' => [MDPuqi::THRESHOLD_IMG_TOO_SMALL, MDPuqi::THRESHOLD_IMG_TOO_SMALL - 1, MDPuqiMessageStatus::warning, MDPuqi::QI_PENALTY_IMAGE_SMALL];
 | |
| 
 | |
|         yield 'Both small' => [MDPuqi::THRESHOLD_IMG_SMALL - 1, MDPuqi::THRESHOLD_IMG_SMALL - 1, MDPuqiMessageStatus::warning, MDPuqi::QI_PENALTY_IMAGE_SMALL];
 | |
| 
 | |
|         yield 'Both good sized' => [MDPuqi::THRESHOLD_IMG_GOOD_SIZE_SHORTER + 1, MDPuqi::THRESHOLD_IMG_GOOD_SIZE_LONGER + 1, MDPuqiMessageStatus::praise, MDPuqi::QI_REWARD_IMAGE_SIZE_LARGE];
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Test for license.
 | |
|      *
 | |
|      * @param string              $input         Input string.
 | |
|      * @param MDPuqiMessageStatus $warningStatus Expected message status.
 | |
|      * @param boolean             $positive      Positive or negative result.
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     #[DataProvider('licenseProvider')]
 | |
|     public function testMetadataLicensesResultInExpectedAccessment(string $input, MDPuqiMessageStatus $warningStatus, bool $positive):void {
 | |
| 
 | |
|         $tlLoader = new MDTlLoader("abc", "en");
 | |
|         $puqi = new MDPuqi($tlLoader);
 | |
|         $puqi->checkMetadataLicense($input);
 | |
|         $msgs = $puqi->getMessages();
 | |
| 
 | |
|         self::assertEquals(1, count($msgs));
 | |
|         $msg = $msgs[0];
 | |
| 
 | |
|         self::assertEquals($warningStatus, $msg->status);
 | |
|         $score = $puqi->getScore();
 | |
|         self::assertEquals($positive, $score > 0, "Expected score to be positive or negative, got the oppite result. Score is: " . $score);
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Test for license.
 | |
|      *
 | |
|      * @param string              $input         Input string.
 | |
|      * @param MDPuqiMessageStatus $warningStatus Expected message status.
 | |
|      * @param boolean             $positive      Positive or negative result.
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     #[DataProvider('licenseProvider')]
 | |
|     public function testImageLicensesResultInExpectedAccessment(string $input, MDPuqiMessageStatus $warningStatus, bool $positive):void {
 | |
| 
 | |
|         $puqi = new MDPuqi(new MDTlLoader("abc", "en"));
 | |
|         $puqi->checkImageLicenses([['license' => $input, 'rightsholder' => 'Somebody']]);
 | |
|         $msgs = $puqi->getMessages();
 | |
| 
 | |
|         self::assertEquals(1, count($msgs));
 | |
|         $msg = $msgs[0];
 | |
| 
 | |
|         self::assertEquals($warningStatus, $msg->status);
 | |
|         $score = $puqi->getScore();
 | |
|         self::assertEquals($positive, $score > 0, "Expected score to be positive or negative, got the oppite result. Score is: " . $score);
 | |
| 
 | |
|         // Get score. Having the same 100 times should not inflate the score.
 | |
|         $expectedMaxScore = $score * MDPuqi::THRESHOLD_MANY_IMAGES;
 | |
| 
 | |
|         $puqi = new MDPuqi(new MDTlLoader("abc", "en"));
 | |
| 
 | |
|         $inp = [];
 | |
|         for ($i = 0; $i < MDPuqi::THRESHOLD_MANY_IMAGES * 10; $i++) {
 | |
|             $inp[] = ['license' => $input, 'rightsholder' => 'Somebody'];
 | |
|         }
 | |
|         $puqi->checkImageLicenses($inp);
 | |
|         self::assertEquals($expectedMaxScore, $puqi->getScore(), "Expected max. score to be stopped from increasing by threshold. It was not.");
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Test for image sizes.
 | |
|      *
 | |
|      * @param integer             $width          Width.
 | |
|      * @param integer             $height         Height.
 | |
|      * @param MDPuqiMessageStatus $expectedStatus Expected message status.
 | |
|      * @param integer             $expectedScore  Expected score.
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     #[DataProvider('imgSizesProvider')]
 | |
|     public function testImageSizesResultInExpectedAccessment(int $width, int $height, MDPuqiMessageStatus $expectedStatus, int $expectedScore):void {
 | |
| 
 | |
|         $puqi = new MDPuqi(new MDTlLoader("abc", "en"));
 | |
|         $puqi->checkImageSizes([['width' => $width, 'height' => $height]]);
 | |
|         $msgs = $puqi->getMessages();
 | |
| 
 | |
|         self::assertEquals(1, count($msgs));
 | |
|         $msg = $msgs[0];
 | |
| 
 | |
|         self::assertEquals($expectedStatus, $msg->status);
 | |
|         self::assertEquals($expectedScore, $puqi->getScore());
 | |
| 
 | |
|         // Get score. Having the same 100 times should not inflate the score.
 | |
|         $expectedMaxScore = $expectedScore * MDPuqi::THRESHOLD_MANY_IMAGES;
 | |
| 
 | |
|         $puqi = new MDPuqi(new MDTlLoader("abc", "en"));
 | |
|         $inp = [];
 | |
|         for ($i = 0; $i < MDPuqi::THRESHOLD_MANY_IMAGES * 10; $i++) {
 | |
|             $inp[] = ['width' => $width, 'height' => $height];
 | |
|         }
 | |
|         $puqi->checkImageSizes($inp);
 | |
|         self::assertEquals($expectedMaxScore, $puqi->getScore(), "Expected max. score to be stopped from increasing by threshold. It was not.");
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Test that more than ten images do not result in inflated score.
 | |
|      * Case: checkImageCount.
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     public function testManyImagesDoesNotInflateScoreByCount():void {
 | |
| 
 | |
|         $puqi = new MDPuqi(new MDTlLoader("abc", "en"));
 | |
|         $puqi->checkImageCount(500);
 | |
|         $msgs = $puqi->getMessages();
 | |
| 
 | |
|         $score = $puqi->getScore();
 | |
|         self::assertEquals(MDPuqi::THRESHOLD_MANY_IMAGES * MDPuqi::QI_REWARD_IMGS_RESOURCES_MULTIPLIER, $score, "Image count eval: Score differs from expected. Messages: " . var_export($puqi->getMessages(), true));
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Data provider for tag.
 | |
|      * 0: Input number of tags.
 | |
|      * 1: Expected score.
 | |
|      *
 | |
|      * @return Generator<array{0: int, 1: int}>
 | |
|      */
 | |
|     public static function tagNoAndScoreProvider():Generator {
 | |
| 
 | |
|         yield 'No tags' => [0, 0 + MDPuqi::QI_PENALTY_NO_TAG];
 | |
|         yield 'One tag' => [1, 0 + MDPuqi::QI_PENALTY_ONLY_ONE_TAG];
 | |
|         yield 'Two tag' => [2, 0 + MDPuqi::QI_PENALTY_ONLY_TWO_TAG];
 | |
|         yield 'Regular number of tags' => [5, 0 + 5 * MDPuqi::QI_REWARD_TAGS_MULTIPLIER];
 | |
|         yield 'Number of tags above threshold' => [MDPuqi::THRESHOLD_TAGS_TOO_MANY + 1, 0 + MDPuqi::THRESHOLD_TAGS_TOO_MANY * MDPuqi::QI_REWARD_TAGS_MULTIPLIER + 1 * MDPuqi::QI_REWARD_TAGS_MULTIPLIER_ABOVE_THRESHOLD];
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Test for tag evaluation.
 | |
|      *
 | |
|      * @param integer $noOfTags      Input number of tags.
 | |
|      * @param integer $expectedScore Expected score.
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     #[DataProvider('tagNoAndScoreProvider')]
 | |
|     public function testTagEvaluation(int $noOfTags, int $expectedScore):void {
 | |
| 
 | |
|         $puqi = new MDPuqi(new MDTlLoader("abc", "en"));
 | |
|         $puqi->checkEvents([], [], [], [], $noOfTags);
 | |
| 
 | |
|         $score = $puqi->getScore();
 | |
|         self::assertEquals(MDPuqi::QI_PENALTY_NO_EVENTS + $expectedScore, $score, "Tag eval: Score differs from expected. Messages: " . var_export($puqi->getMessages(), true));
 | |
| 
 | |
|     }
 | |
| }
 |