test_that("fourier_test works with 3 variables", { set.seed(42) n <- 200 e <- matrix(rnorm(n * 3), n, 3) x1 <- cumsum(e[,1]) x2 <- cumsum(e[,2]) brk <- 5 * sin(2 * pi * (1:n) / n) y <- brk + 0.5 * x1 + 0.3 * x2 + cumsum(0.1 * e[,3]) dat <- cbind(y, x1, x2) result <- fourier_test(dat, model = 3, k = 2, freq = 1) expect_s3_class(result, "fjcoint") expect_equal(result$test, "fourier") expect_equal(result$nvars, 3) expect_equal(length(result$trace), 3) expect_equal(length(result$lambda), 3) expect_equal(length(result$cv_trace), 3) expect_true(all(result$eigenvalues >= 0)) expect_true(all(result$eigenvalues < 1)) # Log-L should be monotonically increasing for (i in 2:length(result$logL)) { expect_true(result$logL[i] >= result$logL[i - 1] - 0.001) } }) test_that("fourier_test works with cumulative frequencies", { set.seed(123) n <- 200 e <- matrix(rnorm(n * 2), n, 2) y <- cumsum(e[,1]) x <- cumsum(e[,2]) dat <- cbind(y, x) result <- fourier_test(dat, model = 1, k = 2, freq = 2, option = "cumulative") expect_s3_class(result, "fjcoint") expect_equal(result$option, "cumulative") expect_equal(result$freq, 2) }) test_that("fourier_test rejects bad inputs", { expect_error(fourier_test(matrix(1:10, 10, 1)), "between 2 and 5") expect_error(fourier_test(matrix(1:20, 10, 2), model = 5), "1-4") expect_error(fourier_test(matrix(1:20, 10, 2), freq = 6), "1-5") }) test_that("sbc_test works", { set.seed(42) n <- 200 e <- matrix(rnorm(n * 3), n, 3) x1 <- cumsum(e[,1]) x2 <- cumsum(e[,2]) y <- 0.5 * x1 + 0.3 * x2 + cumsum(0.1 * e[,3]) dat <- cbind(y, x1, x2) result <- sbc_test(dat, maxlag = 2, maxfreq = 2) expect_s3_class(result, "fjcoint") expect_equal(result$test, "sbc") expect_equal(length(result$ranks), 3) # m ranks (0, 1, 2) expect_true(all(result$selected %in% c("Johansen", "SC-VECM", "Fourier"))) }) test_that("fjcoint dispatcher works", { set.seed(42) n <- 200 e <- matrix(rnorm(n * 2), n, 2) y <- cumsum(e[,1]) x <- cumsum(e[,2]) dat <- cbind(y, x) r1 <- fjcoint(dat, test = "fourier") expect_equal(r1$test, "fourier") expect_error(fjcoint(dat, test = "johansen"), "urca") }) test_that("print and plot do not error", { set.seed(42) n <- 200 e <- matrix(rnorm(n * 2), n, 2) y <- cumsum(e[,1]) x <- cumsum(e[,2]) dat <- cbind(y = y, x = x) result <- fourier_test(dat, model = 1, k = 2, freq = 1) expect_output(print(result)) expect_output(summary(result)) expect_no_error(plot(result)) })