code.gitea.io/gitea@v1.19.3/modules/git/diff_test.go (about)

     1  // Copyright 2020 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package git
     5  
     6  import (
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  const exampleDiff = `diff --git a/README.md b/README.md
    14  --- a/README.md
    15  +++ b/README.md
    16  @@ -1,3 +1,6 @@
    17   # gitea-github-migrator
    18  +
    19  + Build Status
    20  - Latest Release
    21   Docker Pulls
    22  + cut off
    23  + cut off`
    24  
    25  const breakingDiff = `diff --git a/aaa.sql b/aaa.sql
    26  index d8e4c92..19dc8ad 100644
    27  --- a/aaa.sql
    28  +++ b/aaa.sql
    29  @@ -1,9 +1,10 @@
    30   --some comment
    31  --- some comment 5
    32  +--some coment 2
    33  +-- some comment 3
    34   create or replace procedure test(p1 varchar2)
    35   is
    36   begin
    37  ---new comment
    38   dbms_output.put_line(p1);
    39  +--some other comment
    40   end;
    41   /
    42  `
    43  
    44  var issue17875Diff = `diff --git a/Geschäftsordnung.md b/Geschäftsordnung.md
    45  index d46c152..a7d2d55 100644
    46  --- a/Geschäftsordnung.md
    47  +++ b/Geschäftsordnung.md
    48  @@ -1,5 +1,5 @@
    49   ---
    50  -date: "23.01.2021"
    51  +date: "30.11.2021"
    52   ...
    53   ` + `
    54   # Geschäftsordnung
    55  @@ -16,4 +16,22 @@ Diese Geschäftsordnung regelt alle Prozesse des Vereins, solange diese nicht du
    56   ` + `
    57   ## § 3 Datenschutzverantwortlichkeit
    58   ` + `
    59  -1. Der Verein bestellt eine datenschutzverantwortliche Person mit den Aufgaben nach Artikel 39 DSGVO.
    60  \ No newline at end of file
    61  +1. Der Verein bestellt eine datenschutzverantwortliche Person mit den Aufgaben nach Artikel 39 DSGVO.
    62  +
    63  +## §4 Umgang mit der SARS-Cov-2-Pandemie
    64  +
    65  +1. Der Vorstand hat die Befugnis, in Rücksprache mit den Vereinsmitgliedern, verschiedene Hygienemaßnahmen für Präsenzveranstaltungen zu beschließen.
    66  +
    67  +2. Die Einführung, Änderung und Abschaffung dieser Maßnahmen sind nur zum Zweck der Eindämmung der SARS-Cov-2-Pandemie zulässig.
    68  +
    69  +3. Die Einführung, Änderung und Abschaffung von Maßnahmen nach Abs. 2 bedarf einer wissenschaftlichen Grundlage.
    70  +
    71  +4. Die Maßnahmen nach Abs. 2 setzen sich aus den folgenden Bausteinen inklusive einer ihrer Ausprägungen zusammen.
    72  +
    73  +	1. Maskenpflicht: Keine; Maskenpflicht, außer am Platz, oder wo Abstände nicht eingehalten werden können; Maskenpflicht, wenn Abstände nicht eingehalten werden können;  Maskenpflicht
    74  +
    75  +	2. Geimpft-, Genesen- oder Testnachweis: Kein Nachweis notwendig; Nachweis, dass Person geimpft, genesen oder tagesaktuell getestet ist (3G); Nachweis, dass Person geimpft oder genesen ist (2G); Nachweis, dass Person geimpft bzw. genesen und tagesaktuell getestet ist (2G+)
    76  +
    77  +	3. Online-Veranstaltung: Keine, parallele Online-Veranstaltung, ausschließlich Online-Veranstaltung
    78  +
    79  +5. Bei Präsenzveranstungen gelten außerdem die Hygienevorschriften des Veranstaltungsorts. Bei Regelkollision greift die restriktivere Regel.
    80  \ No newline at end of file`
    81  
    82  func TestCutDiffAroundLineIssue17875(t *testing.T) {
    83  	result, err := CutDiffAroundLine(strings.NewReader(issue17875Diff), 23, false, 3)
    84  	assert.NoError(t, err)
    85  	expected := `diff --git a/Geschäftsordnung.md b/Geschäftsordnung.md
    86  --- a/Geschäftsordnung.md
    87  +++ b/Geschäftsordnung.md
    88  @@ -20,0 +21,3 @@
    89  +## §4 Umgang mit der SARS-Cov-2-Pandemie
    90  +
    91  +1. Der Vorstand hat die Befugnis, in Rücksprache mit den Vereinsmitgliedern, verschiedene Hygienemaßnahmen für Präsenzveranstaltungen zu beschließen.`
    92  	assert.Equal(t, expected, result)
    93  }
    94  
    95  func TestCutDiffAroundLine(t *testing.T) {
    96  	result, err := CutDiffAroundLine(strings.NewReader(exampleDiff), 4, false, 3)
    97  	assert.NoError(t, err)
    98  	resultByLine := strings.Split(result, "\n")
    99  	assert.Len(t, resultByLine, 7)
   100  	// Check if headers got transferred
   101  	assert.Equal(t, "diff --git a/README.md b/README.md", resultByLine[0])
   102  	assert.Equal(t, "--- a/README.md", resultByLine[1])
   103  	assert.Equal(t, "+++ b/README.md", resultByLine[2])
   104  	// Check if hunk header is calculated correctly
   105  	assert.Equal(t, "@@ -2,2 +3,2 @@", resultByLine[3])
   106  	// Check if line got transferred
   107  	assert.Equal(t, "+ Build Status", resultByLine[4])
   108  
   109  	// Must be same result as before since old line 3 == new line 5
   110  	newResult, err := CutDiffAroundLine(strings.NewReader(exampleDiff), 3, true, 3)
   111  	assert.NoError(t, err)
   112  	assert.Equal(t, result, newResult, "Must be same result as before since old line 3 == new line 5")
   113  
   114  	newResult, err = CutDiffAroundLine(strings.NewReader(exampleDiff), 6, false, 300)
   115  	assert.NoError(t, err)
   116  	assert.Equal(t, exampleDiff, newResult)
   117  
   118  	emptyResult, err := CutDiffAroundLine(strings.NewReader(exampleDiff), 6, false, 0)
   119  	assert.NoError(t, err)
   120  	assert.Empty(t, emptyResult)
   121  
   122  	// Line is out of scope
   123  	emptyResult, err = CutDiffAroundLine(strings.NewReader(exampleDiff), 434, false, 0)
   124  	assert.NoError(t, err)
   125  	assert.Empty(t, emptyResult)
   126  
   127  	// Handle minus diffs properly
   128  	minusDiff, err := CutDiffAroundLine(strings.NewReader(breakingDiff), 2, false, 4)
   129  	assert.NoError(t, err)
   130  
   131  	expected := `diff --git a/aaa.sql b/aaa.sql
   132  --- a/aaa.sql
   133  +++ b/aaa.sql
   134  @@ -1,9 +1,10 @@
   135   --some comment
   136  --- some comment 5
   137  +--some coment 2`
   138  	assert.Equal(t, expected, minusDiff)
   139  
   140  	// Handle minus diffs properly
   141  	minusDiff, err = CutDiffAroundLine(strings.NewReader(breakingDiff), 3, false, 4)
   142  	assert.NoError(t, err)
   143  
   144  	expected = `diff --git a/aaa.sql b/aaa.sql
   145  --- a/aaa.sql
   146  +++ b/aaa.sql
   147  @@ -1,9 +1,10 @@
   148   --some comment
   149  --- some comment 5
   150  +--some coment 2
   151  +-- some comment 3`
   152  
   153  	assert.Equal(t, expected, minusDiff)
   154  }
   155  
   156  func BenchmarkCutDiffAroundLine(b *testing.B) {
   157  	for n := 0; n < b.N; n++ {
   158  		CutDiffAroundLine(strings.NewReader(exampleDiff), 3, true, 3)
   159  	}
   160  }
   161  
   162  func ExampleCutDiffAroundLine() {
   163  	const diff = `diff --git a/README.md b/README.md
   164  --- a/README.md
   165  +++ b/README.md
   166  @@ -1,3 +1,6 @@
   167   # gitea-github-migrator
   168  +
   169  + Build Status
   170  - Latest Release
   171   Docker Pulls
   172  + cut off
   173  + cut off`
   174  	result, _ := CutDiffAroundLine(strings.NewReader(diff), 4, false, 3)
   175  	println(result)
   176  }
   177  
   178  func TestParseDiffHunkString(t *testing.T) {
   179  	leftLine, leftHunk, rightLine, rightHunk := ParseDiffHunkString("@@ -19,3 +19,5 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER")
   180  	assert.EqualValues(t, 19, leftLine)
   181  	assert.EqualValues(t, 3, leftHunk)
   182  	assert.EqualValues(t, 19, rightLine)
   183  	assert.EqualValues(t, 5, rightHunk)
   184  }