diff --git a/tests/test_probabilist.cpp b/tests/test_probabilist.cpp
index 8c1f04065ab02a5c2f4bcc77fe89b3f80729f73f..be6cb4fb7c7015d979656698932aee8e6349258f 100644
--- a/tests/test_probabilist.cpp
+++ b/tests/test_probabilist.cpp
@@ -136,6 +136,274 @@ TEST(ProbabilistTests, TestQuantiles)
     EXPECT_TRUE(xt::allclose(metrics[1], crps));
 }
 
+TEST(ProbabilistTests, TestContingency)
+{
+    // read in data
+    xt::xtensor<double, 1> observed;
+    xt::xtensor<double, 2> predicted;
+    std::tie(observed, predicted) = load_data_p();
+
+    // compute scores
+    xt::xtensor<double, 2> thresholds = {{690, 534, 445, NAN}};
+
+    std::vector<xt::xarray<double>> metrics =
+            evalhyd::evalp(
+                    // shape: (sites [1], time [t])
+                    xt::eval(xt::view(observed, xt::newaxis(), xt::all())),
+                    // shape: (sites [1], lead times [1], members [m], time [t])
+                    xt::eval(xt::view(predicted, xt::newaxis(), xt::newaxis(), xt::all(), xt::all())),
+                    {"POD", "POFD", "FAR", "CSI", "ROCSS"},
+                    thresholds,
+                    "low"
+            );
+
+    // check results
+    // POD
+    xt::xtensor<double, 6> pod =
+            {{{{{{ 1.      ,  1.      ,  1.      , NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.863309,  0.854369,  0.752941, NAN},
+                 { 0.848921,  0.854369,  0.752941, NAN},
+                 { 0.848921,  0.854369,  0.752941, NAN},
+                 { 0.848921,  0.84466 ,  0.752941, NAN}}}}}};
+    EXPECT_TRUE(
+            xt::sum(xt::isclose(metrics[0], pod, 1e-05, 1e-08, true))
+            == xt::xscalar<double>(208)
+    );
+
+    // POFD
+    xt::xtensor<double, 6> pofd =
+            {{{{{{ 1.      ,  1.      ,  1.      , NAN},
+                 { 0.087209,  0.038462,  0.026549, NAN},
+                 { 0.087209,  0.038462,  0.026549, NAN},
+                 { 0.087209,  0.038462,  0.026549, NAN},
+                 { 0.087209,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.026549, NAN},
+                 { 0.081395,  0.038462,  0.022124, NAN}}}}}};
+    EXPECT_TRUE(
+            xt::sum(xt::isclose(metrics[1], pofd, 1e-04, 1e-07, true))
+            == xt::xscalar<double>(208)
+    );
+
+    // FAR
+    xt::xtensor<double, 6> far =
+            {{{{{{ 0.553055,  0.66881 ,  0.726688, NAN},
+                 { 0.111111,  0.083333,  0.085714, NAN},
+                 { 0.111111,  0.083333,  0.085714, NAN},
+                 { 0.111111,  0.083333,  0.085714, NAN},
+                 { 0.111111,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.104478,  0.083333,  0.085714, NAN},
+                 { 0.106061,  0.083333,  0.085714, NAN},
+                 { 0.106061,  0.083333,  0.085714, NAN},
+                 { 0.106061,  0.084211,  0.072464, NAN}}}}}};
+    EXPECT_TRUE(
+            xt::sum(xt::isclose(metrics[2], far, 1e-05, 1e-08, true))
+            == xt::xscalar<double>(208)
+    );
+
+    // CSI
+    xt::xtensor<double, 6> csi =
+            {{{{{{ 0.446945,  0.33119 ,  0.273312, NAN},
+                 { 0.779221,  0.792793,  0.703297, NAN},
+                 { 0.779221,  0.792793,  0.703297, NAN},
+                 { 0.779221,  0.792793,  0.703297, NAN},
+                 { 0.779221,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.784314,  0.792793,  0.703297, NAN},
+                 { 0.771242,  0.792793,  0.703297, NAN},
+                 { 0.771242,  0.792793,  0.703297, NAN},
+                 { 0.771242,  0.783784,  0.711111, NAN}}}}}}
+    ;
+    EXPECT_TRUE(
+            xt::sum(xt::isclose(metrics[3], csi, 1e-05, 1e-08, true))
+            == xt::xscalar<double>(208)
+    );
+
+    // ROC skill scores
+    xt::xtensor<double, 5> rocss =
+            {{{{{ 0.71085 ,  0.783047,  0.713066, NAN}}}}};
+    EXPECT_TRUE(
+            xt::sum(xt::isclose(metrics[4], rocss, 1e-05, 1e-08, true))
+            == xt::xscalar<double>(4)
+    );
+}
+
 TEST(ProbabilistTests, TestMasks)
 {
     // read in data