Path: blob/master/src/applications/differential/__tests__/DifferentialParseRenderTestCase.php
12256 views
<?php12final class DifferentialParseRenderTestCase extends PhabricatorTestCase {34private function getTestDataDirectory() {5return dirname(__FILE__).'/data/';6}78public function testParseRender() {9$dir = $this->getTestDataDirectory();10foreach (Filesystem::listDirectory($dir, $show_hidden = false) as $file) {11if (!preg_match('/\.diff$/', $file)) {12continue;13}14$data = Filesystem::readFile($dir.$file);1516// Strip trailing "~" characters from inputs so they may contain17// trailing whitespace.18$data = preg_replace('/~$/m', '', $data);1920$opt_file = $dir.$file.'.options';21if (Filesystem::pathExists($opt_file)) {22$options = Filesystem::readFile($opt_file);23try {24$options = phutil_json_decode($options);25} catch (PhutilJSONParserException $ex) {26throw new PhutilProxyException(27pht('Invalid options file: %s.', $opt_file),28$ex);29}30} else {31$options = array();32}3334foreach (array('one', 'two') as $type) {35$this->runParser($type, $data, $file, 'expect');36$this->runParser($type, $data, $file, 'unshielded');37}38}39}4041private function runParser($type, $data, $file, $extension) {42$dir = $this->getTestDataDirectory();43$test_file = $dir.$file.'.'.$type.'.'.$extension;44if (!Filesystem::pathExists($test_file)) {45return;46}4748$unshielded = false;49switch ($extension) {50case 'unshielded':51$unshielded = true;52break;53}5455$parsers = $this->buildChangesetParsers($type, $data, $file);56$actual = $this->renderParsers($parsers, $unshielded);57$expect = Filesystem::readFile($test_file);5859$this->assertEqual($expect, $actual, basename($test_file));60}6162private function renderParsers(array $parsers, $unshield) {63$result = array();64foreach ($parsers as $parser) {65if ($unshield) {66$s_range = 0;67$e_range = 0xFFFF;68} else {69$s_range = null;70$e_range = null;71}7273$result[] = $parser->render($s_range, $e_range, array());74}75return implode(str_repeat('~', 80)."\n", $result);76}7778private function buildChangesetParsers($type, $data, $file) {79$parser = new ArcanistDiffParser();80$changes = $parser->parseDiff($data);8182$diff = DifferentialDiff::newFromRawChanges(83PhabricatorUser::getOmnipotentUser(),84$changes);8586$changesets = $diff->getChangesets();8788$engine = new PhabricatorMarkupEngine();89$engine->setViewer(new PhabricatorUser());9091$viewstate = new PhabricatorChangesetViewState();9293$parsers = array();94foreach ($changesets as $changeset) {95$cparser = id(new DifferentialChangesetParser())96->setViewer(new PhabricatorUser())97->setDisableCache(true)98->setChangeset($changeset)99->setMarkupEngine($engine)100->setViewState($viewstate);101102if ($type == 'one') {103$cparser->setRenderer(new DifferentialChangesetOneUpTestRenderer());104} else if ($type == 'two') {105$cparser->setRenderer(new DifferentialChangesetTwoUpTestRenderer());106} else {107throw new Exception(pht('Unknown renderer type "%s"!', $type));108}109110$parsers[] = $cparser;111}112113return $parsers;114}115116}117118119