context("parse: delay")
test_that("missing variables in delay", {
expect_error(odin_parse({
ylag <- delay(x, 10)
initial(y) <- 0.5
deriv(y) <- y + ylag
}), "Missing variable in delay expression", class = "odin_error")
expect_error(odin_parse({
ylag <- delay(x + y, 10)
initial(y) <- 0.5
deriv(y) <- y + ylag
}), "Missing variable in delay expression", class = "odin_error")
expect_error(odin_parse({
ylag <- delay(x + z, 10)
initial(y) <- 0.5
deriv(y) <- y + ylag
}), "Missing variables in delay expression", class = "odin_error")
})
test_that("delay call validation", {
expect_error(odin_parse_(quote(a <- 1 + delay(1))),
"delay() must be the only call on the rhs",
fixed = TRUE, class = "odin_error")
expect_error(odin_parse_(quote(a <- delay(1))),
"delay() requires two or three arguments",
fixed = TRUE, class = "odin_error")
expect_error(odin_parse_(quote(a <- delay(1, 2, 3, 4))),
"delay() requires two or three arguments",
fixed = TRUE, class = "odin_error")
expect_error(odin_parse_(quote(a <- delay(delay(1, 2), 2))),
"delay() may not be nested",
fixed = TRUE, class = "odin_error")
expect_error(odin_parse_(quote(a <- delay(2, delay(1, 2)))),
"delay() may not be nested",
fixed = TRUE, class = "odin_error")
expect_error(odin_parse_(quote(a <- delay(y + t, 2))),
"delay() may not refer to time",
fixed = TRUE, class = "odin_error")
})
test_that("delay check", {
expect_error(ir_parse_expr(quote(deriv(x) <- delay(y, 1)), NULL, NULL),
"delay() only valid for non-special variables",
fixed = TRUE, class = "odin_error")
expect_error(ir_parse_expr(quote(initial(x) <- delay(y, 1)), NULL, NULL),
"delay() only valid for non-special variables",
fixed = TRUE, class = "odin_error")
expect_error(ir_parse_expr(quote(dim(x) <- delay(y, 1)), NULL, NULL),
"delay() only valid for non-special variables",
fixed = TRUE, class = "odin_error")
})
test_that("more parse errors", {
expect_error(odin_parse({
x <- y + b
ylag <- delay(x, 10)
initial(y) <- 0.5
deriv(y) <- y + ylag
}), "Missing variable in delay expression: b (for delay ylag)",
fixed = TRUE, class = "odin_error")
})
test_that("prevent multiline delay", {
expect_error(
odin_parse({
deriv(a[]) <- i
initial(a[]) <- (i - 1) / 10
dim(a) <- 5
alt[] <- user()
dim(alt) <- length(a)
tmp[1] <- delay(a[1], 2, alt[1])
tmp[2:5] <- delay(a[i], 2, alt[i])
dim(tmp) <- length(a)
output(tmp[]) <- TRUE # or tmp[i]
}),
"delay() may only be used on a single-line array",
fixed = TRUE, class = "odin_error")
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.