unified_diff_test.rb 11.6 KB
Newer Older
1
# frozen_string_literal: true
2

3
# Redmine - project management software
jplang's avatar
jplang committed
4
# Copyright (C) 2006-2017  Jean-Philippe Lang
5 6 7 8 9
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
10
#
11 12 13 14
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
15
#
16 17 18 19
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

20
require File.expand_path('../../../../test_helper', __FILE__)
21

22
class Redmine::UnifiedDiffTest < ActiveSupport::TestCase
23 24 25 26 27 28
  def test_subversion_diff
    diff = Redmine::UnifiedDiff.new(read_diff_fixture('subversion.diff'))
    # number of files
    assert_equal 4, diff.size
    assert diff.detect {|file| file.file_name =~ %r{^config/settings.yml}}
  end
29

30 31 32 33
  def test_truncate_diff
    diff = Redmine::UnifiedDiff.new(read_diff_fixture('subversion.diff'), :max_lines => 20)
    assert_equal 2, diff.size
  end
34

35 36 37 38 39
  def test_inline_partials
    diff = Redmine::UnifiedDiff.new(read_diff_fixture('partials.diff'))
    assert_equal 1, diff.size
    diff = diff.first
    assert_equal 43, diff.size
40

41 42 43 44
    assert_equal [51, -1], diff[0].offsets
    assert_equal [51, -1], diff[1].offsets
    assert_equal 'Lorem ipsum dolor sit amet, consectetur adipiscing <span>elit</span>', diff[0].html_line
    assert_equal 'Lorem ipsum dolor sit amet, consectetur adipiscing <span>xx</span>', diff[1].html_line
45

46 47
    assert_nil diff[2].offsets
    assert_equal 'Praesent et sagittis dui. Vivamus ac diam diam', diff[2].html_line
48

49 50 51 52
    assert_equal [0, -14], diff[3].offsets
    assert_equal [0, -14], diff[4].offsets
    assert_equal '<span>Ut sed</span> auctor justo', diff[3].html_line
    assert_equal '<span>xxx</span> auctor justo', diff[4].html_line
53

54 55
    assert_equal [13, -19], diff[6].offsets
    assert_equal [13, -19], diff[7].offsets
56

57 58
    assert_equal [24, -8], diff[9].offsets
    assert_equal [24, -8], diff[10].offsets
59

60 61
    assert_equal [37, -1], diff[12].offsets
    assert_equal [37, -1], diff[13].offsets
62

63 64 65
    assert_equal [0, -38], diff[15].offsets
    assert_equal [0, -38], diff[16].offsets
  end
66

67 68 69 70 71
  def test_side_by_side_partials
    diff = Redmine::UnifiedDiff.new(read_diff_fixture('partials.diff'), :type => 'sbs')
    assert_equal 1, diff.size
    diff = diff.first
    assert_equal 32, diff.size
72

73 74 75
    assert_equal [51, -1], diff[0].offsets
    assert_equal 'Lorem ipsum dolor sit amet, consectetur adipiscing <span>elit</span>', diff[0].html_line_left
    assert_equal 'Lorem ipsum dolor sit amet, consectetur adipiscing <span>xx</span>', diff[0].html_line_right
76

77 78 79
    assert_nil diff[1].offsets
    assert_equal 'Praesent et sagittis dui. Vivamus ac diam diam', diff[1].html_line_left
    assert_equal 'Praesent et sagittis dui. Vivamus ac diam diam', diff[1].html_line_right
80

81 82 83 84 85 86 87 88
    assert_equal [0, -14], diff[2].offsets
    assert_equal '<span>Ut sed</span> auctor justo', diff[2].html_line_left
    assert_equal '<span>xxx</span> auctor justo', diff[2].html_line_right

    assert_equal [13, -19], diff[4].offsets
    assert_equal [24, -8], diff[6].offsets
    assert_equal [37, -1], diff[8].offsets
    assert_equal [0, -38], diff[10].offsets
89

90
  end
91

92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
  def test_partials_with_html_entities
    raw = <<-DIFF
--- test.orig.txt Wed Feb 15 16:10:39 2012
+++ test.new.txt  Wed Feb 15 16:11:25 2012
@@ -1,5 +1,5 @@
 Semicolons were mysteriously appearing in code diffs in the repository
 
-void DoSomething(std::auto_ptr<MyClass> myObj)
+void DoSomething(const MyClass& myObj)
 
DIFF

    diff = Redmine::UnifiedDiff.new(raw, :type => 'sbs')
    assert_equal 1, diff.size
    assert_equal 'void DoSomething(<span>std::auto_ptr&lt;MyClass&gt;</span> myObj)', diff.first[2].html_line_left
    assert_equal 'void DoSomething(<span>const MyClass&amp;</span> myObj)', diff.first[2].html_line_right

    diff = Redmine::UnifiedDiff.new(raw, :type => 'inline')
    assert_equal 1, diff.size
    assert_equal 'void DoSomething(<span>std::auto_ptr&lt;MyClass&gt;</span> myObj)', diff.first[2].html_line
    assert_equal 'void DoSomething(<span>const MyClass&amp;</span> myObj)', diff.first[3].html_line
  end

