context("DCM Extended Models (All SOC)")

# SI Models ---------------------------------------------------------------

test_that("SI, 1G, CL: 1 run", {
  skip_on_cran()
  param <- param.dcm(inf.prob = 0.2, act.rate = 0.25)
  init <- init.dcm(s.num = 500, i.num = 1)
  control <- control.dcm(type = "SI", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$control$nruns, 1)
  expect_equal(x$epi$i.num[150, 1], 388.1552, tol = 0.0001)
  expect_equal(max(x$epi$i.num), 501)
  expect_equal(max(x$epi$s.num + x$epi$i.num), 501)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"))
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SI, 1G, CL: varying inf.prob", {
  skip_on_cran()
  param <- param.dcm(inf.prob = seq(0.1, 0.9, 0.1),
                     act.rate = 0.25)
  init <- init.dcm(s.num = 500, i.num = 1)
  control <- control.dcm(type = "SI", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$control$nruns, 9)
  expect_equal(x$epi$i.num[150, 1], 38.3715, tol = 0.0001)
  expect_equal(x$epi$i.num[150, 4], 500.9153, tol = 0.0001)
  expect_equal(x$epi$i.num[150, 9], 501)
  expect_equal(max(x$epi$i.num), 501)
  expect_equal(max(x$epi$s.num + x$epi$i.num), 501)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"), run = 2)
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SI, 1G, CL: varying act.rate", {
  skip_on_cran()
  param <- param.dcm(inf.prob = 0.1,
                     act.rate = seq(0.25, 2, 0.25))
  init <- init.dcm(s.num = 500, i.num = 1)
  control <- control.dcm(type = "SI", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$control$nruns, 8)
  expect_equal(x$epi$i.num[150, 1], 38.3715, tol = 0.0001)
  expect_equal(x$epi$i.num[150, 2], 388.1552, tol = 0.0001)
  expect_equal(x$epi$i.num[150, 5], 500.998, tol = 0.0001)
  expect_equal(max(x$epi$i.num), 501)
  expect_equal(max(x$epi$s.num + x$epi$i.num), 501)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"), run = 2)
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SI, 1G, CL: varying inf.prob and act.rate", {
  skip_on_cran()
  param <- param.dcm(inf.prob = seq(0.1, 0.8, 0.1),
                     act.rate = seq(0.25, 2, 0.25))
  init <- init.dcm(s.num = 500, i.num = 1)
  control <- control.dcm(type = "SI", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$control$nruns, 8)
  expect_equal(x$epi$i.num[150, 1], 38.3715, tol = 0.0001)
  expect_equal(x$epi$i.num[150, 2], 500.9153, tol = 0.0001)
  expect_equal(x$epi$i.num[10, 5], 178.344, tol = 0.5)
  expect_equal(max(x$epi$i.num), 501)
  expect_equal(max(x$epi$s.num + x$epi$i.num), 501)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"), run = 2)
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SI, 2G, CL: 1 run", {
  skip_on_cran()
  param <- param.dcm(inf.prob = 0.2,
                     act.rate = 0.25, inf.prob.g2 = 0.1, balance = "g1")
  init <- init.dcm(s.num = 500, i.num = 1,
                   s.num.g2 = 500, i.num.g2 = 0)
  control <- control.dcm(type = "SI", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[200, 1], 278.8645, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[200, 1], 212.65, tol = 0.0001)
  expect_equal(max(x$epi$i.num), 501, tol = 0.0001)
  expect_equal(max(x$epi$s.num + x$epi$i.num), 501)
  expect_equal(max(x$epi$i.num + x$epi$i.num.g2 +
                     x$epi$s.num + x$epi$s.num.g2), 1001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"))
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SI, 2G, CL: varying inf.prob", {
  skip_on_cran()
  param <- param.dcm(inf.prob = seq(0.1, 0.9, 0.1),
                     act.rate = 0.25, inf.prob.g2 = 0.1, balance = "g1")
  init <- init.dcm(s.num = 500, i.num = 1, s.num.g2 = 500, i.num.g2 = 0)
  control <- control.dcm(type = "SI", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[200, 2], 278.8645, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[200, 2], 212.65, tol = 0.0001)
  expect_equal(x$epi$i.num[200, 4], 494.4093, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[200, 4], 403.4559, tol = 0.0001)
  expect_equal(max(x$epi$i.num), 501)
  expect_equal(max(x$epi$s.num + x$epi$i.num), 501)
  expect_equal(max(x$epi$i.num + x$epi$i.num.g2 +
                     x$epi$s.num + x$epi$s.num.g2), 1001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"))
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SI, 1G, OP: 1 run", {
  skip_on_cran()
  param <- param.dcm(inf.prob = 0.2, act.rate = 0.25,
                     a.rate = 1 / 100, ds.rate = 1 / 100, di.rate = 1 / 90)
  init <- init.dcm(s.num = 500, i.num = 1)
  control <- control.dcm(type = "SI", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[150, 1], 177.8674, tol = 0.0001)
  expect_equal(x$epi$s.num[200, 1], 154.4402, tol = 0.0001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"))
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SI, 1G, OP: varying inf.prob", {
  skip_on_cran()
  param <- param.dcm(inf.prob = seq(0.1, 0.5, 0.05),
                     act.rate = 0.25, a.rate = 1 / 100,
                     ds.rate = 1 / 100, di.rate = 1 / 90)
  init <- init.dcm(s.num = 500, i.num = 1)
  control <- control.dcm(type = "SI", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[50, 1], 1.9681, tol = 0.0001)
  expect_equal(x$epi$i.num[50, 5], 21.7698, tol = 0.0001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"), run = 2)
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SI, 2G, OP: 1 run", {
  skip_on_cran()
  param <- param.dcm(inf.prob = 0.2,
                     act.rate = 0.25, inf.prob.g2 = 0.1, balance = "g1",
                     a.rate = 1 / 100, a.rate.g2 = NA, ds.rate = 1 / 100,
                     ds.rate.g2 = 1 / 100, di.rate = 1 / 90,
                     di.rate.g2 = 1 / 90)
  init <- init.dcm(s.num = 500, i.num = 1, s.num.g2 = 500, i.num.g2 = 0)
  control <- control.dcm(type = "SI", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[250, 1], 134.9654, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[250, 1], 98.9927, tol = 0.0001)
  expect_equal(max(x$epi$i.num), 327, tol = 0.001)
  expect_equal(max(x$epi$i.num.g2), 277, tol = 0.001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"))
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SI, 2G, OP: varying inf.prob", {
  skip_on_cran()
  param <- param.dcm(inf.prob = seq(0.1, 0.5, 0.05),
                     act.rate = 0.25, inf.prob.g2 = 0.1, balance = "g1",
                     a.rate = 1 / 100, a.rate.g2 = NA, ds.rate = 1 / 100,
                     ds.rate.g2 = 1 / 100, di.rate = 1 / 90,
                     di.rate.g2 = 1 / 90)
  init <- init.dcm(s.num = 500, i.num = 1, s.num.g2 = 500, i.num.g2 = 0)
  control <- control.dcm(type = "SI", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[250, 1], 15.08, tol = 0.0001)
  expect_equal(x$epi$i.num[250, 5], 320.8842, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[250, 1], 15.0784, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[250, 5], 222.7064, tol = 0.0001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"))
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})


# SIR Models --------------------------------------------------------------

test_that("SIR, 1G, CL: 1 run", {
  skip_on_cran()
  param <- param.dcm(inf.prob = 0.2, act.rate = 0.25,
                     rec.rate = 1 / 50)
  init <- init.dcm(s.num = 500, i.num = 1, r.num = 0)
  control <- control.dcm(type = "SIR", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[250, 1], 107.788, tol = 0.0001)
  expect_equal(max(x$epi$s.num + x$epi$i.num + x$epi$r.num), 501)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"))
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SIR, 1G, CL: varying inf.prob", {
  skip_on_cran()
  param <- param.dcm(inf.prob = seq(0.1, 0.5, 0.05),
                     act.rate = 0.25, rec.rate = 1 / 50)
  init <- init.dcm(s.num = 500, i.num = 1, r.num = 0)
  control <- control.dcm(type = "SIR", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[100, 1], 1.6207, tol = 0.0001)
  expect_equal(x$epi$i.num[100, 5], 122.3146, tol = 0.0001)
  expect_equal(max(x$epi$s.num + x$epi$i.num + x$epi$r.num), 501)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"), run = 2)
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SIR, 2G, CL: 1 run", {
  skip_on_cran()
  param <- param.dcm(inf.prob = 0.2,
                     act.rate = 0.25, inf.prob.g2 = 0.1, balance = "g1",
                     rec.rate = 1 / 100, rec.rate.g2 = 1 / 100)
  init <- init.dcm(s.num = 500, i.num = 1, r.num = 0,
                   s.num.g2 = 500, i.num.g2 = 0, r.num.g2 = 0)
  control <- control.dcm(type = "SIR", nsteps = 1000, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[250, 1], 137.0072, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[250, 1], 102.8639, tol = 0.0001)
  expect_equal(max(x$epi$s.num + x$epi$i.num + x$epi$r.num), 501)
  expect_equal(max(x$epi$s.num + x$epi$i.num + x$epi$r.num +
                     x$epi$s.num.g2 + x$epi$i.num.g2 + x$epi$r.num.g2), 1001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"))
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SIR, 2G, CL: varying inf.prob", {
  skip_on_cran()
  param <- param.dcm(inf.prob = seq(0.1, 0.5, 0.05),
                     act.rate = 0.25, inf.prob.g2 = 0.1, balance = "g1",
                     rec.rate = 1 / 100, rec.rate.g2 = 1 / 100)
  init <- init.dcm(s.num = 500, i.num = 1, r.num = 0,
                   s.num.g2 = 500, i.num.g2 = 0, r.num.g2 = 0)
  control <- control.dcm(type = "SIR", nsteps = 1000, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[250, 1], 18.9723, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[250, 5], 179.5086, tol = 0.0001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"), run = 2)
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SIR, 1G, OP: 1 run", {
  skip_on_cran()
  param <- param.dcm(inf.prob = 0.2,
                     act.rate = 2, rec.rate = 1 / 50, a.rate = 1 / 100,
                     ds.rate = 1 / 100, di.rate = 1 / 90, dr.rate = 1 / 100)
  init <- init.dcm(s.num = 500, i.num = 1, r.num = 0)
  control <- control.dcm(type = "SIR", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[50, 1], 272.9788, tol = 0.0001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"))
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SIR, 1G, OP: varying inf.prob", {
  skip_on_cran()
  param <- param.dcm(inf.prob = seq(0.1, 0.5, 0.05),
                     act.rate = 1, rec.rate = 1 / 50, a.rate = 1 / 100,
                     ds.rate = 1 / 100, di.rate = 1 / 90, dr.rate = 1 / 100)
  init <- init.dcm(s.num = 500, i.num = 1, r.num = 0)
  control <- control.dcm(type = "SIR", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[50, 1], 26.55524, tol = 0.0001)
  expect_equal(x$epi$i.num[50, 5], 297.3653, tol = 0.0001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"), run = 2)
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SIR, 2G, OP: 1 run", {
  skip_on_cran()
  param <- param.dcm(inf.prob = 0.2, inf.prob.g2 = 0.1,
                     act.rate = 1, balance = "g1",
                     rec.rate = 1 / 50, rec.rate.g2 = 1 / 50,
                     a.rate = 1 / 100, a.rate.g2 = NA,
                     ds.rate = 1 / 100, ds.rate.g2 = 1 / 100,
                     di.rate = 1 / 90, di.rate.g2 = 1 / 90,
                     dr.rate = 1 / 100, dr.rate.g2 = 1 / 100)
  init <- init.dcm(s.num = 500, i.num = 1, r.num = 0,
                   s.num.g2 = 500, i.num.g2 = 1, r.num.g2 = 0)
  control <- control.dcm(type = "SIR", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[50, 1], 154.4498, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[50, 1], 114.8753, tol = 0.0001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"))
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SIR, 2G, OP: varying inf.prob", {
  skip_on_cran()
  param <- param.dcm(inf.prob = seq(0.1, 0.5, 0.05), inf.prob.g2 = 0.1,
                     act.rate = 1, balance = "g1",
                     rec.rate = 1 / 50, rec.rate.g2 = 1 / 50,
                     a.rate = 1 / 100, a.rate.g2 = NA,
                     ds.rate = 1 / 100, ds.rate.g2 = 1 / 100,
                     di.rate = 1 / 90, di.rate.g2 = 1 / 90,
                     dr.rate = 1 / 100, dr.rate.g2 = 1 / 100)
  init <- init.dcm(s.num = 500, i.num = 1, r.num = 0,
                   s.num.g2 = 500, i.num.g2 = 1, r.num.g2 = 0)
  control <- control.dcm(type = "SIR", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[50, 1], 26.55524, tol = 0.0001)
  expect_equal(x$epi$i.num[50, 5], 298.6245, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[50, 5], 213.1567, tol = 0.0001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"), run = 2)
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})


# SIS Models --------------------------------------------------------------

test_that("SIS, 1G, CL: 1 run", {
  skip_on_cran()
  param <- param.dcm(inf.prob = 0.2,
                     act.rate = 0.25, rec.rate = 1 / 50)
  init <- init.dcm(s.num = 500, i.num = 1)
  control <- control.dcm(type = "SIS", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[250, 1], 256.7584, tol = 0.0001)
  expect_equal(max(x$epi$s.num + x$epi$i.num), 501)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"))
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SIS, 1G, CL: varying inf.prob", {
  skip_on_cran()
  param <- param.dcm(inf.prob = seq(0.1, 0.9, 0.1),
                     act.rate = 0.25, rec.rate = 1 / 50)
  init <- init.dcm(s.num = 500, i.num = 1)
  control <- control.dcm(type = "SIS", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[50, 1], 1.2741, tol = 0.0001)
  expect_equal(x$epi$i.num[50, 5], 122.0875, tol = 0.0001)
  expect_equal(x$epi$i.num[50, 9], 447.6173, tol = 0.0001)
  expect_equal(max(x$epi$s.num + x$epi$i.num), 501)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"), run = 2)
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SIS, 2G, CL: 1 run", {
  skip_on_cran()
  param <- param.dcm(inf.prob = 0.2,
                     act.rate = 0.25, inf.prob.g2 = 0.1, balance = "g1",
                     rec.rate = 1 / 100, rec.rate.g2 = 1 / 100)
  init <- init.dcm(s.num = 500, i.num = 1,
                   s.num.g2 = 500, i.num.g2 = 0)
  control <- control.dcm(type = "SIS", nsteps = 1000, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[250, 1], 164.0793, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[250, 1], 121.0725, tol = 0.0001)
  expect_equal(max(x$epi$s.num + x$epi$i.num +
                     x$epi$s.num.g2 + x$epi$i.num.g2), 1001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"))
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SIS, 2G, CL: varying inf.prob", {
  skip_on_cran()
  param <- param.dcm(inf.prob = seq(0.1, 0.9, 0.1),
                     act.rate = 0.25, inf.prob.g2 = 0.1, balance = "g1",
                     rec.rate = 1 / 100, rec.rate.g2 = 1 / 100)
  init <- init.dcm(s.num = 500, i.num = 1,
                   s.num.g2 = 500, i.num.g2 = 0)
  control <- control.dcm(type = "SIS", nsteps = 1000, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[100, 1], 2.2167, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[100, 1], 2.1833, tol = 0.0001)
  expect_equal(x$epi$i.num[100, 9], 199.7184, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[100, 9], 74.7278, tol = 0.0001)
  expect_equal(max(x$epi$s.num + x$epi$i.num +
                     x$epi$s.num.g2 + x$epi$i.num.g2), 1001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"), run = 2)
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SIS, 1G, OP: 1 run", {
  skip_on_cran()
  param <- param.dcm(inf.prob = 0.2,
                     act.rate = 0.5, rec.rate = 1 / 50,
                     a.rate = 1 / 100, ds.rate = 1 / 100, di.rate = 1 / 90)
  init <- init.dcm(s.num = 500, i.num = 1)
  control <- control.dcm(type = "SIS", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[100, 1], 249.2884, tol = 0.0001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"))
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SIS, 1G, OP: varying inf.prob", {
  skip_on_cran()
  param <- param.dcm(inf.prob = seq(0.1, 0.9, 0.1),
                     act.rate = 0.5, rec.rate = 1 / 50,
                     a.rate = 1 / 100, ds.rate = 1 / 100, di.rate = 1 / 90)
  init <- init.dcm(s.num = 500, i.num = 1)
  control <- control.dcm(type = "SIS", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[100, 1], 6.3054, tol = 0.0001)
  expect_equal(x$epi$i.num[100, 9], 428.3781, tol = 0.0001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"), run = 2)
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SIS, 2G, OP: 1 run", {
  skip_on_cran()
  param <- param.dcm(inf.prob = 0.2,
                     inf.prob.g2 = 0.1, act.rate = 0.5,
                     balance = "g1", rec.rate = 1 / 50, rec.rate.g2 = 1 / 50,
                     a.rate = 1 / 100, a.rate.g2 = NA, ds.rate = 1 / 100,
                     ds.rate.g2 = 1 / 100, di.rate = 1 / 90,
                     di.rate.g2 = 1 / 90)
  init <- init.dcm(s.num = 500, i.num = 1,
                   s.num.g2 = 500, i.num.g2 = 1)
  control <- control.dcm(type = "SIS", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[150, 1], 182.0338, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[150, 1], 136.3023, tol = 0.0001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"))
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})

test_that("SIS, 2G, OP: varying inf.prob", {
  skip_on_cran()
  param <- param.dcm(inf.prob = seq(0.1, 0.9, 0.1), inf.prob.g2 = 0.1,
                     act.rate = 0.5, balance = "g1",
                     rec.rate = 1 / 50, rec.rate.g2 = 1 / 50,
                     a.rate = 1 / 100, a.rate.g2 = NA,
                     ds.rate = 1 / 100, ds.rate.g2 = 1 / 100,
                     di.rate = 1 / 90, di.rate.g2 = 1 / 90)
  init <- init.dcm(s.num = 500, i.num = 1,
                   s.num.g2 = 500, i.num.g2 = 1)
  control <- control.dcm(type = "SIS", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_equal(x$epi$i.num[100, 1], 6.3054, tol = 0.0001)
  expect_equal(x$epi$i.num[100, 9], 424.9165, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[100, 1], 6.3054, tol = 0.0001)
  expect_equal(x$epi$i.num.g2[100, 9], 279.5831, tol = 0.0001)
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"), run = 2)
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})


# Other cases -------------------------------------------------------------

test_that("SIS, 2G, OP: balance = g2", {
  skip_on_cran()
  param <- param.dcm(inf.prob = seq(0.1, 0.9, 0.1), inf.prob.g2 = 0.1,
                     act.rate.g2 = 0.5, balance = "g2",
                     rec.rate = 1 / 50, rec.rate.g2 = 1 / 50,
                     a.rate = 1 / 100, a.rate.g2 = NA,
                     ds.rate = 1 / 100, ds.rate.g2 = 1 / 100,
                     di.rate = 1 / 90, di.rate.g2 = 1 / 90)
  init <- init.dcm(s.num = 5000, i.num = 1,
                   s.num.g2 = 500, i.num.g2 = 1)
  control <- control.dcm(type = "SIS", nsteps = 500, verbose = FALSE)
  x <- dcm(param, init, control)
  expect_is(x, "dcm")
  plot(x)
  plot(x, y = "i.num")
  plot(x, y = c("i.num", "s.num"))
  expect_output(summary(x, at = 2), regexp = "EpiModel Summary")
})
