From 851245433f0273c7350976ff1e9a0c2c1ff80f91 Mon Sep 17 00:00:00 2001
From: Peter Powers <pmpowers@usgs.gov>
Date: Mon, 27 Sep 2021 08:33:24 -0600
Subject: [PATCH] added peer test classes

---
 .../earthquake/nshmp/model/peer/PeerTest.java | 179 ++++++++
 .../model/peer/PeerTestArgumentProviders.java | 294 +++++++++++++
 .../nshmp/model/peer/PeerTests.java           | 386 ++++++++++++++++++
 3 files changed, 859 insertions(+)
 create mode 100644 src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTest.java
 create mode 100644 src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTestArgumentProviders.java
 create mode 100644 src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTests.java

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTest.java b/src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTest.java
new file mode 100644
index 000000000..d4e13f704
--- /dev/null
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTest.java
@@ -0,0 +1,179 @@
+package gov.usgs.earthquake.nshmp.model.peer;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static gov.usgs.earthquake.nshmp.internal.Parsing.Delimiter.COMMA;
+import static java.lang.Math.abs;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.logging.LogManager;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.params.provider.Arguments;
+import org.xml.sax.SAXException;
+
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Iterables;
+import com.google.common.primitives.Doubles;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+import gov.usgs.earthquake.nshmp.Maths;
+import gov.usgs.earthquake.nshmp.calc.CalcConfig;
+import gov.usgs.earthquake.nshmp.calc.Hazard;
+import gov.usgs.earthquake.nshmp.calc.HazardCalcs;
+import gov.usgs.earthquake.nshmp.calc.Site;
+import gov.usgs.earthquake.nshmp.calc.Sites;
+import gov.usgs.earthquake.nshmp.gmm.Imt;
+import gov.usgs.earthquake.nshmp.internal.Parsing;
+import gov.usgs.earthquake.nshmp.model.HazardModel;
+
+public class PeerTest {
+
+  public static final String S1_C1 = "Set1-Case1";
+  public static final String S1_C2 = "Set1-Case2";
+  public static final String S1_C2_F = "Set1-Case2-fast";
+  public static final String S1_C3 = "Set1-Case3";
+  public static final String S1_C3_F = "Set1-Case3-fast";
+  public static final String S1_C4 = "Set1-Case4";
+  public static final String S1_C4_F = "Set1-Case4-fast";
+  public static final String S1_C5 = "Set1-Case5";
+  public static final String S1_C5_F = "Set1-Case5-fast";
+  public static final String S1_C6 = "Set1-Case6";
+  public static final String S1_C6_F = "Set1-Case6-fast";
+  public static final String S1_C7 = "Set1-Case7";
+  public static final String S1_C7_F = "Set1-Case7-fast";
+  public static final String S1_C8A = "Set1-Case8a";
+  public static final String S1_C8B = "Set1-Case8b";
+  public static final String S1_C8B_F = "Set1-Case8b-fast";
+  public static final String S1_C8C = "Set1-Case8c";
+  public static final String S1_C10 = "Set1-Case10";
+  public static final String S1_C10_F = "Set1-Case10-fast";
+  public static final String S1_C11 = "Set1-Case11";
+  public static final String S1_C11_F = "Set1-Case11-fast";
+
+  public static final String S2_C1 = "Set2-Case1";
+  public static final String S2_C2A = "Set2-Case2a";
+  public static final String S2_C2A_F = "Set2-Case2a-fast";
+  public static final String S2_C2B = "Set2-Case2b";
+  public static final String S2_C2B_F = "Set2-Case2b-fast";
+  public static final String S2_C2C = "Set2-Case2c";
+  public static final String S2_C2C_F = "Set2-Case2c-fast";
+  public static final String S2_C2D = "Set2-Case2d";
+  public static final String S2_C2D_F = "Set2-Case2d-fast";
+  public static final String S2_C3A = "Set2-Case3a";
+  public static final String S2_C3A_F = "Set2-Case3a-fast";
+  public static final String S2_C3B = "Set2-Case3b";
+  public static final String S2_C3B_F = "Set2-Case3b-fast";
+  public static final String S2_C3C = "Set2-Case3c";
+  public static final String S2_C3C_F = "Set2-Case3c-fast";
+  public static final String S2_C3D = "Set2-Case3d";
+  public static final String S2_C3D_F = "Set2-Case3d-fast";
+  public static final String S2_C4A = "Set2-Case4a";
+  public static final String S2_C4A_F = "Set2-Case4a-fast";
+  public static final String S2_C4B = "Set2-Case4b";
+  public static final String S2_C4B_F = "Set2-Case4b-fast";
+  public static final String S2_C5A = "Set2-Case5a";
+  public static final String S2_C5B = "Set2-Case5b";
+
+  public static final String S3_C1A = "Set3-Case1a";
+  public static final String S3_C1B = "Set3-Case1a";
+  public static final String S3_C2 = "Set3-Case2";
+  public static final String S3_C3 = "Set3-Case3";
+  public static final String S3_C4 = "Set3-Case4";
+
+  private static final Path PEER_DIR = Paths.get("etc", "peer");
+  // private static final Path PEER_DIR = Paths.get("..", "nshmp-model-dev",
+  // "models", "PEER");
+  private static final Path MODEL_DIR = PEER_DIR.resolve("models");
+  private static final Path RESULT_DIR = PEER_DIR.resolve("results");
+
+  static Gson gson = new GsonBuilder().setPrettyPrinting().create();
+
+  static void test(
+      String modelName,
+      HazardModel model,
+      Site site,
+      double[] expected,
+      double tolerance,
+      ExecutorService exec) {
+    Hazard result = HazardCalcs.hazard(model, model.config(), site, exec);
+    // compute y-values converting to Poiss prob
+    double[] actual = Doubles.toArray(
+        FluentIterable
+            .from(result.curves().get(Imt.PGA).yValues().boxed().collect(Collectors.toList()))
+            .transform(Maths.annualRateToProbabilityConverter())
+            .toList());
+    checkArgument(actual.length == expected.length);
+
+    assertArrayEquals(expected, actual, tolerance);
+    for (int i = 0; i < expected.length; i++) {
+      String message = String.format("arrays differ at [%s] expected:<[%s]> but was:<[%s]>",
+          i, expected[i], actual[i]);
+      assertTrue(compare(expected[i], actual[i], tolerance), message);
+    }
+  }
+
+  private static boolean compare(double expected, double actual, double tolerance) {
+    return abs(actual - expected) / expected < tolerance ||
+        Double.valueOf(expected).equals(Double.valueOf(actual));
+  }
+
+  public static Stream<? extends Arguments> load(String modelId) throws IOException, SAXException {
+
+    /* NOTE this is disabling all logging in Loader and HazardCalc */
+    LogManager.getLogManager().reset();
+
+    Map<String, double[]> expectedsMap = loadExpecteds(modelId);
+    HazardModel model = HazardModel.load(MODEL_DIR.resolve(modelId));
+    CalcConfig config = model.config();
+    Iterable<Site> sites = Sites.fromCsv(MODEL_DIR.resolve(
+        modelId).resolve("sites.csv"),
+        config,
+        model.siteData());
+
+    // ensure that only PGA is being used
+    checkState(config.hazard.imts.size() == 1);
+    checkState(config.hazard.imts.iterator().next() == Imt.PGA);
+
+    List<Object[]> argsList = new ArrayList<>();
+    for (Site site : sites) {
+      checkState(expectedsMap.containsKey(site.name()));
+      Object[] args = new Object[] { model.name(), model, site, expectedsMap.get(site.name()) };
+      argsList.add(args);
+    }
+    return argsList.stream().map(Arguments::of);
+  }
+
+  private static Map<String, double[]> loadExpecteds(String modelId) throws IOException {
+    Path results = RESULT_DIR.resolve(modelId + ".csv");
+    List<String> lines = Files.readAllLines(results, UTF_8);
+    Map<String, double[]> siteValuesMap = new HashMap<>();
+    for (String line : Iterables.skip(lines, 1)) {
+      String[] splitLine = line.split(",", 4);
+      String siteName = splitLine[0];
+      List<Double> values = Parsing.splitToDoubleList(splitLine[3], COMMA);
+      siteValuesMap.put(siteName, Doubles.toArray(values));
+    }
+    return siteValuesMap;
+  }
+
+  // TODO Clean
+  // public static void main(String[] args) {
+  // String model = MODEL_DIR.resolve(S1_C11_F).toString();
+  // HazardCalc.main(new String[] { model });
+  // }
+
+}
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTestArgumentProviders.java b/src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTestArgumentProviders.java
new file mode 100644
index 000000000..38517d47a
--- /dev/null
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTestArgumentProviders.java
@@ -0,0 +1,294 @@
+package gov.usgs.earthquake.nshmp.model.peer;
+
+import java.util.stream.Stream;
+
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.ArgumentsProvider;
+
+/**
+ * {@code ArgumentProviders} for parameterized tests in {@link PeerTests}
+ */
+public class PeerTestArgumentProviders {
+
+  public static class Set1Case1 implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C1);
+    }
+  }
+
+  public static class Set1Case2 implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C2);
+    }
+  }
+
+  public static class Set1Case2_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C2_F);
+    }
+  }
+
+  public static class Set1Case3 implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C3);
+    }
+  }
+
+  public static class Set1Case3_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C3_F);
+    }
+  }
+
+  public static class Set1Case4 implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C4);
+    }
+  }
+
+  public static class Set1Case4_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C4_F);
+    }
+  }
+
+  public static class Set1Case5 implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C5);
+    }
+  }
+
+  public static class Set1Case5_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C5_F);
+    }
+  }
+
+  public static class Set1Case6 implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C6);
+    }
+  }
+
+  public static class Set1Case6_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C6_F);
+    }
+  }
+
+  public static class Set1Case7 implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C7);
+    }
+  }
+
+  public static class Set1Case7_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C7_F);
+    }
+  }
+
+  public static class Set1Case8a implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C8A);
+    }
+  }
+
+  public static class Set1Case8b implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C8B);
+    }
+  }
+
+  public static class Set1Case8c implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C8C);
+    }
+  }
+
+  public static class Set1Case10 implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C10);
+    }
+  }
+
+  public static class Set1Case10_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S1_C10_F);
+    }
+  }
+
+  public static class Set2Case2a implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C2A);
+    }
+  }
+
+  public static class Set2Case2a_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C2A_F);
+    }
+  }
+
+  public static class Set2Case2b implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C2B);
+    }
+  }
+
+  public static class Set2Case2b_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C2B_F);
+    }
+  }
+
+  public static class Set2Case2c implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C2C);
+    }
+  }
+
+  public static class Set2Case2c_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C2C_F);
+    }
+  }
+
+  public static class Set2Case2d implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C2D);
+    }
+  }
+
+  public static class Set2Case2d_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C2D_F);
+    }
+  }
+
+  public static class Set2Case3a implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C3A);
+    }
+  }
+
+  public static class Set2Case3a_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C3A_F);
+    }
+  }
+
+  public static class Set2Case3b implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C3B);
+    }
+  }
+
+  public static class Set2Case3b_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C3B_F);
+    }
+  }
+
+  public static class Set2Case3c implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C3C);
+    }
+  }
+
+  public static class Set2Case3c_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C3C_F);
+    }
+  }
+
+  public static class Set2Case3d implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C3D);
+    }
+  }
+
+  public static class Set2Case3d_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C3D_F);
+    }
+  }
+
+  public static class Set2Case4a implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C4A);
+    }
+  }
+
+  public static class Set2Case4a_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C4A_F);
+    }
+  }
+
+  public static class Set2Case4b implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C4B);
+    }
+  }
+
+  public static class Set2Case4b_Fast implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C4B_F);
+    }
+  }
+
+  public static class Set2Case5a implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C5A);
+    }
+  }
+
+  public static class Set2Case5b implements ArgumentsProvider {
+    @Override
+    public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
+      return PeerTest.load(PeerTest.S2_C5B);
+    }
+  }
+
+}
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTests.java b/src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTests.java
new file mode 100644
index 000000000..04f4486b9
--- /dev/null
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTests.java
@@ -0,0 +1,386 @@
+package gov.usgs.earthquake.nshmp.model.peer;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+
+import gov.usgs.earthquake.nshmp.calc.Site;
+import gov.usgs.earthquake.nshmp.model.HazardModel;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case1;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case10;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case10_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case2;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case2_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case3;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case3_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case4;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case4_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case5;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case5_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case6;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case6_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case7;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case7_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case8a;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case8b;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set1Case8c;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case2a;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case2a_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case2b;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case2b_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case2c;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case2c_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case2d;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case2d_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case3a;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case3a_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case3b;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case3b_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case3c;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case3c_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case3d;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case3d_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case4a;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case4a_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case4b;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case4b_Fast;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case5a;
+import gov.usgs.earthquake.nshmp.model.peer.PeerTestArgumentProviders.Set2Case5b;
+
+public class PeerTests {
+
+  /*
+   * This is the primary entry point for running all PEER test cases.
+   *
+   * All tolerances are percentages.
+   *
+   * Although HazardCurve calculations return results in annual rate, all PEER
+   * test case comparisons are done as Poisson probability.
+   */
+
+  private static ExecutorService EXEC;
+  private static final double TOL = 1e-6;
+
+  @BeforeAll
+  public static void setUpBeforeClass() throws Exception {
+    EXEC = Executors.newSingleThreadExecutor();
+  }
+
+  @AfterAll
+  public static void tearDownAfterClass() throws Exception {
+    EXEC.shutdown();
+  }
+
+  @Test
+  void emptyTestEclipseBug() {
+    /*
+     * Silly workaround for junt5 tests in eclipse where no tests are found
+     * unless at least one @Test annotaion exists.
+     */
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case1.class)
+  @DisplayName("Set1 Case1")
+  public final void set1Case1(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case2.class)
+  @DisplayName("Set1 Case2")
+  public final void set1Case2(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case2_Fast.class)
+  @DisplayName("Set1 Case2 Fast")
+  public final void set1Case2F(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case3.class)
+  @DisplayName("Set1 Case3")
+  public final void set1Case3(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case3_Fast.class)
+  @DisplayName("Set1 Case3 Fast")
+  public final void set1Case3F(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case4.class)
+  @DisplayName("Set1 Case4")
+  public final void set1Case4(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case4_Fast.class)
+  @DisplayName("Set1 Case4 Fast")
+  public final void set1Case4F(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case5.class)
+  @DisplayName("Set1 Case5")
+  public final void set1Case5(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case5_Fast.class)
+  @DisplayName("Set1 Case5 Fast")
+  public final void set1Case5F(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case6.class)
+  @DisplayName("Set1 Case6")
+  public final void set1Case6(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case6_Fast.class)
+  @DisplayName("Set1 Case6 Fast")
+  public final void set1Case6F(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case7.class)
+  @DisplayName("Set1 Case7")
+  public final void set1Case7(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case7_Fast.class)
+  @DisplayName("Set1 Case7 Fast")
+  public final void set1Case7F(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case8a.class)
+  @DisplayName("Set1 Case8a")
+  public final void set1Case8a(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case8b.class)
+  @DisplayName("Set1 Case8b")
+  public final void set1Case8b(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case8c.class)
+  @DisplayName("Set1 Case8c")
+  public final void set1Case8c(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case10.class)
+  @DisplayName("Set1 Case10")
+  public final void set1Case10(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set1Case10_Fast.class)
+  @DisplayName("Set1 Case10 Fast")
+  public final void set1Case10F(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case2a.class)
+  @DisplayName("Set2 Case2a")
+  public final void set2Case2a(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case2a_Fast.class)
+  @DisplayName("Set2 Case2a Fast")
+  public final void set2Case2aF(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case2b.class)
+  @DisplayName("Set2 Case2b")
+  public final void set2Case2b(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case2b_Fast.class)
+  @DisplayName("Set2 Caseb2 Fast")
+  public final void set2Case2bF(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case2c.class)
+  @DisplayName("Set2 Case2c")
+  public final void set2Case2c(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case2c_Fast.class)
+  @DisplayName("Set2 Case2c Fast")
+  public final void set2Case2cF(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case2d.class)
+  @DisplayName("Se2 Case2d")
+  public final void set2Case2d(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case2d_Fast.class)
+  @DisplayName("Set2 Case2d Fast")
+  public final void set2Case2dF(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case3a.class)
+  @DisplayName("Set2 Case3a")
+  public final void set2Case3a(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case3a_Fast.class)
+  @DisplayName("Set2 Case3a Fast")
+  public final void set2Case3aF(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case3b.class)
+  @DisplayName("Set2 Case3b")
+  public final void set2Case3b(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case3b_Fast.class)
+  @DisplayName("Set2 Case3b Fast")
+  public final void set2Case3bF(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case3c.class)
+  @DisplayName("Set2 Case3c")
+  public final void set2Case3c(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case3c_Fast.class)
+  @DisplayName("Set2 Case3c Fast")
+  public final void set2Case3cF(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case3d.class)
+  @DisplayName("Set2 Case3d")
+  public final void set2Case3d(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case3d_Fast.class)
+  @DisplayName("Set2 Case3d Fast")
+  public final void set2Case3dF(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case4a.class)
+  @DisplayName("Set2 Case4a")
+  public final void set2Case4a(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case4a_Fast.class)
+  @DisplayName("Set2 Case4a Fast")
+  public final void set2Case4aF(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @Disabled
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case4b.class)
+  @DisplayName("Set2 Case4b")
+  public final void set2Case4b(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case4b_Fast.class)
+  @DisplayName("Set2 Case4b Fast")
+  public final void set2Case4bF(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case5a.class)
+  @DisplayName("Set2 Case5a")
+  public final void set2Case5a(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+  @ParameterizedTest(name = "{0}, Site={index}")
+  @ArgumentsSource(Set2Case5b.class)
+  @DisplayName("Set2 Case5b")
+  public final void set2Case5b(String modelName, HazardModel model, Site site, double[] expected) {
+    PeerTest.test(modelName, model, site, expected, TOL, EXEC);
+  }
+
+}
-- 
GitLab