Skip to content

Instantly share code, notes, and snippets.

@o0h
Last active May 28, 2024 16:12
Show Gist options
  • Save o0h/fe9bf8d952362bf7332d41462335bc73 to your computer and use it in GitHub Desktop.
Save o0h/fe9bf8d952362bf7332d41462335bc73 to your computer and use it in GitHub Desktop.
Compare the differences in assertion methods provided across two versions of PHPUnit
assertion new?
assertObjectHasProperty new
assertObjectNotHasProperty new
assertFileMatchesFormat new
assertFileMatchesFormatFile new
assertArrayHasKey exists
assertArrayNotHasKey exists
assertIsList exists
assertContains exists
assertContainsEquals exists
assertNotContains exists
assertNotContainsEquals exists
assertContainsOnly exists
assertContainsOnlyInstancesOf exists
assertNotContainsOnly exists
assertCount exists
assertNotCount exists
assertEquals exists
assertEqualsCanonicalizing exists
assertEqualsIgnoringCase exists
assertEqualsWithDelta exists
assertNotEquals exists
assertNotEqualsCanonicalizing exists
assertNotEqualsIgnoringCase exists
assertNotEqualsWithDelta exists
assertObjectEquals exists
assertEmpty exists
assertNotEmpty exists
assertGreaterThan exists
assertGreaterThanOrEqual exists
assertLessThan exists
assertLessThanOrEqual exists
assertFileEquals exists
assertFileEqualsCanonicalizing exists
assertFileEqualsIgnoringCase exists
assertFileNotEquals exists
assertFileNotEqualsCanonicalizing exists
assertFileNotEqualsIgnoringCase exists
assertStringEqualsFile exists
assertStringEqualsFileCanonicalizing exists
assertStringEqualsFileIgnoringCase exists
assertStringNotEqualsFile exists
assertStringNotEqualsFileCanonicalizing exists
assertStringNotEqualsFileIgnoringCase exists
assertIsReadable exists
assertIsNotReadable exists
assertIsWritable exists
assertIsNotWritable exists
assertDirectoryExists exists
assertDirectoryDoesNotExist exists
assertDirectoryIsReadable exists
assertDirectoryIsNotReadable exists
assertDirectoryIsWritable exists
assertDirectoryIsNotWritable exists
assertFileExists exists
assertFileDoesNotExist exists
assertFileIsReadable exists
assertFileIsNotReadable exists
assertFileIsWritable exists
assertFileIsNotWritable exists
assertTrue exists
assertNotTrue exists
assertFalse exists
assertNotFalse exists
assertNull exists
assertNotNull exists
assertFinite exists
assertInfinite exists
assertNan exists
assertSame exists
assertNotSame exists
assertInstanceOf exists
assertNotInstanceOf exists
assertIsArray exists
assertIsBool exists
assertIsFloat exists
assertIsInt exists
assertIsNumeric exists
assertIsObject exists
assertIsResource exists
assertIsClosedResource exists
assertIsString exists
assertIsScalar exists
assertIsCallable exists
assertIsIterable exists
assertIsNotArray exists
assertIsNotBool exists
assertIsNotFloat exists
assertIsNotInt exists
assertIsNotNumeric exists
assertIsNotObject exists
assertIsNotResource exists
assertIsNotClosedResource exists
assertIsNotString exists
assertIsNotScalar exists
assertIsNotCallable exists
assertIsNotIterable exists
assertMatchesRegularExpression exists
assertDoesNotMatchRegularExpression exists
assertSameSize exists
assertNotSameSize exists
assertStringContainsStringIgnoringLineEndings exists
assertStringEqualsStringIgnoringLineEndings exists
assertStringMatchesFormat exists
assertStringNotMatchesFormat exists
assertStringMatchesFormatFile exists
assertStringNotMatchesFormatFile exists
assertStringStartsWith exists
assertStringStartsNotWith exists
assertStringContainsString exists
assertStringContainsStringIgnoringCase exists
assertStringNotContainsString exists
assertStringNotContainsStringIgnoringCase exists
assertStringEndsWith exists
assertStringEndsNotWith exists
assertXmlFileEqualsXmlFile exists
assertXmlFileNotEqualsXmlFile exists
assertXmlStringEqualsXmlFile exists
assertXmlStringNotEqualsXmlFile exists
assertXmlStringEqualsXmlString exists
assertXmlStringNotEqualsXmlString exists
assertThat exists
assertJson exists
assertJsonStringEqualsJsonString exists
assertJsonStringNotEqualsJsonString exists
assertJsonStringEqualsJsonFile exists
assertJsonStringNotEqualsJsonFile exists
assertJsonFileEqualsJsonFile exists
assertJsonFileNotEqualsJsonFile exists
assertion new?
assertArrayIsEqualToArrayOnlyConsideringListOfKeys new
assertArrayIsEqualToArrayIgnoringListOfKeys new
assertArrayIsIdenticalToArrayOnlyConsideringListOfKeys new
assertArrayIsIdenticalToArrayIgnoringListOfKeys new
assertObjectHasProperty new
assertObjectNotHasProperty new
assertFileMatchesFormat new
assertFileMatchesFormatFile new
assertArrayHasKey exists
assertArrayNotHasKey exists
assertIsList exists
assertContains exists
assertContainsEquals exists
assertNotContains exists
assertNotContainsEquals exists
assertContainsOnly exists
assertContainsOnlyInstancesOf exists
assertNotContainsOnly exists
assertCount exists
assertNotCount exists
assertEquals exists
assertEqualsCanonicalizing exists
assertEqualsIgnoringCase exists
assertEqualsWithDelta exists
assertNotEquals exists
assertNotEqualsCanonicalizing exists
assertNotEqualsIgnoringCase exists
assertNotEqualsWithDelta exists
assertObjectEquals exists
assertEmpty exists
assertNotEmpty exists
assertGreaterThan exists
assertGreaterThanOrEqual exists
assertLessThan exists
assertLessThanOrEqual exists
assertFileEquals exists
assertFileEqualsCanonicalizing exists
assertFileEqualsIgnoringCase exists
assertFileNotEquals exists
assertFileNotEqualsCanonicalizing exists
assertFileNotEqualsIgnoringCase exists
assertStringEqualsFile exists
assertStringEqualsFileCanonicalizing exists
assertStringEqualsFileIgnoringCase exists
assertStringNotEqualsFile exists
assertStringNotEqualsFileCanonicalizing exists
assertStringNotEqualsFileIgnoringCase exists
assertIsReadable exists
assertIsNotReadable exists
assertIsWritable exists
assertIsNotWritable exists
assertDirectoryExists exists
assertDirectoryDoesNotExist exists
assertDirectoryIsReadable exists
assertDirectoryIsNotReadable exists
assertDirectoryIsWritable exists
assertDirectoryIsNotWritable exists
assertFileExists exists
assertFileDoesNotExist exists
assertFileIsReadable exists
assertFileIsNotReadable exists
assertFileIsWritable exists
assertFileIsNotWritable exists
assertTrue exists
assertNotTrue exists
assertFalse exists
assertNotFalse exists
assertNull exists
assertNotNull exists
assertFinite exists
assertInfinite exists
assertNan exists
assertSame exists
assertNotSame exists
assertInstanceOf exists
assertNotInstanceOf exists
assertIsArray exists
assertIsBool exists
assertIsFloat exists
assertIsInt exists
assertIsNumeric exists
assertIsObject exists
assertIsResource exists
assertIsClosedResource exists
assertIsString exists
assertIsScalar exists
assertIsCallable exists
assertIsIterable exists
assertIsNotArray exists
assertIsNotBool exists
assertIsNotFloat exists
assertIsNotInt exists
assertIsNotNumeric exists
assertIsNotObject exists
assertIsNotResource exists
assertIsNotClosedResource exists
assertIsNotString exists
assertIsNotScalar exists
assertIsNotCallable exists
assertIsNotIterable exists
assertMatchesRegularExpression exists
assertDoesNotMatchRegularExpression exists
assertSameSize exists
assertNotSameSize exists
assertStringContainsStringIgnoringLineEndings exists
assertStringEqualsStringIgnoringLineEndings exists
assertStringMatchesFormat exists
assertStringNotMatchesFormat exists
assertStringMatchesFormatFile exists
assertStringNotMatchesFormatFile exists
assertStringStartsWith exists
assertStringStartsNotWith exists
assertStringContainsString exists
assertStringContainsStringIgnoringCase exists
assertStringNotContainsString exists
assertStringNotContainsStringIgnoringCase exists
assertStringEndsWith exists
assertStringEndsNotWith exists
assertXmlFileEqualsXmlFile exists
assertXmlFileNotEqualsXmlFile exists
assertXmlStringEqualsXmlFile exists
assertXmlStringNotEqualsXmlFile exists
assertXmlStringEqualsXmlString exists
assertXmlStringNotEqualsXmlString exists
assertThat exists
assertJson exists
assertJsonStringEqualsJsonString exists
assertJsonStringNotEqualsJsonString exists
assertJsonStringEqualsJsonFile exists
assertJsonStringNotEqualsJsonFile exists
assertJsonFileEqualsJsonFile exists
assertJsonFileNotEqualsJsonFile exists
<?php declare(strict_types=1);
assert(array_key_exists('GITHUB_TOKEN', $_SERVER));
const TARGET_VERSIONS = [11 => '11.1.3', 10 => '10.0.0'];
const DOWNLOAD_DIR = __DIR__ . '/artifacts';
if (!is_dir(DOWNLOAD_DIR) && !mkdir(DOWNLOAD_DIR, 0700, true)) {
throw new RuntimeException('Failed to create directory: ' . DOWNLOAD_DIR);
} elseif (!is_writable(DOWNLOAD_DIR)) {
chmod(DOWNLOAD_DIR, 0700);
}
$packageJson = file_get_contents('https://repo.packagist.org/p2/phpunit/phpunit.json');
$packages = json_decode($packageJson, true);
$requestContext = stream_context_create([
'http' => [
'header' => [
'User-Agent: php-program',
"Authorization: token {$_SERVER['GITHUB_TOKEN']}"
],
],
]);
foreach ($packages['packages']['phpunit/phpunit'] as $versionedPackage) {
$fullVersion = $versionedPackage['version'];
if (!in_array($fullVersion, TARGET_VERSIONS, true)) {
continue;
}
if (glob(DOWNLOAD_DIR . "/{$fullVersion}/**/composer.json")) {
continue;
}
$dist = $versionedPackage['dist']['url'];
$tmpFile = tempnam(sys_get_temp_dir(), 'zip');
file_put_contents($tmpFile, file_get_contents($dist, context: $requestContext));
$zip = new ZipArchive();
$zip->open($tmpFile);
$zip->extractTo(DOWNLOAD_DIR . '/' . $fullVersion);
$zip->close();
unlink($tmpFile);
}
$versionAssertions = [];
foreach (TARGET_VERSIONS as $majorVersion => $fullVersion) {
$rootDir = glob(DOWNLOAD_DIR . "/{$fullVersion}/*", GLOB_ONLYDIR)[0];
$srcPath = "{$rootDir}/src/Framework/Assert.php";
$src = str_replace(
'namespace PHPUnit\Framework;',
"namespace PHPUnit{$majorVersion}\\Framework;",
file_get_contents($srcPath)
);
eval(substr($src, 5));
$reflection = new ReflectionClass("\\PHPUnit{$majorVersion}\\Framework\\Assert");
$methods = $reflection->getMethods();
$versionAssertions[$majorVersion] = [];
foreach ($methods as $method) {
$methodName = $method->getName();
if (!str_starts_with($methodName, 'assert')) {
continue;
}
$versionAssertions[$majorVersion][] = $methodName;
}
}
$targetVersions = TARGET_VERSIONS;
arsort($targetVersions);
$newer = key($targetVersions);
$assertions = array_fill_keys($versionAssertions[$newer], '0. new');
foreach ($versionAssertions[10] as $assertion) {
if (array_key_exists($assertion, $assertions)) {
$assertions[$assertion] = '1. exists';
} else {
$assertions[$assertion] = '2. removed';
}
}
asort($assertions);
$op = new SplFileObject(__DIR__ . '/README.md', 'w');
$op->fwrite('| assertion | new? |' . PHP_EOL);
$op->fwrite('| --- | --- |' . PHP_EOL);
foreach ($assertions as $assertion => $status) {
$status = substr($status, 3);
$op->fwrite("| {$assertion} | {$status} |" . PHP_EOL);
}
unset($op);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment