/*
* ====================================================================
* Copyright (c) 2005-2012 sventon project. All rights reserved.
*
* This software is licensed as described in the file LICENSE, which
* you should have received as part of this distribution. The terms
* are also available at http://www.sventon.org.
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
package org.sventon.service.svnkit;
import org.junit.Test;
import org.mockito.Mockito;
import org.sventon.diff.IdenticalFilesException;
import org.sventon.diff.InlineDiffCreator;
import org.sventon.model.*;
import org.tmatesoft.svn.core.io.SVNRepository;
import java.util.Date;
import java.util.List;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class SVNKitRepositoryServiceTest {
private static final String ENCODING = "UTF-8";
private static final String NL = System.getProperty("line.separator");
@Test
public void testDiffUnifiedIdenticalEmptyFiles() throws Exception {
final SVNKitRepositoryService service = new SVNKitRepositoryService();
final PathRevision from = PathRevision.parse("/bug/code/try2/OrderDetailModel.java@91");
final PathRevision to = PathRevision.parse("/bug/code/try2/OrderDetailModel.java@90");
try {
service.createUnifiedDiff(from, to, ENCODING, new TextFile(""), new TextFile(""));
fail("Exception expected");
} catch (IdenticalFilesException e) {
// expected
}
}
@Test
public void testDiffUnifiedIdenticalFiles() throws Exception {
final SVNKitRepositoryService service = new SVNKitRepositoryService();
final PathRevision from = PathRevision.parse("/bug/code/try2/OrderDetailModel.java@91");
final PathRevision to = PathRevision.parse("/bug/code/try2/OrderDetailModel.java@90");
try {
final String contents = "test file contents";
service.createUnifiedDiff(from, to, ENCODING, new TextFile(contents), new TextFile(contents));
fail("No result should be produced for identical files");
} catch (IdenticalFilesException e) {
// expected
}
}
@Test
public void testDiffUnified() throws Exception {
final TextFile leftFile = new TextFile("test left file contents" + NL);
final TextFile rightFile = new TextFile("test right file contents" + NL);
final SVNKitRepositoryService service = new SVNKitRepositoryService();
final PathRevision from = PathRevision.parse("/bug/code/try2/OrderDetailModel.java@91");
final PathRevision to = PathRevision.parse("/bug/code/try2/OrderDetailModel.java@90");
final String s = service.createUnifiedDiff(from, to, ENCODING, leftFile, rightFile);
assertEquals("@@ -1 +1 @@" + NL + "-test left file contents" + NL + "+test right file contents", s.trim());
}
@Test
public void testDiffInline() throws Exception {
final TextFile leftFile = new TextFile(
"row one" + NL +
"row two" + NL +
"test left file contents" + NL +
"last row" + NL);
final TextFile rightFile = new TextFile(
"row one" + NL +
"test right file contents" + NL +
"last row" + NL);
final PathRevision from = PathRevision.parse("/bug/code/try2/OrderDetailModel.java@91");
final PathRevision to = PathRevision.parse("/bug/code/try2/OrderDetailModel.java@90");
final List<InlineDiffRow> list = InlineDiffCreator.createInlineDiff(from, to, ENCODING, leftFile, rightFile);
assertEquals("InlineDiffRow[line=row one,rowNumberLeft=1,rowNumberRight=1,action=UNCHANGED]", list.get(0).toString());
assertEquals("InlineDiffRow[line=row two,rowNumberLeft=2,rowNumberRight=<null>,action=DELETED]", list.get(1).toString());
assertEquals("InlineDiffRow[line=test left file contents,rowNumberLeft=3,rowNumberRight=<null>,action=DELETED]", list.get(2).toString());
assertEquals("InlineDiffRow[line=test right file contents,rowNumberLeft=<null>,rowNumberRight=2,action=ADDED]", list.get(3).toString());
assertEquals("InlineDiffRow[line=last row,rowNumberLeft=4,rowNumberRight=3,action=UNCHANGED]", list.get(4).toString());
assertEquals(5, list.size());
}
@Test
public void testDiffSideBySideIdenticalEmptyFiles() throws Exception {
final SVNKitRepositoryService service = new SVNKitRepositoryService();
final PathRevision from = PathRevision.parse("/bug/code/try2/OrderDetailModel.java@91");
final PathRevision to = PathRevision.parse("/bug/code/try2/OrderDetailModel.java@90");
try {
service.createSideBySideDiff(from, to, ENCODING, new TextFile(""), new TextFile(""));
fail("Expected exception!");
} catch (IdenticalFilesException e) {
// expected
}
}
@Test
public void testDiffSideBySideIdenticalFiles() throws Exception {
final SVNKitRepositoryService service = new SVNKitRepositoryService();
final TextFile leftFile = new TextFile("test file contents");
final TextFile rightFile = new TextFile("test file contents");
final PathRevision from = PathRevision.parse("/bug/code/try2/OrderDetailModel.java@91");
final PathRevision to = PathRevision.parse("/bug/code/try2/OrderDetailModel.java@90");
try {
service.createSideBySideDiff(from, to, ENCODING, leftFile, rightFile);
fail("Expected exception");
} catch (IdenticalFilesException e) {
// expected
}
}
@Test
public void testDiffSideBySide() throws Exception {
final SVNKitRepositoryService service = new SVNKitRepositoryService();
final TextFile leftFile = new TextFile("left file");
final TextFile rightFile = new TextFile("right file");
final PathRevision from = PathRevision.parse("/bug/code/try2/OrderDetailModel.java@91");
final PathRevision to = PathRevision.parse("/bug/code/try2/OrderDetailModel.java@90");
List<SideBySideDiffRow> diff = service.createSideBySideDiff(from, to, ENCODING, leftFile, rightFile);
assertEquals(1, diff.size());
final TextFile leftFile2 = new TextFile("/**\n" +
" * $Author$\n" +
" * $Revision$\n" +
" * $Date:$\n" +
" */\n" +
"Test1\n" +
"Another test!\n" +
"More!\n" +
"Even more!\n");
final TextFile rightFile2 = new TextFile("/**\n" +
" * $Id$\n" +
" * $LastChangedDate$\n" +
" * $Date$\n" +
" * $LastChangedRevision$\n" +
" * $Revision$\n" +
" * $Rev$\n" +
" * $LastChangedBy$\n" +
" * $Author$\n" +
" * $HeadURL$\n" +
" * $URL$\n" +
" * $Id$\n" +
" */\n" +
"Test1\n" +
"Another test!\n" +
"More!\n" +
"Even more!\n" +
"\n" +
"public String getRev {\n" +
" return \"$Rev$\";\n" +
"\n" +
"}\n");
String leftResult =
"1u/**\n" +
"2c * $Author$\n" +
"c\n" +
"c\n" +
"c\n" +
"3u * $Revision$\n" +
"4c * $Date:$\n" +
"c\n" +
"c\n" +
"c\n" +
"c\n" +
"c\n" +
"5u */\n" +
"6uTest1\n" +
"7uAnother test!\n" +
"8uMore!\n" +
"9uEven more!\n" +
"a\n" +
"a\n" +
"a\n" +
"a\n" +
"a\n";
String rightResult =
"1u/**\n" +
"2c * $Id$\n" +
"3c * $LastChangedDate$\n" +
"4c * $Date$\n" +
"5c * $LastChangedRevision$\n" +
"6u * $Revision$\n" +
"7c * $Rev$\n" +
"8c * $LastChangedBy$\n" +
"9c * $Author$\n" +
"10c * $HeadURL$\n" +
"11c * $URL$\n" +
"12c * $Id$\n" +
"13u */\n" +
"14uTest1\n" +
"15uAnother test!\n" +
"16uMore!\n" +
"17uEven more!\n" +
"18a\n" +
"19apublic String getRev {\n" +
"20a return "$Rev$";\n" +
"21a\n" +
"22a}\n";
diff = service.createSideBySideDiff(from, to, ENCODING, leftFile2, rightFile2);
StringBuilder sb = new StringBuilder();
for (final SideBySideDiffRow row : diff) {
final SourceLine line = row.getLeft();
sb.append(line.getRowNumberAsString());
sb.append(line.getAction().getCode());
sb.append(line.getLine());
sb.append("\n");
}
assertEquals(leftResult, sb.toString());
sb = new StringBuilder();
for (final SideBySideDiffRow row : diff) {
final SourceLine line = row.getRight();
sb.append(line.getRowNumberAsString());
sb.append(line.getAction().getCode());
sb.append(line.getLine());
sb.append("\n");
}
assertEquals(rightResult, sb.toString());
final TextFile leftFile3 = new TextFile(
"[.ShellClassInfo]\n" +
"InfoTip=@Shell32.dll,-12690\n" +
"IconFile=%SystemRoot%\\system32\\SHELL32.dll\n" +
"IconIndex=-238\n" +
"[DeleteOnCopy]\n" +
"Owner=Jesper\n" +
"Personalized=14\n" +
"PersonalizedName=Mina videoklipp\n");
final TextFile rightFile3 = new TextFile(
"[.ShellClassInfo]\n" +
"IconIndex=-2388\n" +
"[DeleteOnCopy]\n" +
"Owner=Jesper\n" +
"Owner=Patrik&Jesper\n" +
"Personalized=14\n" +
"PersonalizedName=Mina videoklipp\n" +
"OneMore=true\n" +
"OneMore=4\n" +
"OneMore=5\n" +
"OneMore=6\n" +
"OneMore=9\n");
leftResult =
"1u[.ShellClassInfo]\n" +
"2cInfoTip=@Shell32.dll,-12690\n" +
"3cIconFile=%SystemRoot%\\system32\\SHELL32.dll\n" +
"4cIconIndex=-238\n" +
"5u[DeleteOnCopy]\n" +
"6uOwner=Jesper\n" +
"a\n" +
"7uPersonalized=14\n" +
"8uPersonalizedName=Mina videoklipp\n" +
"a\n" +
"a\n" +
"a\n" +
"a\n" +
"a\n";
rightResult =
"1u[.ShellClassInfo]\n" +
"2cIconIndex=-2388\n" +
"c\n" +
"c\n" +
"3u[DeleteOnCopy]\n" +
"4uOwner=Jesper\n" +
"5aOwner=Patrik&Jesper\n" +
"6uPersonalized=14\n" +
"7uPersonalizedName=Mina videoklipp\n" +
"8aOneMore=true\n" +
"9aOneMore=4\n" +
"10aOneMore=5\n" +
"11aOneMore=6\n" +
"12aOneMore=9\n";
diff = service.createSideBySideDiff(from, to, ENCODING, leftFile3, rightFile3);
sb = new StringBuilder();
for (final SideBySideDiffRow row : diff) {
final SourceLine line = row.getLeft();
sb.append(line.getRowNumberAsString());
sb.append(line.getAction().getCode());
sb.append(line.getLine());
sb.append("\n");
}
assertEquals(leftResult, sb.toString());
sb = new StringBuilder();
for (final SideBySideDiffRow row : diff) {
final SourceLine line = row.getRight();
sb.append(line.getRowNumberAsString());
sb.append(line.getAction().getCode());
sb.append(line.getLine());
sb.append("\n");
}
assertEquals(rightResult, sb.toString());
}
@Test
public void testTranslateRevision() throws Exception {
final SVNKitRepositoryService service = new SVNKitRepositoryService();
Revision revision;
revision = service.translateRevision(null, Revision.parse("head"), 100);
assertEquals(100, revision.getNumber());
assertTrue(revision.isHeadRevision());
revision = service.translateRevision(null, Revision.parse(""), 100);
assertEquals(100, revision.getNumber());
assertTrue(revision.isHeadRevision());
revision = service.translateRevision(null, Revision.parse("123"), 200);
assertEquals(Revision.create(123), revision);
assertFalse(revision.isHeadRevision());
revision = service.translateRevision(null, Revision.parse("200"), 200);
assertEquals(Revision.create(200).getNumber(), revision.getNumber());
assertTrue(revision.isHeadRevision());
assertEquals("HEAD", revision.toString());
final SVNRepository repositoryMock = mock(SVNRepository.class);
when(repositoryMock.getDatedRevision(Mockito.isA(Date.class))).thenReturn(123L);
revision = service.translateRevision(new SVNKitConnection(repositoryMock, null, null), Revision.parse("{2007-01-01}"), 200);
assertEquals(123, revision.getNumber());
assertFalse(revision.isHeadRevision());
}
}