115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
  def test_line_starting_with_dashes
    diff = Redmine::UnifiedDiff.new(<<-DIFF
--- old.txt Wed Nov 11 14:24:58 2009
+++ new.txt Wed Nov 11 14:25:02 2009
@@ -1,8 +1,4 @@
-Lines that starts with dashes:
-
-------------------------
--- file.c
-------------------------
+A line that starts with dashes:
 
 and removed.
 
@@ -23,4 +19,4 @@
 
 
 
-Another chunk of change
+Another chunk of changes

DIFF
    )
    assert_equal 1, diff.size
  end
140

141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
  def test_one_line_new_files
    diff = Redmine::UnifiedDiff.new(<<-DIFF
diff -r 000000000000 -r ea98b14f75f0 README1
--- /dev/null
+++ b/README1
@@ -0,0 +1,1 @@
+test1
diff -r 000000000000 -r ea98b14f75f0 README2
--- /dev/null
+++ b/README2
@@ -0,0 +1,1 @@
+test2
diff -r 000000000000 -r ea98b14f75f0 README3
--- /dev/null
+++ b/README3
@@ -0,0 +1,3 @@
+test4
+test5
+test6
diff -r 000000000000 -r ea98b14f75f0 README4
--- /dev/null
+++ b/README4
@@ -0,0 +1,3 @@
+test4
+test5
+test6
DIFF
    )
    assert_equal 4, diff.size
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
    assert_equal "README1", diff[0].file_name
  end

  def test_both_git_diff
    diff = Redmine::UnifiedDiff.new(<<-DIFF
# HG changeset patch
# User test
# Date 1348014182 -32400
# Node ID d1c871b8ef113df7f1c56d41e6e3bfbaff976e1f
# Parent  180b6605936cdc7909c5f08b59746ec1a7c99b3e
modify test1.txt

diff -r 180b6605936c -r d1c871b8ef11 test1.txt
--- a/test1.txt
+++ b/test1.txt
@@ -1,1 +1,1 @@
-test1
+modify test1
DIFF
    )
    assert_equal 1, diff.size
    assert_equal "test1.txt", diff[0].file_name
  end

194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
  def test_previous_file_name_with_git
    diff = Redmine::UnifiedDiff.new(<<-DIFF)
From 585da9683fb5ed7bf7cb438492e3347cdf3d83df Mon Sep 17 00:00:00 2001
From: Gregor Schmidt <schmidt@nach-vorne.eu>
Date: Mon, 5 Mar 2018 14:12:13 +0100
Subject: [PATCH] changes including a rename, rename+modify and addition

---
 one.markdown => one.md | 0
 three.md               | 2 ++
 two.markdown => two.md | 1 +
 3 files changed, 3 insertions(+)
 rename one.markdown => one.md (100%)
 create mode 100644 three.md
 rename two.markdown => two.md (50%)

diff --git a/one.markdown b/one.md
similarity index 100%
rename from one.markdown
rename to one.md
diff --git a/three.md b/three.md
new file mode 100644
index 0000000..288012f
--- /dev/null
+++ b/three.md
@@ -0,0 +1,2 @@
+three
+=====
diff --git a/two.markdown b/two.md
similarity index 50%
rename from two.markdown
rename to two.md
index f719efd..6a268ed 100644
--- a/two.markdown
+++ b/two.md
@@ -1 +1,2 @@
 two
+===
--
2.14.1
DIFF

    assert_equal 2, diff.size
    assert_equal "three.md", diff[0].file_name
    assert_nil               diff[0].previous_file_name

    assert_equal "two.md",       diff[1].file_name
    assert_equal "two.markdown", diff[1].previous_file_name
  end

244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
  def test_include_a_b_slash
    diff = Redmine::UnifiedDiff.new(<<-DIFF
--- test1.txt
+++ b/test02.txt
@@ -1 +0,0 @@
-modify test1
DIFF
    )
    assert_equal 1, diff.size
    assert_equal "b/test02.txt", diff[0].file_name

    diff = Redmine::UnifiedDiff.new(<<-DIFF
--- a/test1.txt
+++ a/test02.txt
@@ -1 +0,0 @@
-modify test1
DIFF
    )
    assert_equal 1, diff.size
    assert_equal "a/test02.txt", diff[0].file_name

    diff = Redmine::UnifiedDiff.new(<<-DIFF
--- a/test1.txt
+++ test02.txt
@@ -1 +0,0 @@
-modify test1
DIFF
    )
    assert_equal 1, diff.size
    assert_equal "test02.txt", diff[0].file_name
274 275
  end

