forked from hhvm/hhast
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStepBasedMigrationTest.hack
More file actions
56 lines (48 loc) · 1.49 KB
/
StepBasedMigrationTest.hack
File metadata and controls
56 lines (48 loc) · 1.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*
* Copyright (c) 2017-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/
namespace Facebook\HHAST;
use function Facebook\HHAST\TestLib\expect;
use type Facebook\HackTest\DataProvider;
abstract class StepBasedMigrationTest extends MigrationTest {
abstract const type TMigration as StepBasedMigration;
final public function getStepsAndExamples(): vec<(IMigrationStep, string)> {
$out = vec[];
$class = static::getClassname();
$m = new $class('/var/empty');
foreach ($this->getExamples() as list($example)) {
foreach ($m->getSteps() as $step) {
$out[] = tuple($step, $example);
}
}
return $out;
}
<<DataProvider('getStepsAndExamples')>>
final public async function testMigrationStepsAreIdempotent(
IMigrationStep $step,
string $example,
): Awaitable<void> {
$rewrite = (Node $ast) ==> $ast->rewrite(($n, $_) ==> $step->rewrite($n));
$ast = await from_file_async(
File::fromPath(__DIR__.'/examples/'.$example.'.in'),
);
$ast = $rewrite($ast);
expect($rewrite($ast)->getCode())->toBeSame(
$ast->getCode(),
'Step "%s" in %s is not text-idempotent',
$step->getName(),
static::getClassname(),
);
expect($rewrite($ast))->toBeSame(
$ast,
'Step "%s" in %s is not object-idempotent',
$step->getName(),
static::getClassname(),
);
}
}