Path: blob/master/src/applications/differential/parser/__tests__/DifferentialHunkParserTestCase.php
12262 views
<?php12final class DifferentialHunkParserTestCase extends PhabricatorTestCase {34private function createComment() {5$comment = new DifferentialInlineComment();6return $comment;7}89private function createHunk(10$old_offset,11$old_len,12$new_offset,13$new_len,14$changes) {1516$hunk = id(new DifferentialHunk())17->setOldOffset($old_offset)18->setOldLen($old_len)19->setNewOffset($new_offset)20->setNewLen($new_len)21->setChanges($changes);2223return $hunk;24}2526// Returns a change that consists of a single hunk, starting at line 1.27private function createSingleChange($old_lines, $new_lines, $changes) {28return array(290 => $this->createHunk(1, $old_lines, 1, $new_lines, $changes),30);31}3233private function createHunksFromFile($name) {34$data = Filesystem::readFile(dirname(__FILE__).'/data/'.$name);3536$parser = new ArcanistDiffParser();37$changes = $parser->parseDiff($data);38if (count($changes) !== 1) {39throw new Exception(pht("Expected 1 changeset for '%s'!", $name));40}4142$diff = DifferentialDiff::newFromRawChanges(43PhabricatorUser::getOmnipotentUser(),44$changes);45return head($diff->getChangesets())->getHunks();46}4748public function testOneLineOldComment() {49$parser = new DifferentialHunkParser();50$hunks = $this->createSingleChange(1, 0, '-a');51$context = $parser->makeContextDiff(52$hunks,530,541,550,560);57$this->assertEqual("@@ -1,1 @@\n-a", $context);58}5960public function testOneLineNewComment() {61$parser = new DifferentialHunkParser();62$hunks = $this->createSingleChange(0, 1, '+a');63$context = $parser->makeContextDiff(64$hunks,651,661,670,680);69$this->assertEqual("@@ +1,1 @@\n+a", $context);70}7172public function testCannotFindContext() {73$parser = new DifferentialHunkParser();74$hunks = $this->createSingleChange(0, 1, '+a');75$context = $parser->makeContextDiff(76$hunks,771,782,790,800);81$this->assertEqual('', $context);82}8384public function testOverlapFromStartOfHunk() {85$parser = new DifferentialHunkParser();86$hunks = array(870 => $this->createHunk(23, 2, 42, 2, " 1\n 2"),88);89$context = $parser->makeContextDiff(90$hunks,911,9241,931,940);95$this->assertEqual("@@ -23,1 +42,1 @@\n 1", $context);96}9798public function testOverlapAfterEndOfHunk() {99$parser = new DifferentialHunkParser();100$hunks = array(1010 => $this->createHunk(23, 2, 42, 2, " 1\n 2"),102);103$context = $parser->makeContextDiff(104$hunks,1051,10643,1071,1080);109$this->assertEqual("@@ -24,1 +43,1 @@\n 2", $context);110}111112public function testInclusionOfNewFileInOldCommentFromStart() {113$parser = new DifferentialHunkParser();114$hunks = $this->createSingleChange(2, 3,115"+n1\n".116" e1/2\n".117"-o2\n".118"+n3\n");119$context = $parser->makeContextDiff(120$hunks,1210,1221,1231,1240);125$this->assertEqual(126"@@ -1,2 +2,1 @@\n".127" e1/2\n".128"-o2", $context);129}130131public function testInclusionOfOldFileInNewCommentFromStart() {132$parser = new DifferentialHunkParser();133$hunks = $this->createSingleChange(2, 2,134"-o1\n".135" e2/1\n".136"-o3\n".137"+n2\n");138$context = $parser->makeContextDiff(139$hunks,1401,1411,1421,1430);144$this->assertEqual(145"@@ -2,1 +1,2 @@\n".146" e2/1\n".147"+n2", $context);148}149150public function testNoNewlineAtEndOfFile() {151$parser = new DifferentialHunkParser();152$hunks = $this->createSingleChange(0, 1,153"+a\n".154"\\No newline at end of file");155// Note that this only works with additional context.156$context = $parser->makeContextDiff(157$hunks,1581,1592,1600,1611);162$this->assertEqual(163"@@ +1,1 @@\n".164"+a\n".165"\\No newline at end of file", $context);166}167168public function testMultiLineNewComment() {169$parser = new DifferentialHunkParser();170$hunks = $this->createSingleChange(7, 7,171" e1\n".172" e2\n".173"-o3\n".174"-o4\n".175"+n3\n".176" e5/4\n".177" e6/5\n".178"+n6\n".179" e7\n");180$context = $parser->makeContextDiff(181$hunks,1821,1832,1844,1850);186$this->assertEqual(187"@@ -2,5 +2,5 @@\n".188" e2\n".189"-o3\n".190"-o4\n".191"+n3\n".192" e5/4\n".193" e6/5\n".194"+n6", $context);195}196197public function testMultiLineOldComment() {198$parser = new DifferentialHunkParser();199$hunks = $this->createSingleChange(7, 7,200" e1\n".201" e2\n".202"-o3\n".203"-o4\n".204"+n3\n".205" e5/4\n".206" e6/5\n".207"+n6\n".208" e7\n");209$context = $parser->makeContextDiff(210$hunks,2110,2122,2134,2140);215$this->assertEqual(216"@@ -2,5 +2,4 @@\n".217" e2\n".218"-o3\n".219"-o4\n".220"+n3\n".221" e5/4\n".222" e6/5", $context);223}224225public function testInclusionOfNewFileInOldCommentFromStartWithContext() {226$parser = new DifferentialHunkParser();227$hunks = $this->createSingleChange(2, 3,228"+n1\n".229" e1/2\n".230"-o2\n".231"+n3\n");232$context = $parser->makeContextDiff(233$hunks,2340,2351,2361,2371);238$this->assertEqual(239"@@ -1,2 +1,2 @@\n".240"+n1\n".241" e1/2\n".242"-o2", $context);243}244245public function testInclusionOfOldFileInNewCommentFromStartWithContext() {246$parser = new DifferentialHunkParser();247$hunks = $this->createSingleChange(2, 2,248"-o1\n".249" e2/1\n".250"-o3\n".251"+n2\n");252$context = $parser->makeContextDiff(253$hunks,2541,2551,2561,2571);258$this->assertEqual(259"@@ -1,3 +1,2 @@\n".260"-o1\n".261" e2/1\n".262"-o3\n".263"+n2", $context);264}265266public function testMissingContext() {267$tests = array(268'missing_context.diff' => array(2694 => true,270),271'missing_context_2.diff' => array(2725 => true,273),274'missing_context_3.diff' => array(2754 => true,27613 => true,277),278);279280foreach ($tests as $name => $expect) {281$hunks = $this->createHunksFromFile($name);282283$parser = new DifferentialHunkParser();284$actual = $parser->getHunkStartLines($hunks);285286$this->assertEqual($expect, $actual, $name);287}288}289290}291292293