Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /*
  2. * Copyright (C) 2010, Google Inc. and others
  3. *
  4. * This program and the accompanying materials are made available under the
  5. * terms of the Eclipse Distribution License v. 1.0 which is available at
  6. * https://www.eclipse.org/org/documents/edl-v10.php.
  7. *
  8. * SPDX-License-Identifier: BSD-3-Clause
  9. */
  10. package org.eclipse.jgit.diff;
  11. import static java.nio.charset.StandardCharsets.UTF_8;
  12. import static org.junit.Assert.assertEquals;
  13. import static org.junit.Assert.assertTrue;
  14. import org.junit.Test;
  15. public abstract class AbstractDiffTestCase {
  16. @Test
  17. public void testEmptyInputs() {
  18. EditList r = diff(t(""), t(""));
  19. assertTrue("is empty", r.isEmpty());
  20. }
  21. @Test
  22. public void testCreateFile() {
  23. EditList r = diff(t(""), t("AB"));
  24. assertEquals(1, r.size());
  25. assertEquals(new Edit(0, 0, 0, 2), r.get(0));
  26. }
  27. @Test
  28. public void testDeleteFile() {
  29. EditList r = diff(t("AB"), t(""));
  30. assertEquals(1, r.size());
  31. assertEquals(new Edit(0, 2, 0, 0), r.get(0));
  32. }
  33. @Test
  34. public void testDegenerate_InsertMiddle() {
  35. EditList r = diff(t("ac"), t("aBc"));
  36. assertEquals(1, r.size());
  37. assertEquals(new Edit(1, 1, 1, 2), r.get(0));
  38. }
  39. @Test
  40. public void testDegenerate_DeleteMiddle() {
  41. EditList r = diff(t("aBc"), t("ac"));
  42. assertEquals(1, r.size());
  43. assertEquals(new Edit(1, 2, 1, 1), r.get(0));
  44. }
  45. @Test
  46. public void testDegenerate_ReplaceMiddle() {
  47. EditList r = diff(t("bCd"), t("bEd"));
  48. assertEquals(1, r.size());
  49. assertEquals(new Edit(1, 2, 1, 2), r.get(0));
  50. }
  51. @Test
  52. public void testDegenerate_InsertsIntoMidPosition() {
  53. EditList r = diff(t("aaaa"), t("aaXaa"));
  54. assertEquals(1, r.size());
  55. assertEquals(new Edit(2, 2, 2, 3), r.get(0));
  56. }
  57. @Test
  58. public void testDegenerate_InsertStart() {
  59. EditList r = diff(t("bc"), t("Abc"));
  60. assertEquals(1, r.size());
  61. assertEquals(new Edit(0, 0, 0, 1), r.get(0));
  62. }
  63. @Test
  64. public void testDegenerate_DeleteStart() {
  65. EditList r = diff(t("Abc"), t("bc"));
  66. assertEquals(1, r.size());
  67. assertEquals(new Edit(0, 1, 0, 0), r.get(0));
  68. }
  69. @Test
  70. public void testDegenerate_InsertEnd() {
  71. EditList r = diff(t("bc"), t("bcD"));
  72. assertEquals(1, r.size());
  73. assertEquals(new Edit(2, 2, 2, 3), r.get(0));
  74. }
  75. @Test
  76. public void testDegenerate_DeleteEnd() {
  77. EditList r = diff(t("bcD"), t("bc"));
  78. assertEquals(1, r.size());
  79. assertEquals(new Edit(2, 3, 2, 2), r.get(0));
  80. }
  81. @Test
  82. public void testEdit_ReplaceCommonDelete() {
  83. EditList r = diff(t("RbC"), t("Sb"));
  84. assertEquals(2, r.size());
  85. assertEquals(new Edit(0, 1, 0, 1), r.get(0));
  86. assertEquals(new Edit(2, 3, 2, 2), r.get(1));
  87. }
  88. @Test
  89. public void testEdit_CommonReplaceCommonDeleteCommon() {
  90. EditList r = diff(t("aRbCd"), t("aSbd"));
  91. assertEquals(2, r.size());
  92. assertEquals(new Edit(1, 2, 1, 2), r.get(0));
  93. assertEquals(new Edit(3, 4, 3, 3), r.get(1));
  94. }
  95. @Test
  96. public void testEdit_MoveBlock() {
  97. EditList r = diff(t("aYYbcdz"), t("abcdYYz"));
  98. assertEquals(2, r.size());
  99. assertEquals(new Edit(1, 3, 1, 1), r.get(0));
  100. assertEquals(new Edit(6, 6, 4, 6), r.get(1));
  101. }
  102. @Test
  103. public void testEdit_InvertBlocks() {
  104. EditList r = diff(t("aYYbcdXXz"), t("aXXbcdYYz"));
  105. assertEquals(2, r.size());
  106. assertEquals(new Edit(1, 3, 1, 3), r.get(0));
  107. assertEquals(new Edit(6, 8, 6, 8), r.get(1));
  108. }
  109. @Test
  110. public void testEdit_UniqueCommonLargerThanMatchPoint() {
  111. // We are testing 3 unique common matches, but two of
  112. // them are consumed as part of the 1st's LCS region.
  113. EditList r = diff(t("AbdeZ"), t("PbdeQR"));
  114. assertEquals(2, r.size());
  115. assertEquals(new Edit(0, 1, 0, 1), r.get(0));
  116. assertEquals(new Edit(4, 5, 4, 6), r.get(1));
  117. }
  118. @Test
  119. public void testEdit_CommonGrowsPrefixAndSuffix() {
  120. // Here there is only one common unique point, but we can grow it
  121. // in both directions to find the LCS in the middle.
  122. EditList r = diff(t("AaabccZ"), t("PaabccR"));
  123. assertEquals(2, r.size());
  124. assertEquals(new Edit(0, 1, 0, 1), r.get(0));
  125. assertEquals(new Edit(6, 7, 6, 7), r.get(1));
  126. }
  127. @Test
  128. public void testEdit_DuplicateAButCommonUniqueInB() {
  129. EditList r = diff(t("AbbcR"), t("CbcS"));
  130. assertEquals(2, r.size());
  131. assertEquals(new Edit(0, 2, 0, 1), r.get(0));
  132. assertEquals(new Edit(4, 5, 3, 4), r.get(1));
  133. }
  134. @Test
  135. public void testEdit_InsertNearCommonTail() {
  136. EditList r = diff(t("aq}nb"), t("aCq}nD}nb"));
  137. assertEquals(new Edit(1, 1, 1, 2), r.get(0));
  138. assertEquals(new Edit(4, 4, 5, 8), r.get(1));
  139. assertEquals(2, r.size());
  140. }
  141. @Test
  142. public void testEdit_DeleteNearCommonTail() {
  143. EditList r = diff(t("aCq}nD}nb"), t("aq}nb"));
  144. assertEquals(new Edit(1, 2, 1, 1), r.get(0));
  145. assertEquals(new Edit(5, 8, 4, 4), r.get(1));
  146. assertEquals(2, r.size());
  147. }
  148. @Test
  149. public void testEdit_DeleteNearCommonCenter() {
  150. EditList r = diff(t("abcd123123uvwxpq"), t("aBcd123uvwxPq"));
  151. assertEquals(new Edit(1, 2, 1, 2), r.get(0));
  152. assertEquals(new Edit(7, 10, 7, 7), r.get(1));
  153. assertEquals(new Edit(14, 15, 11, 12), r.get(2));
  154. assertEquals(3, r.size());
  155. }
  156. @Test
  157. public void testEdit_InsertNearCommonCenter() {
  158. EditList r = diff(t("aBcd123uvwxPq"), t("abcd123123uvwxpq"));
  159. assertEquals(new Edit(1, 2, 1, 2), r.get(0));
  160. assertEquals(new Edit(7, 7, 7, 10), r.get(1));
  161. assertEquals(new Edit(11, 12, 14, 15), r.get(2));
  162. assertEquals(3, r.size());
  163. }
  164. @Test
  165. public void testEdit_LinuxBug() {
  166. EditList r = diff(t("a{bcdE}z"), t("a{0bcdEE}z"));
  167. assertEquals(new Edit(2, 2, 2, 3), r.get(0));
  168. assertEquals(new Edit(6, 6, 7, 8), r.get(1));
  169. assertEquals(2, r.size());
  170. }
  171. public EditList diff(RawText a, RawText b) {
  172. return algorithm().diff(RawTextComparator.DEFAULT, a, b);
  173. }
  174. protected abstract DiffAlgorithm algorithm();
  175. public static RawText t(String text) {
  176. StringBuilder r = new StringBuilder();
  177. for (int i = 0; i < text.length(); i++) {
  178. r.append(text.charAt(i));
  179. r.append('\n');
  180. }
  181. return new RawText(r.toString().getBytes(UTF_8));
  182. }
  183. }