From 212a881f8e28c63e609a210d200feab2fc1d3946 Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Thu, 14 Mar 2024 21:23:35 +0100 Subject: [PATCH 1/3] Woodpecker CI --- .github/workflows/maven.yml | 26 -------------------------- .woodpecker/maven.yml | 5 +++++ 2 files changed, 5 insertions(+), 26 deletions(-) delete mode 100644 .github/workflows/maven.yml create mode 100644 .woodpecker/maven.yml diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml deleted file mode 100644 index c3f4f1f..0000000 --- a/.github/workflows/maven.yml +++ /dev/null @@ -1,26 +0,0 @@ -# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven - -name: Java CI with Maven - -on: - push: - branches: [ "*" ] - pull_request: - branches: [ "master", "dev" ] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' - cache: maven - - name: Build with Maven - run: mvn -B package --file pom.xml diff --git a/.woodpecker/maven.yml b/.woodpecker/maven.yml new file mode 100644 index 0000000..877f1e3 --- /dev/null +++ b/.woodpecker/maven.yml @@ -0,0 +1,5 @@ +steps: + - name: test + image: maven:3.9.6-eclipse-temurin-17-alpine + commands: + - mvn -B verify From 088d557a07cd359a8f1d3874599238a07e861143 Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Thu, 14 Mar 2024 21:50:34 +0100 Subject: [PATCH 2/3] Some comments in code --- .../ztsh/training/hackerrank/EnvironmentTest.java | 1 + .../ztsh/training/hackerrank/HackerRankTest.java | 10 ++++++++++ .../training/hackerrank/ReflectionHelper.java | 15 +++++++++++++-- .../hackerrank/SolutionClassDescription.java | 7 +++++++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/test/java/eu/ztsh/training/hackerrank/EnvironmentTest.java b/src/test/java/eu/ztsh/training/hackerrank/EnvironmentTest.java index 5fe0e22..fda2bda 100644 --- a/src/test/java/eu/ztsh/training/hackerrank/EnvironmentTest.java +++ b/src/test/java/eu/ztsh/training/hackerrank/EnvironmentTest.java @@ -2,6 +2,7 @@ package eu.ztsh.training.hackerrank; import java.util.List; import java.util.Scanner; + import eu.ztsh.training.hackerrank.SolutionClassDescription.FieldModifier; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/eu/ztsh/training/hackerrank/HackerRankTest.java b/src/test/java/eu/ztsh/training/hackerrank/HackerRankTest.java index cf59987..106f212 100644 --- a/src/test/java/eu/ztsh/training/hackerrank/HackerRankTest.java +++ b/src/test/java/eu/ztsh/training/hackerrank/HackerRankTest.java @@ -7,13 +7,18 @@ import java.io.PrintStream; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.List; + import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +/** + * Common class with all the necessary logic + */ public abstract class HackerRankTest { @BeforeAll public static void setUpStreams() { + // Redirect stdout & stderr to own streams System.setOut(new PrintStream(outContent)); System.setErr(new PrintStream(errContent)); } @@ -27,14 +32,19 @@ public abstract class HackerRankTest { protected List invoke(List input) { try { + // reset our stdout as check is based on it outContent.reset(); + // write content to args of Solution#main writeLines(input); + // check if scanner has other name than "scanner" if (getSolutionClassDescription().fieldName() != null) { ReflectionHelper.reloadScanner(getSolutionClassDescription()); } + // run Solution#main getSolutionClassDescription().targetClass() .getMethod("main", String[].class) .invoke(null, (Object) new String[]{}); + // return intercepted output return readLines(); } catch (final NoSuchMethodException | InvocationTargetException | IllegalAccessException | NoSuchFieldException e) { diff --git a/src/test/java/eu/ztsh/training/hackerrank/ReflectionHelper.java b/src/test/java/eu/ztsh/training/hackerrank/ReflectionHelper.java index 498becf..d00b23e 100644 --- a/src/test/java/eu/ztsh/training/hackerrank/ReflectionHelper.java +++ b/src/test/java/eu/ztsh/training/hackerrank/ReflectionHelper.java @@ -5,9 +5,12 @@ import java.lang.invoke.VarHandle; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.Scanner; + import eu.ztsh.training.hackerrank.SolutionClassDescription.FieldModifier; - +/** + * Util that helps with scanner declared outside Solution#main + */ public class ReflectionHelper { // https://stackoverflow.com/a/56043252 @@ -21,7 +24,15 @@ public class ReflectionHelper { } } - static void reloadScanner(SolutionClassDescription description) throws NoSuchFieldException, IllegalAccessException { + /** + * Modify scanner field to substitute it with custom readable one + * + * @param description Solution class parameters + * @throws NoSuchFieldException when there description.fieldName points to incorrect name + * @throws IllegalAccessException on scanner substitution error + */ + static void reloadScanner(SolutionClassDescription description) + throws NoSuchFieldException, IllegalAccessException { // https://stackoverflow.com/a/3301720 var scannerField = description.hasModifier(FieldModifier.STATIC) ? description.targetClass().getDeclaredField(description.fieldName()) diff --git a/src/test/java/eu/ztsh/training/hackerrank/SolutionClassDescription.java b/src/test/java/eu/ztsh/training/hackerrank/SolutionClassDescription.java index b141262..2ac51dd 100644 --- a/src/test/java/eu/ztsh/training/hackerrank/SolutionClassDescription.java +++ b/src/test/java/eu/ztsh/training/hackerrank/SolutionClassDescription.java @@ -2,6 +2,13 @@ package eu.ztsh.training.hackerrank; import java.util.Arrays; +/** + * Solution params definition + * + * @param targetClass Solution + * @param fieldName scanner field name + * @param modifiers scanner field modifiers + */ public record SolutionClassDescription(Class targetClass, String fieldName, FieldModifier[] modifiers) { SolutionClassDescription(Class targetClass) { From d583784ee870b4b577f31129c0235f86d1cda25d Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Fri, 15 Mar 2024 01:05:56 +0100 Subject: [PATCH 3/3] ci: Master branch mirroring --- .woodpecker/main-mirror.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .woodpecker/main-mirror.yml diff --git a/.woodpecker/main-mirror.yml b/.woodpecker/main-mirror.yml new file mode 100644 index 0000000..1972f97 --- /dev/null +++ b/.woodpecker/main-mirror.yml @@ -0,0 +1,13 @@ +skip_clone: true + +steps: + - name: mirror + image: bitnami/git:2.44.0 + commands: + - git clone $CI_REPO_CLONE_URL repository + - cd repository + - git push https://Administrator:$GIT_PAT@git.ztsh.eu/Administrator/hackerrank.git + secrets: [git_pat] + +when: + branch: master