Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/differential/__tests__/DifferentialParseRenderTestCase.php
12256 views
1
<?php
2
3
final class DifferentialParseRenderTestCase extends PhabricatorTestCase {
4
5
private function getTestDataDirectory() {
6
return dirname(__FILE__).'/data/';
7
}
8
9
public function testParseRender() {
10
$dir = $this->getTestDataDirectory();
11
foreach (Filesystem::listDirectory($dir, $show_hidden = false) as $file) {
12
if (!preg_match('/\.diff$/', $file)) {
13
continue;
14
}
15
$data = Filesystem::readFile($dir.$file);
16
17
// Strip trailing "~" characters from inputs so they may contain
18
// trailing whitespace.
19
$data = preg_replace('/~$/m', '', $data);
20
21
$opt_file = $dir.$file.'.options';
22
if (Filesystem::pathExists($opt_file)) {
23
$options = Filesystem::readFile($opt_file);
24
try {
25
$options = phutil_json_decode($options);
26
} catch (PhutilJSONParserException $ex) {
27
throw new PhutilProxyException(
28
pht('Invalid options file: %s.', $opt_file),
29
$ex);
30
}
31
} else {
32
$options = array();
33
}
34
35
foreach (array('one', 'two') as $type) {
36
$this->runParser($type, $data, $file, 'expect');
37
$this->runParser($type, $data, $file, 'unshielded');
38
}
39
}
40
}
41
42
private function runParser($type, $data, $file, $extension) {
43
$dir = $this->getTestDataDirectory();
44
$test_file = $dir.$file.'.'.$type.'.'.$extension;
45
if (!Filesystem::pathExists($test_file)) {
46
return;
47
}
48
49
$unshielded = false;
50
switch ($extension) {
51
case 'unshielded':
52
$unshielded = true;
53
break;
54
}
55
56
$parsers = $this->buildChangesetParsers($type, $data, $file);
57
$actual = $this->renderParsers($parsers, $unshielded);
58
$expect = Filesystem::readFile($test_file);
59
60
$this->assertEqual($expect, $actual, basename($test_file));
61
}
62
63
private function renderParsers(array $parsers, $unshield) {
64
$result = array();
65
foreach ($parsers as $parser) {
66
if ($unshield) {
67
$s_range = 0;
68
$e_range = 0xFFFF;
69
} else {
70
$s_range = null;
71
$e_range = null;
72
}
73
74
$result[] = $parser->render($s_range, $e_range, array());
75
}
76
return implode(str_repeat('~', 80)."\n", $result);
77
}
78
79
private function buildChangesetParsers($type, $data, $file) {
80
$parser = new ArcanistDiffParser();
81
$changes = $parser->parseDiff($data);
82
83
$diff = DifferentialDiff::newFromRawChanges(
84
PhabricatorUser::getOmnipotentUser(),
85
$changes);
86
87
$changesets = $diff->getChangesets();
88
89
$engine = new PhabricatorMarkupEngine();
90
$engine->setViewer(new PhabricatorUser());
91
92
$viewstate = new PhabricatorChangesetViewState();
93
94
$parsers = array();
95
foreach ($changesets as $changeset) {
96
$cparser = id(new DifferentialChangesetParser())
97
->setViewer(new PhabricatorUser())
98
->setDisableCache(true)
99
->setChangeset($changeset)
100
->setMarkupEngine($engine)
101
->setViewState($viewstate);
102
103
if ($type == 'one') {
104
$cparser->setRenderer(new DifferentialChangesetOneUpTestRenderer());
105
} else if ($type == 'two') {
106
$cparser->setRenderer(new DifferentialChangesetTwoUpTestRenderer());
107
} else {
108
throw new Exception(pht('Unknown renderer type "%s"!', $type));
109
}
110
111
$parsers[] = $cparser;
112
}
113
114
return $parsers;
115
}
116
117
}
118
119