def test_emcam_lowest_bin_non_monotonic(reliability_table_slice):
    """Test expected values are returned where the lowest observation
    count bin is non-monotonic."""
    expected_data = np.array([[1000, 500, 500, 750], [250, 500, 750, 1000],
                              [2000, 1000, 1000, 1000]])

    expected_bin_coord_points = np.array([0.2, 0.5, 0.7, 0.9],
                                         dtype=np.float32)

    expected_bin_coord_bounds = np.array(
        [[0.0, 0.4], [0.4, 0.6], [0.6, 0.8], [0.8, 1.0]],
        dtype=np.float32,
    )

    reliability_table_slice.data = np.array([
        [1000, 0, 250, 500, 750],  # Observation count
        [0, 250, 500, 750, 1000],  # Sum of forecast probability
        [1000, 1000, 1000, 1000, 1000],  # Forecast count
    ])
    result = Plugin()._enforce_min_count_and_montonicity(
        reliability_table_slice.copy())
    assert_array_equal(result.data, expected_data)
    assert_allclose(
        result.coord("probability_bin").points, expected_bin_coord_points)
    assert_allclose(
        result.coord("probability_bin").bounds, expected_bin_coord_bounds)
def test_emcam_combine_undersampled_bins_non_monotonic(
        reliability_table_slice):
    """Test expected values are returned when a bin is below the minimum
    forecast count when the observed frequency is non-monotonic."""

    expected_data = np.array([[1000, 425, 1000], [1000, 425, 1000],
                              [2000, 600, 1000]])
    expected_bin_coord_points = np.array([0.2, 0.6, 0.9], dtype=np.float32)
    expected_bin_coord_bounds = np.array(
        [[0.0, 0.4], [0.4, 0.8], [0.8, 1.0]],
        dtype=np.float32,
    )
    reliability_table_slice.data = np.array(
        [
            [750, 250, 50, 375, 1000],  # Observation count
            [750, 250, 50, 375, 1000],  # Sum of forecast probability
            [1000, 1000, 100, 500, 1000],  # Forecast count
        ],
        dtype=np.float32,
    )

    result = Plugin()._enforce_min_count_and_montonicity(
        reliability_table_slice.copy())
    assert_array_equal(result.data, expected_data)
    assert_allclose(
        result.coord("probability_bin").points, expected_bin_coord_points)
    assert_allclose(
        result.coord("probability_bin").bounds, expected_bin_coord_bounds)