github.com/gitbundle/modules@v0.0.0-20231025071548-85b91c5c3b01/git/diff_test.go (about)

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