| /* |
| * Copyright (c) 2024 Qualcomm Innovation Center, Inc. |
| * and other copyright owners as documented in the project's IP log. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Distribution License v. 1.0 which is available at |
| * https://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| package org.eclipse.jgit.diff; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import java.io.ByteArrayOutputStream; |
| import java.io.IOException; |
| import java.nio.charset.StandardCharsets; |
| import java.nio.file.Files; |
| import java.nio.file.Path; |
| import java.util.Arrays; |
| import java.util.stream.Collectors; |
| import org.eclipse.jgit.api.Git; |
| import org.eclipse.jgit.api.errors.GitAPIException; |
| import org.eclipse.jgit.junit.JGitTestUtil; |
| import org.eclipse.jgit.junit.RepositoryTestCase; |
| import org.eclipse.jgit.revwalk.RevCommit; |
| import org.eclipse.jgit.treewalk.CanonicalTreeParser; |
| import org.junit.Test; |
| |
| public class DiffFormatterBuiltInDriverTest extends RepositoryTestCase { |
| @Test |
| public void testCppDriver() throws Exception { |
| String fileName = "greeting.c"; |
| String body = Files.readString( |
| Path.of(JGitTestUtil.getTestResourceFile(fileName) |
| .getAbsolutePath())); |
| RevCommit c1; |
| RevCommit c2; |
| try (Git git = new Git(db)) { |
| createCommit(git, ".gitattributes", "*.c diff=cpp"); |
| c1 = createCommit(git, fileName, body); |
| c2 = createCommit(git, fileName, |
| body.replace("Good day", "Greetings") |
| .replace("baz", "qux")); |
| } |
| try (ByteArrayOutputStream os = new ByteArrayOutputStream(); |
| DiffFormatter diffFormatter = new DiffFormatter(os)) { |
| String actual = getHunkHeaders(c1, c2, os, diffFormatter); |
| String expected = |
| "@@ -27,7 +27,7 @@ void getPersonalizedGreeting(char *result, const char *name, const char *timeOfD\n" |
| + "@@ -37,7 +37,7 @@ int main() {"; |
| assertEquals(expected, actual); |
| } |
| } |
| |
| @Test |
| public void testDtsDriver() throws Exception { |
| String fileName = "sample.dtsi"; |
| String body = Files.readString( |
| Path.of(JGitTestUtil.getTestResourceFile(fileName) |
| .getAbsolutePath())); |
| RevCommit c1; |
| RevCommit c2; |
| try (Git git = new Git(db)) { |
| createCommit(git, ".gitattributes", "*.dtsi diff=dts"); |
| c1 = createCommit(git, fileName, body); |
| c2 = createCommit(git, fileName, |
| body.replace("clock-frequency = <24000000>", |
| "clock-frequency = <48000000>")); |
| } |
| try (ByteArrayOutputStream os = new ByteArrayOutputStream(); |
| DiffFormatter diffFormatter = new DiffFormatter(os)) { |
| String actual = getHunkHeaders(c1, c2, os, diffFormatter); |
| String expected = "@@ -20,6 +20,6 @@ uart0: uart@101f1000 {"; |
| assertEquals(expected, actual); |
| } |
| } |
| |
| @Test |
| public void testJavaDriver() throws Exception { |
| String resourceName = "greeting.javasource"; |
| String body = Files.readString( |
| Path.of(JGitTestUtil.getTestResourceFile(resourceName) |
| .getAbsolutePath())); |
| RevCommit c1; |
| RevCommit c2; |
| try (Git git = new Git(db)) { |
| createCommit(git, ".gitattributes", "*.java diff=java"); |
| String fileName = "Greeting.java"; |
| c1 = createCommit(git, fileName, body); |
| c2 = createCommit(git, fileName, |
| body.replace("Good day", "Greetings") |
| .replace("baz", "qux")); |
| } |
| try (ByteArrayOutputStream os = new ByteArrayOutputStream(); |
| DiffFormatter diffFormatter = new DiffFormatter(os)) { |
| String actual = getHunkHeaders(c1, c2, os, diffFormatter); |
| String expected = |
| "@@ -22,7 +22,7 @@ public String getPersonalizedGreeting(String name, String timeOfDay) {\n" |
| + "@@ -32,6 +32,6 @@ public static void main(String[] args) {"; |
| assertEquals(expected, actual); |
| } |
| } |
| |
| @Test |
| public void testPythonDriver() throws Exception { |
| String fileName = "greeting.py"; |
| String body = Files.readString( |
| Path.of(JGitTestUtil.getTestResourceFile(fileName) |
| .getAbsolutePath())); |
| RevCommit c1; |
| RevCommit c2; |
| try (Git git = new Git(db)) { |
| createCommit(git, ".gitattributes", "*.py diff=python"); |
| c1 = createCommit(git, fileName, body); |
| c2 = createCommit(git, fileName, |
| body.replace("Good day", "Greetings")); |
| } |
| try (ByteArrayOutputStream os = new ByteArrayOutputStream(); |
| DiffFormatter diffFormatter = new DiffFormatter(os)) { |
| String actual = getHunkHeaders(c1, c2, os, diffFormatter); |
| String expected = "@@ -16,7 +16,7 @@ def get_personalized_greeting(self, name, time_of_day):"; |
| assertEquals(expected, actual); |
| } |
| } |
| |
| @Test |
| public void testRustDriver() throws Exception { |
| String fileName = "greeting.rs"; |
| String body = Files.readString( |
| Path.of(JGitTestUtil.getTestResourceFile(fileName) |
| .getAbsolutePath())); |
| RevCommit c1; |
| RevCommit c2; |
| try (Git git = new Git(db)) { |
| createCommit(git, ".gitattributes", "*.rs diff=rust"); |
| c1 = createCommit(git, fileName, body); |
| c2 = createCommit(git, fileName, |
| body.replace("Good day", "Greetings") |
| .replace("baz", "qux")); |
| } |
| try (ByteArrayOutputStream os = new ByteArrayOutputStream(); |
| DiffFormatter diffFormatter = new DiffFormatter(os)) { |
| String actual = getHunkHeaders(c1, c2, os, diffFormatter); |
| String expected = |
| "@@ -14,7 +14,7 @@ fn get_personalized_greeting(&self, name: &str, time_of_day: &str) -> String {\n" |
| + "@@ -23,5 +23,5 @@ fn main() {"; |
| assertEquals(expected, actual); |
| } |
| } |
| |
| private String getHunkHeaders(RevCommit c1, RevCommit c2, |
| ByteArrayOutputStream os, DiffFormatter diffFormatter) |
| throws IOException { |
| diffFormatter.setRepository(db); |
| diffFormatter.format(new CanonicalTreeParser(null, db.newObjectReader(), |
| c1.getTree()), |
| new CanonicalTreeParser(null, db.newObjectReader(), |
| c2.getTree())); |
| diffFormatter.flush(); |
| return Arrays.stream(os.toString(StandardCharsets.UTF_8).split("\n")) |
| .filter(line -> line.startsWith("@@")) |
| .collect(Collectors.joining("\n")); |
| } |
| |
| private RevCommit createCommit(Git git, String fileName, String body) |
| throws IOException, GitAPIException { |
| writeTrashFile(fileName, body); |
| git.add().addFilepattern(".").call(); |
| return git.commit().setMessage("message").call(); |
| } |
| } |