*/ 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 */ 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 */ 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 */ 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)); } }