Browse Source

MIME group tests

remotes/origin/master
J. King 4 years ago
parent
commit
319b634e67
  1. 2
      lib/MimeType.php
  2. 52
      tests/cases/MimeTypeTest.php
  3. 100
      tests/cases/mime-groups.json
  4. 0
      tests/cases/std/README
  5. 0
      tests/cases/std/generated-mime-types.json
  6. 0
      tests/cases/std/mime-types.json

2
lib/MimeType.php

@ -103,7 +103,7 @@ PATTERN;
case "isImage":
return $this->type === "image";
case "isJavascript":
return (bool) preg_match("<^(?:(?:text|application)/(?:(?:x-)?(?:ecma|java)script)|text/(?:livescript|jscript|javascript1\.[1-5]))$>", $this->essence());
return (bool) preg_match("<^(?:(?:text|application)/(?:(?:x-)?(?:ecma|java)script)|text/(?:livescript|jscript|javascript1\.[0-5]))$>", $this->essence());
case "isJson":
return substr($this->subtype, -5) === "+json" || preg_match("<^(?:text|application)/json$>", $this->essence());
case "isScriptable":

52
tests/cases/MimeTypeTest.php

@ -20,7 +20,7 @@ class MimeTypeTest extends \PHPUnit\Framework\TestCase {
}
public function provideStandardTests(): iterable {
foreach (new \GlobIterator(__DIR__."/*.json", \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::KEY_AS_FILENAME) as $file => $path) {
foreach (new \GlobIterator(__DIR__."/std/*.json", \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::KEY_AS_FILENAME) as $file => $path) {
$indexOffset = 0;
$description = "";
foreach (json_decode(file_get_contents($path)) as $index => $test) {
@ -40,6 +40,56 @@ class MimeTypeTest extends \PHPUnit\Framework\TestCase {
}
}
/** @dataProvider provideMimeTypeGroups */
public function testDetermineMimeTypeGroups(string $type, array $booleans): void {
$t = Mime::parse($type);
foreach ($booleans as $prop => $exp) {
$this->assertSame($exp, $t->$prop, "Property $prop does not match expectation");
}
}
public function provideMimeTypeGroups(): iterable {
$propMap = [
'image' => "isImage",
'audio or video' => "isAudioVideo",
'font' => "isFont",
'ZIP-based' => "isZipBased",
'archive' => "isArchive",
'XML' => "isXml",
'HTML' => "isHtml",
'scriptable' => "isScriptable",
'JavaScript' => "isJavascript",
'JSON' => "isJson",
];
foreach (new \GlobIterator(__DIR__."/mime-groups.json", \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::KEY_AS_FILENAME) as $file => $path) {
$indexOffset = 0;
$description = "";
foreach (json_decode(file_get_contents($path)) as $index => $test) {
if (is_string($test)) {
// the array member is a description of the next member
// the index offset should be decremented, the description stored, and this entry skipped
$indexOffset--;
$description = $test;
continue;
} else {
$index += $indexOffset;
$description = $description ? ": $description" : "";
$input = $test->type;
unset($test->type);
$output = [];
foreach ((array) $test as $k => $v) {
$prop = $propMap[$k] ?? null;
assert(!is_null($prop), "Key '$k' is not mapped");
$output[$prop] = $v;
}
yield "$file #$index$description" => [$input, $output];
$description = null;
}
}
}
}
public function testDecodeAByteString(): void {
// set up the test with the Intl extension
$input = "";

100
tests/cases/mime-groups.json

@ -1,3 +1,97 @@
{
"text/plain": {"image": false, "audioVideo": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "scriptable": false, "JavaScript": false, "JSON": false}
}
[
{"type": "image/png", "image": true, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "image/x", "image": true, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "audio/mp4", "image": false, "audio or video": true, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "video/mpeg", "image": false, "audio or video": true, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "audio/x", "image": false, "audio or video": true, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "video/x", "image": false, "audio or video": true, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "application/ogg", "image": false, "audio or video": true, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "font/woff", "image": false, "audio or video": false, "font": true, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "font/x", "image": false, "audio or video": false, "font": true, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "application/font-cff", "image": false, "audio or video": false, "font": true, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "application/font-off", "image": false, "audio or video": false, "font": true, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "application/font-sfnt", "image": false, "audio or video": false, "font": true, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "application/font-ttf", "image": false, "audio or video": false, "font": true, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "application/font-woff", "image": false, "audio or video": false, "font": true, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "application/vnd.ms-fontobject", "image": false, "audio or video": false, "font": true, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "application/vnd.ms-opentype", "image": false, "audio or video": false, "font": true, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/x+zip", "image": false, "audio or video": false, "font": false, "ZIP-based": true, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/+zip", "image": false, "audio or video": false, "font": false, "ZIP-based": true, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
"application/zip also matches the archive group",
{"type": "application/zip", "image": false, "audio or video": false, "font": false, "ZIP-based": true, "archive": true, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "application/x-rar-compressed", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": true, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
"application/zip also matches the ZIP-based group",
{"type": "application/zip", "image": false, "audio or video": false, "font": false, "ZIP-based": true, "archive": true, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "application/x-gzip", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": true, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
"XML is also scriptable",
{"type": "x/x+xml", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": true, "HTML": false, "scriptable": true, "JavaScript": false, "JSON": false},
{"type": "x/+xml", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": true, "HTML": false, "scriptable": true, "JavaScript": false, "JSON": false},
{"type": "application/xml", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": true, "HTML": false, "scriptable": true, "JavaScript": false, "JSON": false},
{"type": "text/xml", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": true, "HTML": false, "scriptable": true, "JavaScript": false, "JSON": false},
"HTML is scriptable",
{"type": "text/html", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": true, "scriptable": true, "JavaScript": false, "JSON": false},
"XHTML is not considered HTML",
{"type": "application/xhtml+xml", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": true, "HTML": false, "scriptable": true, "JavaScript": false, "JSON": false},
"PDF is scriptable",
{"type": "application/pdf", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": true, "JavaScript": false, "JSON": false},
{"type": "application/ecmascript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "application/javascript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "application/x-ecmascript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "application/x-javascript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "text/ecmascript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "text/javascript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "text/javascript1.0", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "text/javascript1.1", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "text/javascript1.2", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "text/javascript1.3", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "text/javascript1.4", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "text/javascript1.5", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "text/jscript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "text/livescript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "text/x-ecmascript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "text/x-javascript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": true, "JSON": false},
{"type": "x/x+json", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": true},
{"type": "x/+json", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": true},
{"type": "application/json", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": true},
{"type": "text/json", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": true},
"Sanity check",
{"type": "x/x", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/png", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/audio", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/video", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/ogg", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/woff", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/font-ttf", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/zip", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/x-gzip", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/x-rar-compressed", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x+zip/x", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/xml", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x+xml/x", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/html", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/ecmascript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/javascript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/x-ecmascript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/x-javascript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/jscript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/livescript", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/javascript1.0", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/javascript1.1", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/javascript1.2", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/javascript1.3", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/javascript1.4", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/javascript1.5", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/json", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x+json/x", "image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
"SVG is both image and XML, thus also scriptable",
{"type": "image/svg+xml", "image": true, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": true, "HTML": false, "scriptable": true, "JavaScript": false, "JSON": false},
"Hypothetical SVGfont type",
{"type": "font/svg+xml", "image": false, "audio or video": false, "font": true, "ZIP-based": false, "archive": false, "XML": true, "HTML": false, "scriptable": true, "JavaScript": false, "JSON": false},
"Subtype longer than 255",
{"type": "x/01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789+zip",
"image": false, "audio or video": false, "font": false, "ZIP-based": true, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": false},
{"type": "x/01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789+xml",
"image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": true, "HTML": false, "scriptable": true, "JavaScript": false, "JSON": false},
{"type": "x/01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789+json",
"image": false, "audio or video": false, "font": false, "ZIP-based": false, "archive": false, "XML": false, "HTML": false, "scriptable": false, "JavaScript": false, "JSON": true}
]

0
tests/cases/README → tests/cases/std/README

0
tests/cases/generated-mime-types.json → tests/cases/std/generated-mime-types.json

0
tests/cases/mime-types.json → tests/cases/std/mime-types.json

Loading…
Cancel
Save