test_that("trigger all", {
  N = 10L
  truth = 1 + runif(N)
  response = 1 + runif(N)
  tol = sqrt(.Machine$double.eps)

  for (m in as.list(measures)) {
    if (m$type != "regr") {
      next
    }
    f = match.fun(m$id)

    perf = f(truth = truth, response = response)
    if (m$aggregated) {
      expect_number(perf, na.ok = FALSE, lower = m$lower - tol, upper = m$upper + tol, label = m$id)
    } else {
      expect_numeric(perf, any.missing = FALSE, lower = m$lower - tol, upper = m$upper + tol, label = m$id)
    }

    if ("sample_weights" %in% names(formals(f))) {
      sample_weights = runif(length(truth))
      perf = f(truth = truth, response = response, sample_weights = sample_weights)
      expect_number(perf, na.ok = FALSE, lower = m$lower - tol, upper = m$upper + tol, label = m$id)
    }
  }
})

test_that("tests from Metrics", {
  expect_equal(bias(1, 1), 0)
  expect_equal(bias(c(-1, -100, 17.5), c(0, 0, 0)), mean(c(-1, -100, 17.5)))

  expect_equal(pbias(c(1, 2, 3), c(1, 3, 2)), mean(c(0, -1 / 2, 1 / 3)))
  expect_equal(pbias(c(1, 2, 0), c(1, 2, 1)), NaN)
  expect_equal(pbias(0, 0), NaN)
  expect_equal(pbias(c(-1.1, 1.1), c(-1, 1)), 0)

  expect_equal(se(3.4, 4.4), 1)
  expect_equal(se(9:11, 11:9), c(4, 0, 4))

  expect_equal(sse(c(1, 3, 2), c(2, 3, 4)), 5)

  expect_equal(mse(1:4, c(2, 3, 4, 4)), 3 / 4)

  expect_equal(rmse(1:4, c(1, 2, 3, 5)), sqrt(1 / 4))
  expect_equal(rmse(1:4, 1:4), 0)

  expect_equal(ae(3.4, 4.4), 1)
  expect_equal(ae(9:11, 11:9), c(2, 0, 2))

  expect_equal(mae(1:4, c(1, 2, 3, 5)), 0.25)

  expect_equal(medae(1:4, c(1, 2, 4, 50)), 0.5)

  expect_equal(ape(0:3, 1:4), c(Inf, 1, 1 / 2, 1 / 3))
  expect_equal(ape(0:2, c(0, 0, 0)), c(NaN, 1, 1))
  expect_equal(ape(c(-1.1, 1.1), c(-1, 1)), c(1 / 11, 1 / 11))

  expect_equal(mape(1:3, 2:4), mean(c(1, 1 / 2, 1 / 3)))
  expect_equal(mape(c(-1.1, 1.1), c(-1, 1)), 1 / 11)

  expect_equal(smape(0, 0), NaN)
  expect_equal(smape(1, -1), 2)
  expect_equal(smape(1, 0), 2)
  expect_equal(smape(c(1, 2, 3), c(2, 5, 4)), smape(c(2, 5, 4), c(1, 2, 3)))

  expect_equal(sle(c(0, 1, 3.4), c(1, 0, 3.4)), c(log(2), log(2), 0)^2)
  expect_equal(sle(exp(2) - 1, exp(1) - 1), 1)

  expect_equal(msle(c(1, 2, exp(1) - 1), c(1, 2, exp(2) - 1)), 1 / 3)

  expect_equal(rmsle(c(exp(5) - 1), c(exp(1) - 1)), 4)

  expect_equal(rae(0:10, 30:40), 11)
  expect_equal(rae(seq(0, 2, 0.5), seq(0, 2, 0.5)), 0.0)
  expect_equal(rae(1:4, c(1, 2, 3, 5)), 0.25)

  expect_equal(rrse(0:10, 2:12), sqrt(0.4))
  expect_equal(rrse(seq(0, 2, 0.5), seq(0, 2, 0.5)), 0.0)
  expect_equal(rrse(1:4, c(1, 2, 3, 5)), sqrt(0.2))

  expect_equal(rse(0:10, 2:12), 0.4)
  expect_equal(rse(seq(0, 2, 0.5), seq(0, 2, 0.5)), 0.0)
  expect_equal(rse(1:4, c(1, 2, 3, 5)), 0.2)

  expect_equal(rsq(0:10, 2:12), 0.6)
  expect_equal(rsq(seq(0, 2, 0.5), seq(0, 2, 0.5)), 1.0)
  expect_equal(rsq(1:4, c(1, 2, 3, 5)), 0.8)

  expect_equal(pinball(1:3, 1:3), 0)
  expect_equal(pinball(1:3, c(0, 2, 3)), 1 / 6)
  expect_equal(pinball(1:3, c(1, 2, 4)), 1 / 6)
  expect_equal(pinball(1:3, c(1, 2, 4), alpha = 0.1), 0.3)
  expect_equal(pinball(1:3, c(1, 2, 4), alpha = 0.4), 0.2)
})
