test_that("simple distances work", {
  expect_equal(
    get_dist(
      data.frame(a = c(1, 2)),
      data.frame(a = c(0.9, 2.1))
    ),
    matrix(c(0.1, 1.1, 1.1, 0.1), nrow = 2, byrow = TRUE),
    tolerance = 1e-6
  )
})

test_that("multi-dimensional, different sized works", {
  dist_res <- get_dist(
    data.frame(a = c(1, 2, 4), b = c(0.1, 0.4, -0.5)),
    data.frame(a = c(0, 1.5), b = c(0, 0.76))
  )
  expect_equal(
    dim(dist_res),
    c(2, 3)
  )
  expect_equal(
    dist_res[1,1],
    1.0049876,
    tolerance = 1e-7
  )
})

test_that("large point number using apply method", {
  df1 <- data.frame(a = runif(20),
                    b = runif(20, 1, 2),
                    c = runif(20, -1, 1),
                    d = runif(20, -5, -2),
                    e = runif(20, -2, 2)
                    )
  df2 <- data.frame(a = runif(1000),
                    b = runif(1000, 1, 2),
                    c = runif(1000, -1, 1),
                    d = runif(1000, -5, -2),
                    e = runif(1000, -2, 2)
                    )
  dists <- get_dist(df1, df2)
  expect_equal(
    dim(dists),
    c(1000, 20)
  )
})

test_that("large dimension number: dist method", {
  df1 <- setNames(data.frame(
    matrix(runif(1000), ncol = 20)
  ), paste0("X", 1:20))
  df2 <- setNames(data.frame(
    matrix(runif(800), ncol = 20)
  ), paste0("X", 1:20))
  dists <- get_dist(df1, df2)
  expect_equal(
    dim(dists),
    c(40, 50)
  )
})

test_that("fails if data.frames have different column dimensions", {
  df1 <- data.frame(a = runif(20),
                    b = runif(20, 1, 2),
                    c = runif(20, -1, 1),
                    d = runif(20, -5, -2),
                    e = runif(20, -2, 2)
  )
  df2 <- data.frame(a = runif(1000),
                    b = runif(1000, 1, 2),
                    c = runif(1000, -1, 1),
                    d = runif(1000, -5, -2)
  )
  expect_error(
    get_dist(df1, df2)
  )
})