276 277 278 279 280
  def test_utf8_ja
    with_settings :repositories_encodings => '' do
      diff = Redmine::UnifiedDiff.new(read_diff_fixture('issue-12641-ja.diff'), :type => 'inline')
      assert_equal 1, diff.size
      assert_equal 12, diff.first.size
281
      assert_equal '  text_tip_issue_end_day: この日に終了する<span>タスク</span>', diff.first[4].html_line_left
282 283 284 285 286 287 288 289
    end
  end

  def test_utf8_ru
    with_settings :repositories_encodings => '' do
      diff = Redmine::UnifiedDiff.new(read_diff_fixture('issue-12641-ru.diff'), :type => 'inline')
      assert_equal 1, diff.size
      assert_equal 8, diff.first.size
290
      assert_equal '        other: &quot;около %{count} час<span>а</span>&quot;', diff.first[3].html_line_left
291 292 293
    end
  end

294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333
  def test_offset_range_ascii_1
    raw = <<-DIFF
--- a.txt	2013-04-05 14:19:39.000000000 +0900
+++ b.txt	2013-04-05 14:19:51.000000000 +0900
@@ -1,3 +1,3 @@
 aaaa
-abc
+abcd
 bbbb
DIFF
    diff = Redmine::UnifiedDiff.new(raw, :type => 'sbs')
    assert_equal 1, diff.size
    assert_equal 3, diff.first.size
    assert_equal "abc<span></span>", diff.first[1].html_line_left
    assert_equal "abc<span>d</span>", diff.first[1].html_line_right
  end

  def test_offset_range_ascii_2
    raw = <<-DIFF
--- a.txt	2013-04-05 14:19:39.000000000 +0900
+++ b.txt	2013-04-05 14:19:51.000000000 +0900
@@ -1,3 +1,3 @@
 aaaa
-abc
+zabc
 bbbb
DIFF
    diff = Redmine::UnifiedDiff.new(raw, :type => 'sbs')
    assert_equal 1, diff.size
    assert_equal 3, diff.first.size
    assert_equal "<span></span>abc", diff.first[1].html_line_left
    assert_equal "<span>z</span>abc", diff.first[1].html_line_right
  end

  def test_offset_range_japanese_1
    with_settings :repositories_encodings => '' do
      diff = Redmine::UnifiedDiff.new(
               read_diff_fixture('issue-13644-1.diff'), :type => 'sbs')
      assert_equal 1, diff.size
      assert_equal 3, diff.first.size
334 335
      assert_equal '日本<span></span>', diff.first[1].html_line_left
      assert_equal '日本<span>語</span>', diff.first[1].html_line_right
336 337 338 339 340 341 342 343 344
    end
  end

  def test_offset_range_japanese_2
    with_settings :repositories_encodings => '' do
      diff = Redmine::UnifiedDiff.new(
               read_diff_fixture('issue-13644-2.diff'), :type => 'sbs')
      assert_equal 1, diff.size
      assert_equal 3, diff.first.size
345 346
      assert_equal '<span></span>日本', diff.first[1].html_line_left
      assert_equal '<span>にっぽん</span>日本', diff.first[1].html_line_right
347 348 349
    end
  end

350 351 352 353 354 355 356
  def test_offset_range_japanese_3
    # UTF-8 The 1st byte differs.
    with_settings :repositories_encodings => '' do
      diff = Redmine::UnifiedDiff.new(
               read_diff_fixture('issue-13644-3.diff'), :type => 'sbs')
      assert_equal 1, diff.size
      assert_equal 3, diff.first.size
357 358
      assert_equal '日本<span>記</span>', diff.first[1].html_line_left
      assert_equal '日本<span>娘</span>', diff.first[1].html_line_right
359 360 361 362 363 364 365 366 367 368
    end
  end

  def test_offset_range_japanese_4
    # UTF-8 The 2nd byte differs. 
    with_settings :repositories_encodings => '' do
      diff = Redmine::UnifiedDiff.new(
               read_diff_fixture('issue-13644-4.diff'), :type => 'sbs')
      assert_equal 1, diff.size
      assert_equal 3, diff.first.size
369 370
      assert_equal '日本<span>記</span>', diff.first[1].html_line_left
      assert_equal '日本<span>誘</span>', diff.first[1].html_line_right
371 372 373 374 375 376 377 378 379 380
    end
  end

  def test_offset_range_japanese_5
    # UTF-8 The 2nd byte differs. 
    with_settings :repositories_encodings => '' do
      diff = Redmine::UnifiedDiff.new(
               read_diff_fixture('issue-13644-5.diff'), :type => 'sbs')
      assert_equal 1, diff.size
      assert_equal 3, diff.first.size
381 382
      assert_equal '日本<span>記</span>ok', diff.first[1].html_line_left
      assert_equal '日本<span>誘</span>ok', diff.first[1].html_line_right
383 384 385
    end
  end

386
  private
387

388 389 390 391
  def read_diff_fixture(filename)
    File.new(File.join(File.dirname(__FILE__), '/../../../fixtures/diffs', filename)).read
  end
end