Skip to content

Commit 1ddda31

Browse files
authored
Enrich spec failure message (#599)
1 parent db02ca7 commit 1ddda31

File tree

2 files changed

+95
-38
lines changed

2 files changed

+95
-38
lines changed

src/Symbol/SymbolRegistry.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Humbug\PhpScoper\Symbol;
66

77
use function array_key_exists;
8+
use function array_keys;
89
use function array_map;
910
use function array_pop;
1011
use function array_unique;
@@ -26,6 +27,7 @@ final class SymbolRegistry
2627
* @var list<string>
2728
*/
2829
private array $regexes;
30+
2931
private bool $constants;
3032

3133
/**
@@ -102,6 +104,26 @@ public function matches(string $symbol): bool
102104
return false;
103105
}
104106

107+
/**
108+
* @internal
109+
*
110+
* @return list<string>
111+
*/
112+
public function getNames(): array
113+
{
114+
return array_keys($this->names);
115+
}
116+
117+
/**
118+
* @internal
119+
*
120+
* @erturn list<string>
121+
*/
122+
public function getRegexes(): array
123+
{
124+
return $this->regexes;
125+
}
126+
105127
/**
106128
* Transforms the constant FQ name "Acme\Foo\X" to "acme\foo\X" since the
107129
* namespace remains case-insensitive for constants regardless of whether

tests/Scoper/PhpScoperSpecTest.php

Lines changed: 73 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use Humbug\PhpScoper\Reflector;
2323
use Humbug\PhpScoper\RegexChecker;
2424
use Humbug\PhpScoper\Symbol\EnrichedReflector;
25+
use Humbug\PhpScoper\Symbol\SymbolRegistry;
2526
use Humbug\PhpScoper\Symbol\SymbolsRegistry;
2627
use Humbug\PhpScoper\Whitelist;
2728
use InvalidArgumentException;
@@ -67,40 +68,37 @@ class PhpScoperSpecTest extends TestCase
6768
'maxPhpVersion',
6869
'title',
6970
ConfigurationKeys::PREFIX_KEYWORD,
70-
ConfigurationKeys::WHITELIST_KEYWORD,
71-
ConfigurationKeys::EXPOSE_GLOBAL_CONSTANTS_KEYWORD,
72-
ConfigurationKeys::EXPOSE_GLOBAL_CLASSES_KEYWORD,
73-
ConfigurationKeys::EXPOSE_GLOBAL_FUNCTIONS_KEYWORD,
74-
ConfigurationKeys::EXPOSE_NAMESPACES_KEYWORD,
75-
ConfigurationKeys::EXPOSE_CONSTANTS_SYMBOLS_KEYWORD,
76-
ConfigurationKeys::EXPOSE_CLASSES_SYMBOLS_KEYWORD,
77-
ConfigurationKeys::EXPOSE_FUNCTIONS_SYMBOLS_KEYWORD,
78-
ConfigurationKeys::EXCLUDE_NAMESPACES_KEYWORD,
79-
ConfigurationKeys::CONSTANTS_INTERNAL_SYMBOLS_KEYWORD,
80-
ConfigurationKeys::CLASSES_INTERNAL_SYMBOLS_KEYWORD,
81-
ConfigurationKeys::FUNCTIONS_INTERNAL_SYMBOLS_KEYWORD,
71+
// SPECS_CONFIG_KEYS included
8272
'expected-recorded-classes',
8373
'expected-recorded-functions',
8474
];
8575

76+
// Keys allowed on a spec level
8677
private const SPECS_SPEC_KEYS = [
8778
ConfigurationKeys::PREFIX_KEYWORD,
79+
// SPECS_CONFIG_KEYS included
80+
'expected-recorded-classes',
81+
'expected-recorded-functions',
82+
'payload',
83+
];
84+
85+
// Keys kept and used to build the symbols configuration
86+
private const SPECS_CONFIG_KEYS = [
8887
ConfigurationKeys::WHITELIST_KEYWORD,
88+
8989
ConfigurationKeys::EXPOSE_GLOBAL_CONSTANTS_KEYWORD,
9090
ConfigurationKeys::EXPOSE_GLOBAL_CLASSES_KEYWORD,
9191
ConfigurationKeys::EXPOSE_GLOBAL_FUNCTIONS_KEYWORD,
92+
9293
ConfigurationKeys::EXPOSE_NAMESPACES_KEYWORD,
93-
ConfigurationKeys::EXPOSE_CONSTANTS_SYMBOLS_KEYWORD,
9494
ConfigurationKeys::EXPOSE_CLASSES_SYMBOLS_KEYWORD,
9595
ConfigurationKeys::EXPOSE_FUNCTIONS_SYMBOLS_KEYWORD,
96+
ConfigurationKeys::EXPOSE_CONSTANTS_SYMBOLS_KEYWORD,
97+
9698
ConfigurationKeys::EXCLUDE_NAMESPACES_KEYWORD,
97-
ConfigurationKeys::EXCLUDE_NAMESPACES_KEYWORD,
98-
ConfigurationKeys::CONSTANTS_INTERNAL_SYMBOLS_KEYWORD,
9999
ConfigurationKeys::CLASSES_INTERNAL_SYMBOLS_KEYWORD,
100100
ConfigurationKeys::FUNCTIONS_INTERNAL_SYMBOLS_KEYWORD,
101-
'expected-recorded-classes',
102-
'expected-recorded-functions',
103-
'payload',
101+
ConfigurationKeys::CONSTANTS_INTERNAL_SYMBOLS_KEYWORD,
104102
];
105103

106104
/**
@@ -213,6 +211,9 @@ public function test_can_scope_valid_files(
213211
$spec,
214212
$contents,
215213
$symbolsConfiguration,
214+
$internalClasses,
215+
$internalFunctions,
216+
$internalConstants,
216217
$symbolsRegistry,
217218
$expected,
218219
$actual,
@@ -311,6 +312,23 @@ private static function createScoper(
311312
*/
312313
private static function parseSpecFile(string $file, array $meta, $fixtureTitle, $fixtureSet): iterable
313314
{
315+
static $specMetaKeys;
316+
static $specKeys;
317+
318+
if (!isset($specMetaKeys)) {
319+
$specMetaKeys = [
320+
...self::SPECS_META_KEYS,
321+
...self::SPECS_CONFIG_KEYS,
322+
];
323+
}
324+
325+
if (!isset($specKeys)) {
326+
$specKeys = [
327+
...self::SPECS_SPEC_KEYS,
328+
...self::SPECS_CONFIG_KEYS,
329+
];
330+
}
331+
314332
$spec = sprintf(
315333
'[%s] %s',
316334
$meta['title'],
@@ -325,7 +343,7 @@ private static function parseSpecFile(string $file, array $meta, $fixtureTitle,
325343
[],
326344
$diff = array_diff(
327345
array_keys($meta),
328-
self::SPECS_META_KEYS
346+
$specMetaKeys,
329347
),
330348
sprintf(
331349
'Expected the keys found in the meta section to be known keys, unknown keys: "%s"',
@@ -338,7 +356,7 @@ private static function parseSpecFile(string $file, array $meta, $fixtureTitle,
338356
[],
339357
$diff = array_diff(
340358
array_keys($fixtureSet),
341-
self::SPECS_SPEC_KEYS
359+
$specKeys,
342360
),
343361
sprintf(
344362
'Expected the keys found in the spec section to be known keys, unknown keys: "%s"',
@@ -377,14 +395,6 @@ private static function createSymbolsConfiguration(
377395
array $meta
378396
): SymbolsConfiguration
379397
{
380-
$configKeys = [
381-
ConfigurationKeys::EXPOSE_GLOBAL_CONSTANTS_KEYWORD,
382-
ConfigurationKeys::EXPOSE_GLOBAL_CLASSES_KEYWORD,
383-
ConfigurationKeys::EXPOSE_GLOBAL_FUNCTIONS_KEYWORD,
384-
ConfigurationKeys::EXCLUDE_NAMESPACES_KEYWORD,
385-
ConfigurationKeys::WHITELIST_KEYWORD,
386-
];
387-
388398
if (is_string($fixtureSet)) {
389399
$fixtureSet = [];
390400
}
@@ -393,7 +403,7 @@ private static function createSymbolsConfiguration(
393403

394404
$config = [];
395405

396-
foreach ($configKeys as $key) {
406+
foreach (self::SPECS_CONFIG_KEYS as $key) {
397407
if (!array_key_exists($key, $mergedConfig)) {
398408
throw new InvalidArgumentException(
399409
sprintf(
@@ -411,6 +421,9 @@ private static function createSymbolsConfiguration(
411421
}
412422

413423
/**
424+
* @param string[] $internalClasses
425+
* @param string[] $internalFunctions
426+
* @param string[] $internalConstants
414427
* @param string[][] $expectedRegisteredClasses
415428
* @param string[][] $expectedRegisteredFunctions
416429
*/
@@ -419,20 +432,27 @@ private static function createSpecMessage(
419432
string $spec,
420433
string $contents,
421434
SymbolsConfiguration $symbolsConfiguration,
435+
array $internalClasses,
436+
array $internalFunctions,
437+
array $internalConstants,
422438
SymbolsRegistry $symbolsRegistry,
423439
?string $expected,
424440
?string $actual,
425441
array $expectedRegisteredClasses,
426442
array $expectedRegisteredFunctions
427443
): string {
428-
// TODO: restore this
429-
//$formattedWhitelist = self::formatSimpleList($whitelist->toArray());
430-
$formattedWhitelist = self::formatSimpleList([]);
431-
432444
$formattedExposeGlobalClasses = self::convertBoolToString($symbolsConfiguration->shouldExposeGlobalClasses());
433445
$formattedExposeGlobalConstants = self::convertBoolToString($symbolsConfiguration->shouldExposeGlobalConstants());
434446
$formattedExposeGlobalFunctions = self::convertBoolToString($symbolsConfiguration->shouldExposeGlobalFunctions());
435447

448+
$formattedClassesToExpose = self::formatSymbolRegistry($symbolsConfiguration->getExposedClasses());
449+
$formattedFunctionsToExpose = self::formatSymbolRegistry($symbolsConfiguration->getExposedFunctions());
450+
$formattedConstantsToExpose = self::formatSymbolRegistry($symbolsConfiguration->getExposedConstants());
451+
452+
$formattedInternalClasses = self::formatSimpleList($internalClasses);
453+
$formattedInternalFunctions = self::formatSimpleList($internalFunctions);
454+
$formattedInternalConstants = self::formatSimpleList($internalConstants);
455+
436456
$formattedExpectedRegisteredClasses = self::formatTupleList($expectedRegisteredClasses);
437457
$formattedExpectedRegisteredFunctions = self::formatTupleList($expectedRegisteredFunctions);
438458

@@ -456,10 +476,17 @@ private static function createSpecMessage(
456476
457477
$titleSeparator
458478
INPUT
459-
whitelist: $formattedWhitelist
460-
whitelist global classes: $formattedExposeGlobalClasses
461-
whitelist global functions: $formattedExposeGlobalFunctions
462-
whitelist global constants: $formattedExposeGlobalConstants
479+
expose global classes: $formattedExposeGlobalClasses
480+
expose global functions: $formattedExposeGlobalFunctions
481+
expose global constants: $formattedExposeGlobalConstants
482+
483+
expose classes: $formattedClassesToExpose
484+
expose functions: $formattedFunctionsToExpose
485+
expose constants: $formattedConstantsToExpose
486+
487+
internal constants: $formattedInternalClasses
488+
internal functions: $formattedInternalFunctions
489+
internal constants: $formattedInternalConstants
463490
$titleSeparator
464491
$contents
465492
@@ -493,7 +520,7 @@ private static function formatSimpleList(array $strings): string
493520
}
494521

495522
if (1 === count($strings)) {
496-
return '['.current($strings).']';
523+
return '[ '.current($strings).' ]';
497524
}
498525

499526
return sprintf(
@@ -545,6 +572,14 @@ private static function convertBoolToString(bool $bool): string
545572
return true === $bool ? 'true' : 'false';
546573
}
547574

575+
private static function formatSymbolRegistry(SymbolRegistry $symbolRegistry): string
576+
{
577+
return self::formatSimpleList([
578+
...$symbolRegistry->getNames(),
579+
...$symbolRegistry->getRegexes(),
580+
]);
581+
}
582+
548583
/**
549584
* @param string[][] $expected
550585
* @param string[][] $actual

0 commit comments

Comments
 (0)