diff --git a/examples/tests/TestConstraintSolver.java b/examples/tests/ConstraintSolverTest.java similarity index 85% rename from examples/tests/TestConstraintSolver.java rename to examples/tests/ConstraintSolverTest.java index 2ff9b3ee7e..3bf1576b60 100644 --- a/examples/tests/TestConstraintSolver.java +++ b/examples/tests/ConstraintSolverTest.java @@ -10,7 +10,9 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. +package com.google.ortools; +import com.google.ortools.Loader; import com.google.ortools.constraintsolver.Assignment; import com.google.ortools.constraintsolver.AssignmentIntContainer; import com.google.ortools.constraintsolver.BaseLns; @@ -32,13 +34,12 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; /** Tests the Constraint solver java interface. */ -public class TestConstraintSolver { - static { - System.loadLibrary("jniortools"); - } - +public class ConstraintSolverTest { private static void gc() { Object obj = new Object(); WeakReference ref = new WeakReference(obj); @@ -48,9 +49,11 @@ public class TestConstraintSolver { } } - private static final Logger logger = Logger.getLogger(TestConstraintSolver.class.getName()); + private static final Logger logger = Logger.getLogger(ConstraintSolverTest.class.getName()); - static void testSolverCtor() throws Exception { + @Test + public void testSolverCtor() throws Exception { + Loader.loadNativeLibraries(); logger.info("testSolverCtor..."); Solver solver = new Solver("TestSolver"); if (!solver.model_name().equals("TestSolver")) {throw new AssertionError("Solver ill formed");} @@ -58,7 +61,9 @@ public class TestConstraintSolver { logger.info("testSolverCtor...DONE"); } - static void testIntVar() throws Exception { + @Test + public void testIntVar() throws Exception { + Loader.loadNativeLibraries(); logger.info("testIntVar..."); Solver solver = new Solver("Solver"); IntVar var = solver.makeIntVar(3, 11, "IntVar"); @@ -67,7 +72,9 @@ public class TestConstraintSolver { logger.info("testIntVar...DONE"); } - static void testIntVarArray() throws Exception { + @Test + private static void testIntVarArray() throws Exception { + Loader.loadNativeLibraries(); logger.info("testIntVarArray..."); Solver solver = new Solver("Solver"); IntVar[] vars = solver.makeIntVarArray(7, 3, 5, "vars"); @@ -79,7 +86,7 @@ public class TestConstraintSolver { logger.info("testIntVarArray...DONE"); } - static class MoveOneVar extends IntVarLocalSearchOperator { + private static class MoveOneVar extends IntVarLocalSearchOperator { public MoveOneVar(IntVar[] variables) { super(variables); variableIndex = 0; @@ -108,7 +115,9 @@ public class TestConstraintSolver { private boolean moveUp; } - static void testSolver() throws Exception { + @Test + public void testSolver() throws Exception { + Loader.loadNativeLibraries(); Solver solver = new Solver("Solver"); IntVar[] vars = solver.makeIntVarArray(4, 0, 4, "vars"); IntVar sumVar = solver.makeSum(vars).var(); @@ -125,7 +134,7 @@ public class TestConstraintSolver { logger.info("Objective value = " + collector.objectiveValue(0)); } - static class SumFilter extends IntVarLocalSearchFilter { + private static class SumFilter extends IntVarLocalSearchFilter { public SumFilter(IntVar[] vars) { super(vars); sum = 0; @@ -163,7 +172,9 @@ public class TestConstraintSolver { private long sum; } - static void testSolverWithFilter() throws Exception { + @Test + public void testSolverWithFilter() throws Exception { + Loader.loadNativeLibraries(); Solver solver = new Solver("Solver"); IntVar[] vars = solver.makeIntVarArray(4, 0, 4, "vars"); IntVar sumVar = solver.makeSum(vars).var(); @@ -185,7 +196,7 @@ public class TestConstraintSolver { logger.info("Objective value = " + collector.objectiveValue(0)); } - static class OneVarLns extends BaseLns { + private static class OneVarLns extends BaseLns { public OneVarLns(IntVar[] vars) { super(vars); } @@ -210,7 +221,9 @@ public class TestConstraintSolver { private int index_; } - static void testSolverLns() throws Exception { + @Test + public void testSolverLns() throws Exception { + Loader.loadNativeLibraries(); Solver solver = new Solver("Solver"); IntVar[] vars = solver.makeIntVarArray(4, 0, 4, "vars"); IntVar sumVar = solver.makeSum(vars).var(); @@ -240,7 +253,9 @@ public class TestConstraintSolver { } // Simple Coverage test... - static void testSearchLog() throws Exception { + @Test + public void testSearchLog() throws Exception { + Loader.loadNativeLibraries(); logger.info("testSearchLog..."); Solver solver = new Solver("TestSearchLog"); IntVar var = solver.makeIntVar(1, 1, "Variable"); @@ -250,7 +265,7 @@ public class TestConstraintSolver { logger.info("testSearchLog...DONE"); } - static class SearchCount implements Supplier { + private static class SearchCount implements Supplier { public SearchCount(AtomicInteger count_) { count = count_; } @@ -262,7 +277,10 @@ public class TestConstraintSolver { private AtomicInteger count; } - static void testSearchLogWithCallback(boolean enableGC) throws Exception { + @ParameterizedTest + @ValueSource(booleans = { false, true }) + public void testSearchLogWithCallback(boolean enableGC) throws Exception { + Loader.loadNativeLibraries(); logger.info("testSearchLogWithCallback (enable gc:" + enableGC + ")..."); Solver solver = new Solver("TestSearchLog"); IntVar var = solver.makeIntVar(1, 1, "Variable"); @@ -281,7 +299,10 @@ public class TestConstraintSolver { logger.info("testSearchLogWithCallback (enable gc:" + enableGC + ")...DONE"); } - static void testSearchLogWithIntVarCallback(boolean enableGC) throws Exception { + @ParameterizedTest + @ValueSource(booleans = { false, true }) + public void testSearchLogWithIntVarCallback(boolean enableGC) throws Exception { + Loader.loadNativeLibraries(); logger.info("testSearchLogWithIntVarCallback (enable gc:" + enableGC + ")..."); Solver solver = new Solver("TestSearchLog"); IntVar var = solver.makeIntVar(1, 1, "Variable"); @@ -299,7 +320,10 @@ public class TestConstraintSolver { logger.info("testSearchLogWithIntVarCallback (enable gc:" + enableGC + ")...DONE"); } - static void testSearchLogWithObjectiveCallback(boolean enableGC) throws Exception { + @ParameterizedTest + @ValueSource(booleans = { false, true }) + public void testSearchLogWithObjectiveCallback(boolean enableGC) throws Exception { + Loader.loadNativeLibraries(); logger.info("testSearchLogWithObjectiveCallback (enable gc:" + enableGC + ")..."); Solver solver = new Solver("TestSearchLog"); IntVar var = solver.makeIntVar(1, 1, "Variable"); @@ -317,7 +341,7 @@ public class TestConstraintSolver { logger.info("testSearchLogWithObjectiveCallback (enable gc:" + enableGC + ")...DONE"); } - static class StringProperty { + private static class StringProperty { public StringProperty(String value) { value_ = value; } @@ -330,7 +354,10 @@ public class TestConstraintSolver { private String value_; } - static void testClosureDecision(boolean enableGC) throws Exception { + @ParameterizedTest + @ValueSource(booleans = { false, true }) + public void testClosureDecision(boolean enableGC) throws Exception { + Loader.loadNativeLibraries(); logger.info("testClosureDecision (enable gc:" + enableGC + ")..."); final StringProperty call = new StringProperty(""); Solver solver = new Solver("ClosureDecisionTest"); @@ -349,7 +376,10 @@ public class TestConstraintSolver { logger.info("testClosureDecision (enable gc:" + enableGC + ")...DONE"); } - static void testSolverInClosureDecision(boolean enableGC) throws Exception { + @ParameterizedTest + @ValueSource(booleans = { false, true }) + public void testSolverInClosureDecision(boolean enableGC) throws Exception { + Loader.loadNativeLibraries(); logger.info("testSolverInClosureDecision (enable gc:" + enableGC + ")..."); Solver solver = new Solver("SolverTestName"); String model_name = solver.model_name(); @@ -368,27 +398,4 @@ public class TestConstraintSolver { decision.refute(solver); logger.info("testSolverInClosureDecision (enable gc:" + enableGC + ")...DONE"); } - - public static void main(String[] args) throws Exception { - testSolverCtor(); - - testIntVar(); - testIntVarArray(); - - testSolver(); - testSolverWithFilter(); - testSolverLns(); - - testSearchLog(); - testSearchLogWithCallback(/*enableGC=*/false); - testSearchLogWithCallback(/*enableGC=*/true); - testSearchLogWithIntVarCallback(/*enableGC=*/false); - testSearchLogWithIntVarCallback(/*enableGC=*/true); - testSearchLogWithObjectiveCallback(/*enableGC=*/false); - testSearchLogWithObjectiveCallback(/*enableGC=*/true); - testClosureDecision(/*enableGC=*/false); - testClosureDecision(/*enableGC=*/true); - testSolverInClosureDecision(/*enableGC=*/false); - testSolverInClosureDecision(/*enableGC=*/true); - } } diff --git a/examples/tests/TestLinearSolver.java b/examples/tests/LinearSolverTest.java similarity index 85% rename from examples/tests/TestLinearSolver.java rename to examples/tests/LinearSolverTest.java index 4f3cb9d00f..589c571060 100644 --- a/examples/tests/TestLinearSolver.java +++ b/examples/tests/LinearSolverTest.java @@ -10,7 +10,9 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. +package com.google.ortools; +import com.google.ortools.Loader; import com.google.ortools.linearsolver.MPConstraint; import com.google.ortools.linearsolver.MPObjective; import com.google.ortools.linearsolver.MPSolver; @@ -19,18 +21,19 @@ import com.google.ortools.linearsolver.main_research_linear_solver; import java.util.Arrays; import java.util.ArrayList; import java.util.logging.Logger; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; - -public class TestLinearSolver { +public class LinearSolverTest { static { - System.loadLibrary("jniortools"); System.setProperty("java.util.logging.SimpleFormatter.format", "[%1$tF %1$tT] [%4$-7s] %5$s %n"); } - private static final Logger logger = Logger.getLogger(TestLinearSolver.class.getName()); + private static final Logger logger = Logger.getLogger(LinearSolverTest.class.getName()); - static void solveAndPrint(MPSolver solver, MPVariable[] variables, MPConstraint[] constraints) { + private static void solveAndPrint(MPSolver solver, MPVariable[] variables, MPConstraint[] constraints) { logger.info("Number of variables = " + solver.numVariables()); logger.info("Number of constraints = "+ solver.numConstraints()); @@ -64,7 +67,9 @@ public class TestLinearSolver { ); } - static void runLinearProgrammingExample(String problem_type) { + @ParameterizedTest + @ValueSource(strings = { "GLOP", "GLPK_LP", "CLP", "GUROBI_LP" }) + private static void testLinearProgramming(String problem_type) { logger.info("------ Linear programming example with " + problem_type + " ------"); MPSolver solver = MPSolver.createSolver(problem_type); @@ -98,7 +103,9 @@ public class TestLinearSolver { solveAndPrint(solver, new MPVariable[] {x, y}, new MPConstraint[] {c0, c1, c2}); } - static void runMixedIntegerProgrammingExample(String problem_type) { + @ParameterizedTest + @ValueSource(strings = { "GLPK", "CBC", "SCIP", "SAT" }) + private static void testMixedIntegerProgramming(String problem_type) { logger.info("------ Mixed integer programming example with " + problem_type + " ------"); MPSolver solver = MPSolver.createSolver(problem_type); @@ -127,7 +134,9 @@ public class TestLinearSolver { solveAndPrint(solver, new MPVariable[] {x, y}, new MPConstraint[] {c0, c1}); } - static void runBooleanProgrammingExample(String problem_type) { + @ParameterizedTest + @ValueSource(strings = { "SAT", "BOP" }) + private static void testBooleanProgramming(String problem_type) { logger.info("------ Boolean programming example with " + problem_type + " ------"); MPSolver solver = MPSolver.createSolver(problem_type); @@ -151,7 +160,9 @@ public class TestLinearSolver { solveAndPrint(solver, new MPVariable[] {x, y}, new MPConstraint[] {c0}); } - static void testSameConstraintName() { + @Test + public void testSameConstraintName() { + Loader.loadNativeLibraries(); MPSolver solver = MPSolver.createSolver("CBC"); boolean success = true; solver.makeConstraint("my_const_name"); @@ -164,7 +175,9 @@ public class TestLinearSolver { logger.info("Success = " + success); } - static void testSetHintAndSolverGetters() { + @Test + public void testSetHintAndSolverGetters() { + Loader.loadNativeLibraries(); MPSolver solver = MPSolver.createSolver("GLOP"); // x and y are continuous non-negative variables. @@ -196,24 +209,4 @@ public class TestLinearSolver { solver.setHint(new MPVariable[] {x, y}, new double[] {2.0, 3.0}); } - - - - public static void main(String[] args) throws Exception { - testSameConstraintName(); - testSetHintAndSolverGetters(); - - runLinearProgrammingExample("GLOP"); - runLinearProgrammingExample("GLPK_LP"); - runLinearProgrammingExample("CLP"); - runLinearProgrammingExample("GUROBI_LP"); - - runMixedIntegerProgrammingExample("GLPK"); - runMixedIntegerProgrammingExample("CBC"); - runMixedIntegerProgrammingExample("SCIP"); - runMixedIntegerProgrammingExample("SAT"); - - runBooleanProgrammingExample("SAT"); - runBooleanProgrammingExample("BOP"); - } } diff --git a/examples/tests/TestRoutingSolver.java b/examples/tests/RoutingSolverTest.java similarity index 86% rename from examples/tests/TestRoutingSolver.java rename to examples/tests/RoutingSolverTest.java index 756ab6ba41..17e884365b 100644 --- a/examples/tests/TestRoutingSolver.java +++ b/examples/tests/RoutingSolverTest.java @@ -10,7 +10,9 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. +package com.google.ortools; +import com.google.ortools.Loader; import static java.lang.Math.abs; import java.util.logging.Logger; import com.google.ortools.constraintsolver.Assignment; @@ -19,14 +21,17 @@ import com.google.ortools.constraintsolver.RoutingIndexManager; import com.google.ortools.constraintsolver.RoutingModel; import com.google.ortools.constraintsolver.RoutingSearchParameters; import com.google.ortools.constraintsolver.main; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; /** Tests the Routing java interface. */ -public class TestRoutingSolver { - static { System.loadLibrary("jniortools"); } +public class RoutingSolverTest { + private static final Logger logger = Logger.getLogger(RoutingSolverTest.class.getName()); - private static final Logger logger = Logger.getLogger(TestRoutingSolver.class.getName()); - - static void testRoutingTransitCallback(boolean enableGC) { + @ParameterizedTest + @ValueSource(booleans = { false, true }) + public void testRoutingTransitCallback(boolean enableGC) { + Loader.loadNativeLibraries(); logger.info("testRoutingTransitCallback (enable gc:" + enableGC + ")..."); // Create Routing Index Manager RoutingIndexManager manager = @@ -61,7 +66,10 @@ public class TestRoutingSolver { logger.info("testRoutingTransitCallback (enable gc:" + enableGC + ")...DONE"); } - static void testRoutingUnaryTransitCallback(boolean enableGC) { + @ParameterizedTest + @ValueSource(booleans = { false, true }) + public void testRoutingUnaryTransitCallback(boolean enableGC) { + Loader.loadNativeLibraries(); logger.info("testRoutingUnaryTransitCallback (enable gc:" + enableGC + ")..."); // Create Routing Index Manager RoutingIndexManager manager = @@ -94,11 +102,4 @@ public class TestRoutingSolver { if (10 != solution.objectiveValue()) throw new AssertionError("5 != objective"); logger.info("testRoutingUnaryTransitCallback (enable gc:" + enableGC + ")...DONE"); } - - public static void main(String[] args) throws Exception { - testRoutingTransitCallback(/*enable_gc=*/false); - testRoutingTransitCallback(/*enable_gc=*/true); - testRoutingUnaryTransitCallback(/*enable_gc=*/false); - testRoutingUnaryTransitCallback(/*enable_gc=*/true); - } } diff --git a/examples/tests/TestSatSolver.java b/examples/tests/SatSolverTest.java similarity index 86% rename from examples/tests/TestSatSolver.java rename to examples/tests/SatSolverTest.java index ad45d3a02a..2d504777f9 100644 --- a/examples/tests/TestSatSolver.java +++ b/examples/tests/SatSolverTest.java @@ -10,7 +10,9 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. +package com.google.ortools; +import com.google.ortools.Loader; import com.google.ortools.sat.CpModel; import com.google.ortools.sat.CpSolver; import com.google.ortools.sat.CpSolverStatus; @@ -19,15 +21,15 @@ import com.google.ortools.sat.LinearExpr; import com.google.ortools.util.Domain; import java.util.logging.Logger; import java.util.Random; +import org.junit.jupiter.api.Test; /** Tests the CP-SAT java interface. */ -public class TestSatSolver { - static { System.loadLibrary("jniortools"); } +public class SatSolverTest { + private static final Logger logger = Logger.getLogger(SatSolverTest.class.getName()); - private static final Logger logger = Logger.getLogger(TestSatSolver.class.getName()); - - - static void testDomainGetter() { + @Test + public void testDomainGetter() { + Loader.loadNativeLibraries(); System.out.println("testDomainGetter"); CpModel model = new CpModel(); @@ -38,14 +40,12 @@ public class TestSatSolver { long[] flat = d.flattenedIntervals(); if (flat.length != 2 || flat[0] != 0 || flat[1] != 5) { throw new RuntimeException("Wrong domain"); - } else { - System.out.println(" ... test OK"); } } - - - static void testCrashInPresolve() { + @Test + public void testCrashInPresolve() { + Loader.loadNativeLibraries(); System.out.println("testCrashInPresolve"); CpModel model = new CpModel(); @@ -75,13 +75,13 @@ public class TestSatSolver { if (status != CpSolverStatus.INFEASIBLE) { throw new RuntimeException("Wrong status in testCrashInPresolve"); - } else { - System.out.println(" ... test OK"); } } - private static IntVar[] entitiesOne; - private static void testCrashInSolveWithAllowedAssignment() { + private IntVar[] entitiesOne; + @Test + public void testCrashInSolveWithAllowedAssignment() { + Loader.loadNativeLibraries(); System.out.println("testCrashInSolveWithAllowedAssignment"); final CpModel model = new CpModel(); final int numEntityOne = 50000; @@ -107,10 +107,11 @@ public class TestSatSolver { } final CpSolver solver = new CpSolver(); solver.solve(model); - System.out.println(" ... test OK"); } - private static void testCrashEquality() { + @Test + public void testCrashEquality() { + Loader.loadNativeLibraries(); System.out.println("testCrashInSolveWithAllowedAssignment"); final CpModel model = new CpModel(); @@ -156,17 +157,15 @@ public class TestSatSolver { final CpSolver solver = new CpSolver(); solver.solve(model); - - System.out.println(" ... test OK"); } - private static void addEqualities(final CpModel model, final IntVar[] entities, final Integer[] equalities) { + private void addEqualities(final CpModel model, final IntVar[] entities, final Integer[] equalities) { for (int i = 0; i < (equalities.length - 1); i++) { model.addEquality(entities[equalities[i]], entities[equalities[i + 1]]); } } - private static void addAllowedAssignMents(final CpModel model, final IntVar[] entities, final Integer[] allowedAssignments, + private void addAllowedAssignMents(final CpModel model, final IntVar[] entities, final Integer[] allowedAssignments, final Integer[] allowedAssignmentValues) { final int[][] allAllowedValues = new int[allowedAssignmentValues.length][allowedAssignments.length]; for (int i = 0; i < allowedAssignmentValues.length; i++) { @@ -186,7 +185,7 @@ public class TestSatSolver { } } - private static void addForbiddenAssignments(final Integer[] forbiddenAssignmentsValues, final Integer[] forbiddenAssignments, + private void addForbiddenAssignments(final Integer[] forbiddenAssignmentsValues, final Integer[] forbiddenAssignments, final IntVar[] entities, final CpModel model) { final IntVar[] specificEntities = new IntVar[forbiddenAssignments.length]; for (int i = 0; i < forbiddenAssignments.length; i++) { @@ -207,11 +206,4 @@ public class TestSatSolver { } } - - public static void main(String[] args) throws Exception { - testDomainGetter(); - testCrashInPresolve(); - testCrashInSolveWithAllowedAssignment(); - testCrashEquality(); - } } diff --git a/makefiles/Makefile.java.mk b/makefiles/Makefile.java.mk index c08b9c5b10..a0bbba9f5f 100644 --- a/makefiles/Makefile.java.mk +++ b/makefiles/Makefile.java.mk @@ -355,166 +355,6 @@ run: build $(SOURCE_NAME) $(ARGS) endif -############################# -## Java Examples/Samples ## -############################# -$(CLASS_DIR)/%: $(TEST_DIR)/%.java $(JAVA_ORTOOLS_JAR) | $(CLASS_DIR) - -$(DELREC) $(CLASS_DIR)$S$* - -$(MKDIR_P) $(CLASS_DIR)$S$* - "$(JAVAC_BIN)" -encoding UTF-8 -d $(CLASS_DIR)$S$* \ - -cp $(LIB_DIR)$Scom.google.ortools.jar$(CPSEP)$(LIB_DIR)$Sprotobuf.jar \ - $(TEST_PATH)$S$*.java - -$(LIB_DIR)/%$J: $(CLASS_DIR)/% | $(LIB_DIR) - -$(DEL) $(LIB_DIR)$S$*.jar - "$(JAR_BIN)" cvf $(LIB_DIR)$S$*.jar -C $(CLASS_DIR)$S$* . - -rjava_%: $(TEST_DIR)/%.java $(LIB_DIR)/%$J FORCE - "$(JAVA_BIN)" -Xss2048k $(JAVAFLAGS) \ - -cp $(LIB_DIR)$S$*$J$(CPSEP)$(LIB_DIR)$Scom.google.ortools.jar$(CPSEP)$(LIB_DIR)$Sprotobuf.jar \ - $* $(ARGS) - -.PHONY: test_java_algorithms_samples # Build and Run all Java Algorithms Samples (located in ortools/algorithms/samples) -test_java_algorithms_samples: \ - rjava_Knapsack - -.PHONY: test_java_constraint_solver_samples # Build and Run all Java CP Samples (located in ortools/constraint_solver/samples) -test_java_constraint_solver_samples: \ - rjava_SimpleCpProgram \ - rjava_SimpleRoutingProgram \ - rjava_Tsp \ - rjava_TspCities \ - rjava_TspCircuitBoard \ - rjava_TspDistanceMatrix \ - rjava_Vrp \ - rjava_VrpCapacity \ - rjava_VrpDropNodes \ - rjava_VrpGlobalSpan \ - rjava_VrpInitialRoutes \ - rjava_VrpPickupDelivery \ - rjava_VrpPickupDeliveryFifo \ - rjava_VrpPickupDeliveryLifo \ - rjava_VrpResources \ - rjava_VrpStartsEnds \ - rjava_VrpTimeWindows \ - rjava_VrpWithTimeLimit - -.PHONY: test_java_graph_samples # Build and Run all Java Graph Samples (located in ortools/graph/samples) -test_java_graph_samples: \ - -.PHONY: test_java_linear_solver_samples # Build and Run all Java LP Samples (located in ortools/linear_solver/samples) -test_java_linear_solver_samples: \ - rjava_AssignmentMip \ - rjava_BinPackingMip \ - rjava_LinearProgrammingExample \ - rjava_MipVarArray \ - rjava_MultipleKnapsackMip \ - rjava_SimpleLpProgram \ - rjava_SimpleMipProgram - -.PHONY: test_java_sat_samples # Build and Run all Java SAT Samples (located in ortools/sat/samples) -test_java_sat_samples: \ - rjava_AssignmentSat \ - rjava_BinPackingProblemSat \ - rjava_BoolOrSampleSat \ - rjava_ChannelingSampleSat \ - rjava_CpIsFunSat \ - rjava_EarlinessTardinessCostSampleSat \ - rjava_IntervalSampleSat \ - rjava_LiteralSampleSat \ - rjava_NoOverlapSampleSat \ - rjava_OptionalIntervalSampleSat \ - rjava_RabbitsAndPheasantsSat \ - rjava_RankingSampleSat \ - rjava_ReifiedSampleSat \ - rjava_SearchForAllSolutionsSampleSat \ - rjava_SimpleSatProgram \ - rjava_SolveAndPrintIntermediateSolutionsSampleSat \ - rjava_SolveWithTimeLimitSampleSat \ - rjava_SolutionHintingSampleSat \ - rjava_StepFunctionSampleSat \ - rjava_StopAfterNSolutionsSampleSat - -.PHONY: check_java_pimpl -check_java_pimpl: \ - test_java_algorithms_samples \ - test_java_constraint_solver_samples \ - test_java_graph_samples \ - test_java_linear_solver_samples \ - test_java_sat_samples \ - \ - rjava_LinearProgramming \ - rjava_IntegerProgramming - -.PHONY: test_java_tests # Build and Run all Java Tests (located in examples/tests) -test_java_tests: \ - rjava_TestLinearSolver \ - rjava_TestConstraintSolver \ - rjava_TestRoutingSolver \ - rjava_TestSatSolver \ - -.PHONY: test_java_contrib # Build and Run all Java Contrib (located in examples/contrib) -test_java_contrib: \ - rjava_AllDifferentExcept0 \ - rjava_AllInterval \ - rjava_Circuit \ - rjava_CoinsGridMIP \ - rjava_ColoringMIP \ - rjava_CoveringOpl \ - rjava_Crossword \ - rjava_DeBruijn \ - rjava_Diet \ - rjava_DietMIP \ - rjava_DivisibleBy9Through1 \ - rjava_GolombRuler \ - rjava_KnapsackMIP \ - rjava_LeastDiff \ - rjava_MagicSquare \ - rjava_Map2 \ - rjava_Map \ - rjava_Minesweeper \ - rjava_MultiThreadTest \ - rjava_NQueens2 \ - rjava_NQueens \ - rjava_Partition \ - rjava_QuasigroupCompletion \ - rjava_SendMoreMoney2 \ - rjava_SendMoreMoney \ - rjava_SendMostMoney \ - rjava_Seseman \ - rjava_SetCovering2 \ - rjava_SetCovering3 \ - rjava_SetCovering4 \ - rjava_SetCoveringDeployment \ - rjava_SetCovering \ - rjava_SimpleRoutingTest \ - rjava_StableMarriage \ - rjava_StiglerMIP \ - rjava_Strimko2 \ - rjava_Sudoku \ - rjava_SurvoPuzzle \ - rjava_ToNum \ - rjava_WhoKilledAgatha \ - rjava_Xkcd \ - rjava_YoungTableaux - -.PHONY: test_java_java # Build and Run all Java Examples (located in ortools/examples/java) -test_java_java: \ - rjava_CapacitatedVehicleRoutingProblemWithTimeWindows \ - rjava_FlowExample \ - rjava_IntegerProgramming \ - rjava_LinearAssignmentAPI \ - rjava_LinearProgramming \ - rjava_RabbitsPheasants \ - rjava_RandomTsp - -.PHONY: test_java_pimpl -test_java_pimpl: \ - check_java_pimpl \ - test_java_tests \ - test_java_contrib \ - test_java_java - ################ ## Cleaning ## ################ @@ -538,6 +378,8 @@ clean_java: ################### ## Maven package ## ################### +package_java_pimpl: java_package + $(TEMP_JAVA_DIR): -$(MKDIR) $(TEMP_JAVA_DIR) @@ -547,8 +389,6 @@ $(TEMP_JAVA_DIR)/$(JAVA_ORTOOLS_PROJECT): | $(TEMP_JAVA_DIR) $(TEMP_JAVA_DIR)/$(JAVA_ORTOOLS_NATIVE_PROJECT): | $(TEMP_JAVA_DIR) -$(MKDIR) $(TEMP_JAVA_DIR)$S$(JAVA_ORTOOLS_NATIVE_PROJECT) -package_java_pimpl: java_package - $(TEMP_JAVA_DIR)/$(JAVA_ORTOOLS_NATIVE_PROJECT)/pom.xml: \ ${SRC_DIR}/ortools/java/pom-native.xml.in \ | $(TEMP_JAVA_DIR)/$(JAVA_ORTOOLS_NATIVE_PROJECT) @@ -560,8 +400,11 @@ $(TEMP_JAVA_DIR)/$(JAVA_ORTOOLS_NATIVE_PROJECT)/pom.xml: \ $(SED) -i -e 's/@JAVA_NATIVE_PROJECT@/$(JAVA_ORTOOLS_NATIVE_PROJECT)/' \ $(TEMP_JAVA_DIR)$S$(JAVA_ORTOOLS_NATIVE_PROJECT)$Spom.xml -java_runtime: \ - java \ +.PHONY: java_runtime +java_runtime: $(TEMP_JAVA_DIR)/$(JAVA_ORTOOLS_NATIVE_PROJECT)/timestamp + +$(TEMP_JAVA_DIR)/$(JAVA_ORTOOLS_NATIVE_PROJECT)/timestamp: \ + $(JAVA_ORTOOLS_JAR) \ $(TEMP_JAVA_DIR)/$(JAVA_ORTOOLS_NATIVE_PROJECT)/pom.xml $(MKDIR_P) $(JAVA_NATIVE_PATH)$Sresources$S$(JAVA_NATIVE_IDENTIFIER) $(COPY) $(subst /,$S,$(JAVA_ORTOOLS_NATIVE_LIBS)) $(JAVA_NATIVE_PATH)$Sresources$S$(JAVA_NATIVE_IDENTIFIER) @@ -571,6 +414,7 @@ endif cd $(TEMP_JAVA_DIR)$S$(JAVA_ORTOOLS_NATIVE_PROJECT) && "$(MVN_BIN)" compile cd $(TEMP_JAVA_DIR)$S$(JAVA_ORTOOLS_NATIVE_PROJECT) && "$(MVN_BIN)" package cd $(TEMP_JAVA_DIR)$S$(JAVA_ORTOOLS_NATIVE_PROJECT) && "$(MVN_BIN)" install + $(TOUCH) $(TEMP_JAVA_DIR)$S$(JAVA_ORTOOLS_NATIVE_PROJECT)$Stimestamp $(TEMP_JAVA_DIR)/$(JAVA_ORTOOLS_PROJECT)/pom.xml: \ @@ -586,8 +430,11 @@ $(TEMP_JAVA_DIR)/$(JAVA_ORTOOLS_PROJECT)/pom.xml: \ $(SED) -i -e 's/@JAVA_PROJECT@/$(JAVA_ORTOOLS_PROJECT)/' \ $(TEMP_JAVA_DIR)$S$(JAVA_ORTOOLS_PROJECT)$Spom.xml -java_package: \ - java_runtime \ +.PHONY: java_package +java_package: $(TEMP_JAVA_DIR)/$(JAVA_ORTOOLS_PROJECT)/timestamp + +$(TEMP_JAVA_DIR)/$(JAVA_ORTOOLS_PROJECT)/timestamp: \ + $(TEMP_JAVA_DIR)/$(JAVA_ORTOOLS_NATIVE_PROJECT)/timestamp \ $(TEMP_JAVA_DIR)/$(JAVA_ORTOOLS_PROJECT)/pom.xml $(MKDIR_P) $(JAVA_PATH)$Sjava ifeq ($(SYSTEM),unix) @@ -600,6 +447,7 @@ endif cd $(TEMP_JAVA_DIR)$S$(JAVA_ORTOOLS_PROJECT) && "$(MVN_BIN)" compile cd $(TEMP_JAVA_DIR)$S$(JAVA_ORTOOLS_PROJECT) && "$(MVN_BIN)" package cd $(TEMP_JAVA_DIR)$S$(JAVA_ORTOOLS_PROJECT) && "$(MVN_BIN)" install + $(TOUCH) $(TEMP_JAVA_DIR)$S$(JAVA_ORTOOLS_PROJECT)$Stimestamp ############################# ## Java Examples/Samples ## @@ -698,6 +546,190 @@ endef $(foreach example,$(EXAMPLES),$(eval $(call java-example-target,$(example)))) +JAVA_TEST_DIR := src/test/java/com/google/ortools +JAVA_TEST_PATH := $(subst /,$S,$(JAVA_TEST_DIR)) + +$(TEMP_JAVA_DIR)/tests: | $(TEMP_JAVA_DIR) + -$(MKDIR) $(TEMP_JAVA_DIR)$Stests + +$(TEMP_JAVA_DIR)/tests/%: \ + $(SRC_DIR)/examples/tests/%.java \ + | $(TEMP_JAVA_DIR)/tests + -$(MKDIR) $(TEMP_JAVA_DIR)$Stests$S$* + +$(TEMP_JAVA_DIR)/tests/%/pom.xml: \ + ${SRC_DIR}/ortools/java/pom-test.xml.in \ + | $(TEMP_JAVA_DIR)/tests/% + $(SED) -e "s/@JAVA_PACKAGE@/$(JAVA_ORTOOLS_PACKAGE)/" \ + ortools$Sjava$Spom-test.xml.in \ + > $(TEMP_JAVA_DIR)$Stests$S$*$Spom.xml + $(SED) -i -e 's/@JAVA_TEST_PROJECT@/$*/' \ + $(TEMP_JAVA_DIR)$Stests$S$*$Spom.xml + $(SED) -i -e 's/@PROJECT_VERSION@/$(OR_TOOLS_VERSION)/' \ + $(TEMP_JAVA_DIR)$Stests$S$*$Spom.xml + $(SED) -i -e 's/@JAVA_PROJECT@/$(JAVA_ORTOOLS_PROJECT)/' \ + $(TEMP_JAVA_DIR)$Stests$S$*$Spom.xml + +$(TEMP_JAVA_DIR)/tests/%/$(JAVA_TEST_DIR)/%.java: \ + $(SRC_DIR)/examples/tests/%.java \ + | $(TEMP_JAVA_DIR)/tests/% + $(MKDIR_P) $(TEMP_JAVA_DIR)$Stests$S$*$S$(JAVA_TEST_PATH) + $(COPY) $(SRC_DIR)$Sexamples$Stests$S$*.java \ + $(TEMP_JAVA_DIR)$Stests$S$*$S$(JAVA_TEST_PATH) + +rjava_%: \ + java_package \ + $(SRC_DIR)/examples/tests/%.java \ + $(TEMP_JAVA_DIR)/tests/%/pom.xml \ + $(TEMP_JAVA_DIR)/tests/%/$(JAVA_TEST_DIR)/%.java \ + FORCE + cd $(TEMP_JAVA_DIR)$Stests$S$* && "$(MVN_BIN)" compile + cd $(TEMP_JAVA_DIR)$Stests$S$* && "$(MVN_BIN)" test $(ARGS) + +############################# +## Java Examples/Samples ## +############################# +.PHONY: test_java_algorithms_samples # Build and Run all Java Algorithms Samples (located in ortools/algorithms/samples) +test_java_algorithms_samples: \ + rjava_Knapsack + +.PHONY: test_java_constraint_solver_samples # Build and Run all Java CP Samples (located in ortools/constraint_solver/samples) +test_java_constraint_solver_samples: \ + rjava_SimpleCpProgram \ + rjava_SimpleRoutingProgram \ + rjava_Tsp \ + rjava_TspCities \ + rjava_TspCircuitBoard \ + rjava_TspDistanceMatrix \ + rjava_Vrp \ + rjava_VrpCapacity \ + rjava_VrpDropNodes \ + rjava_VrpGlobalSpan \ + rjava_VrpInitialRoutes \ + rjava_VrpPickupDelivery \ + rjava_VrpPickupDeliveryFifo \ + rjava_VrpPickupDeliveryLifo \ + rjava_VrpResources \ + rjava_VrpStartsEnds \ + rjava_VrpTimeWindows \ + rjava_VrpWithTimeLimit + +.PHONY: test_java_graph_samples # Build and Run all Java Graph Samples (located in ortools/graph/samples) +test_java_graph_samples: \ + +.PHONY: test_java_linear_solver_samples # Build and Run all Java LP Samples (located in ortools/linear_solver/samples) +test_java_linear_solver_samples: \ + rjava_AssignmentMip \ + rjava_BinPackingMip \ + rjava_LinearProgrammingExample \ + rjava_MipVarArray \ + rjava_MultipleKnapsackMip \ + rjava_SimpleLpProgram \ + rjava_SimpleMipProgram + +.PHONY: test_java_sat_samples # Build and Run all Java SAT Samples (located in ortools/sat/samples) +test_java_sat_samples: \ + rjava_AssignmentSat \ + rjava_BinPackingProblemSat \ + rjava_BoolOrSampleSat \ + rjava_ChannelingSampleSat \ + rjava_CpIsFunSat \ + rjava_EarlinessTardinessCostSampleSat \ + rjava_IntervalSampleSat \ + rjava_LiteralSampleSat \ + rjava_NoOverlapSampleSat \ + rjava_OptionalIntervalSampleSat \ + rjava_RabbitsAndPheasantsSat \ + rjava_RankingSampleSat \ + rjava_ReifiedSampleSat \ + rjava_SearchForAllSolutionsSampleSat \ + rjava_SimpleSatProgram \ + rjava_SolveAndPrintIntermediateSolutionsSampleSat \ + rjava_SolveWithTimeLimitSampleSat \ + rjava_SolutionHintingSampleSat \ + rjava_StepFunctionSampleSat \ + rjava_StopAfterNSolutionsSampleSat + +.PHONY: check_java_pimpl +check_java_pimpl: \ + test_java_algorithms_samples \ + test_java_constraint_solver_samples \ + test_java_graph_samples \ + test_java_linear_solver_samples \ + test_java_sat_samples \ + \ + rjava_LinearProgramming \ + rjava_IntegerProgramming + +.PHONY: test_java_tests # Build and Run all Java Tests (located in examples/tests) +test_java_tests: \ + rjava_LinearSolverTest \ + rjava_ConstraintSolverTest \ + rjava_RoutingSolverTest \ + rjava_SatSolverTest \ + +.PHONY: test_java_contrib # Build and Run all Java Contrib (located in examples/contrib) +test_java_contrib: \ + rjava_AllDifferentExcept0 \ + rjava_AllInterval \ + rjava_Circuit \ + rjava_CoinsGridMIP \ + rjava_ColoringMIP \ + rjava_CoveringOpl \ + rjava_Crossword \ + rjava_DeBruijn \ + rjava_Diet \ + rjava_DietMIP \ + rjava_DivisibleBy9Through1 \ + rjava_GolombRuler \ + rjava_KnapsackMIP \ + rjava_LeastDiff \ + rjava_MagicSquare \ + rjava_Map2 \ + rjava_Map \ + rjava_Minesweeper \ + rjava_MultiThreadTest \ + rjava_NQueens2 \ + rjava_NQueens \ + rjava_Partition \ + rjava_QuasigroupCompletion \ + rjava_SendMoreMoney2 \ + rjava_SendMoreMoney \ + rjava_SendMostMoney \ + rjava_Seseman \ + rjava_SetCovering2 \ + rjava_SetCovering3 \ + rjava_SetCovering4 \ + rjava_SetCoveringDeployment \ + rjava_SetCovering \ + rjava_SimpleRoutingTest \ + rjava_StableMarriage \ + rjava_StiglerMIP \ + rjava_Strimko2 \ + rjava_Sudoku \ + rjava_SurvoPuzzle \ + rjava_ToNum \ + rjava_WhoKilledAgatha \ + rjava_Xkcd \ + rjava_YoungTableaux + +.PHONY: test_java_java # Build and Run all Java Examples (located in ortools/examples/java) +test_java_java: \ + rjava_CapacitatedVehicleRoutingProblemWithTimeWindows \ + rjava_FlowExample \ + rjava_IntegerProgramming \ + rjava_LinearAssignmentAPI \ + rjava_LinearProgramming \ + rjava_RabbitsPheasants \ + rjava_RandomTsp + +.PHONY: test_java_pimpl +test_java_pimpl: \ + check_java_pimpl \ + test_java_tests \ + test_java_contrib \ + test_java_java + ############# ## DEBUG ## ############# diff --git a/ortools/java/Loader.java b/ortools/java/Loader.java index d407b46aeb..e84fcaf839 100644 --- a/ortools/java/Loader.java +++ b/ortools/java/Loader.java @@ -76,17 +76,21 @@ public class Loader { } /** Unpack and Load the native libraries needed for using ortools-java.*/ + private static boolean loaded = false; public static void loadNativeLibraries() { - try { - URI resourceURI = getNativeResourceURI(); - Path tempPath = unpackNativeResources(resourceURI); - // Load the native library - System.load( - tempPath.resolve(Platform.RESOURCE_PREFIX) - .resolve(System.mapLibraryName("jniortools")) - .toString()); - } catch (IOException e) { - throw new RuntimeException(e); + if(!loaded) { + try { + URI resourceURI = getNativeResourceURI(); + Path tempPath = unpackNativeResources(resourceURI); + // Load the native library + System.load( + tempPath.resolve(Platform.RESOURCE_PREFIX) + .resolve(System.mapLibraryName("jniortools")) + .toString()); + loaded = true; + } catch (IOException e) { + throw new RuntimeException(e); + } } } } diff --git a/ortools/java/Test.java b/ortools/java/Test.java index 13fbbab412..7810942076 100644 --- a/ortools/java/Test.java +++ b/ortools/java/Test.java @@ -1,17 +1,17 @@ package com.google.ortools; import com.google.ortools.Loader; - import com.google.ortools.linearsolver.MPConstraint; import com.google.ortools.linearsolver.MPObjective; import com.google.ortools.linearsolver.MPSolver; import com.google.ortools.linearsolver.MPVariable; +import org.junit.jupiter.api.Test; -/** - * @author Mizux - */ +/** @author Mizux */ public class Test { - private static void testLP() { + @Test + public void testLP() { + Loader.loadNativeLibraries(); MPSolver solver = new MPSolver("SimpleLpProgram", MPSolver.OptimizationProblemType.GLOP_LINEAR_PROGRAMMING); MPVariable x = solver.makeNumVar(0.0, 1.0, "x"); @@ -31,10 +31,4 @@ public class Test { System.out.println("x = " + x.solutionValue()); System.out.println("y = " + y.solutionValue()); } - - public static void main(String[] args) { - Loader.loadNativeLibraries(); - testLP(); - } } - diff --git a/ortools/java/pom-test.xml.in b/ortools/java/pom-test.xml.in index 2704961d66..de1fb2ad64 100644 --- a/ortools/java/pom-test.xml.in +++ b/ortools/java/pom-test.xml.in @@ -63,15 +63,25 @@ compile - junit - junit - 4.13 + org.junit.jupiter + junit-jupiter-engine + 5.7.0 + test + + + org.junit.jupiter + junit-jupiter-params + 5.7.0 test + + maven-surefire-plugin + 2.22.2 + org.apache.maven.plugins maven-source-plugin