Files
MDQualityAssessment/tests/MDPuqiTest.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:}>
*/
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));
}
}