# Example: convolution

skip_on_cran()

test_that("convolve", {
  # options("quickr.r2f.debug" = TRUE)
  slow_convolve <- function(a, b) {
    declare(type(a = double(NA)))
    declare(type(b = double(NA)))

    ab <- double(length(a) + length(b) - 1)
    for (i in seq_along(a)) {
      for (j in seq_along(b)) {
        ab[i + j - 1] = ab[i + j - 1] + a[i] * b[j]
      }
    }
    ab
  }

  fsub <- new_fortran_subroutine("slow_convolve", slow_convolve)
  cwrapper <- make_c_bridge(fsub)

  expect_snapshot(
    {
      slow_convolve
      cat(fsub)
      cat(cwrapper)
    },
    transform = scrub_environment
  )

  quick_convolve <- quick(name = "quick_convolve", slow_convolve)
  a <- 1:3
  b <- 10:15
  expect_error(
    quick_convolve(a, b),
    "must be 'double', not 'integer'",
    fixed = TRUE
  )
  a <- as.double(1:3)
  b <- as.double(10:15)
  expect_equal(quick_convolve(a, b), slow_convolve(a, b))
  a <- as.double(0:3)
  b <- 1
  expect_equal(quick_convolve(a, b), slow_convolve(a, b))
})
