@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
phorge
phabricator
1<?php
2
3final 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 Exception(
28 pht('Invalid options file: %s.', $opt_file),
29 0,
30 $ex);
31 }
32 } else {
33 $options = array();
34 }
35
36 foreach (array('one', 'two') as $type) {
37 $this->runParser($type, $data, $file, 'expect');
38 $this->runParser($type, $data, $file, 'unshielded');
39 }
40 }
41 }
42
43 private function runParser($type, $data, $file, $extension) {
44 $dir = $this->getTestDataDirectory();
45 $test_file = $dir.$file.'.'.$type.'.'.$extension;
46 if (!Filesystem::pathExists($test_file)) {
47 return;
48 }
49
50 $unshielded = false;
51 switch ($extension) {
52 case 'unshielded':
53 $unshielded = true;
54 break;
55 }
56
57 $parsers = $this->buildChangesetParsers($type, $data, $file);
58 $actual = $this->renderParsers($parsers, $unshielded);
59 $expect = Filesystem::readFile($test_file);
60
61 $this->assertEqual($expect, $actual, basename($test_file));
62 }
63
64 private function renderParsers(array $parsers, $unshield) {
65 $result = array();
66 foreach ($parsers as $parser) {
67 if ($unshield) {
68 $s_range = 0;
69 $e_range = 0xFFFF;
70 } else {
71 $s_range = null;
72 $e_range = null;
73 }
74
75 $result[] = $parser->render($s_range, $e_range, array());
76 }
77 return implode(str_repeat('~', 80)."\n", $result);
78 }
79
80 private function buildChangesetParsers($type, $data, $file) {
81 $parser = new ArcanistDiffParser();
82 $changes = $parser->parseDiff($data);
83
84 $diff = DifferentialDiff::newFromRawChanges(
85 PhabricatorUser::getOmnipotentUser(),
86 $changes);
87
88 $changesets = $diff->getChangesets();
89
90 $engine = new PhabricatorMarkupEngine();
91 $engine->setViewer(new PhabricatorUser());
92
93 $viewstate = new PhabricatorChangesetViewState();
94
95 $parsers = array();
96 foreach ($changesets as $changeset) {
97 $cparser = id(new DifferentialChangesetParser())
98 ->setViewer(new PhabricatorUser())
99 ->setDisableCache(true)
100 ->setChangeset($changeset)
101 ->setMarkupEngine($engine)
102 ->setViewState($viewstate);
103
104 if ($type == 'one') {
105 $cparser->setRenderer(new DifferentialChangesetOneUpTestRenderer());
106 } else if ($type == 'two') {
107 $cparser->setRenderer(new DifferentialChangesetTwoUpTestRenderer());
108 } else {
109 throw new Exception(pht('Unknown renderer type "%s"!', $type));
110 }
111
112 $parsers[] = $cparser;
113 }
114
115 return $parsers;
116 }
117
118}