context("Test if functions that perform NONMEM simulations work as expected")

#----------------------
# Test simdata function
test_that("simdata correctly makes data for a simulation model", {
  res1 <- simdata(0:24,dosetime=0,doseheight=10,addl=2,ii=24,numid=5)
  res2 <- simdata(0:24,dosetime=c(0,2),doseheight=10,addl=NA,ii=NA,rate=-2,numid=2)
  
  expect_length(unique(res1$ID),5)
  expect_true(all(unique(res1$TIME)==0:24))
  expect_true(res1$ADDL[1]==2)
  expect_true(res1$II[1]==24)
  expect_true(all(is.na(res1$DV)))
  expect_true(nrow(res1)==(25*5)+5) # 25 times 5 subjects and 5 dose lines
  
  expect_length(unique(res2$ID),2)
  expect_true(nrow(res2[!is.na(res2$AMT),])==4)
  expect_true(all(res2$TIME[!is.na(res2$AMT)]==c(0,2)))
  expect_true(all(is.na(res2$ADDL)))
  expect_true(all(is.na(res2$II)))
  expect_true(unique(res2$RATE[!is.na(res2$AMT)])==-2)
})

#------------------------------
# Test make_nmsimmodel function
test_that("make_nmsimmodel correctly makes a NONMEM simulation model", {
  dat         <- simdata(0:24,dosetime=0,doseheight=10,addl=2,ii=24,numid=50)
  dat$WEIGHT  <- 70
  dat$SEX     <- 1
  dat$STHETA1 <- dat$STHETA2 <- dat$STHETA3 <- dat$STHETA4 <- dat$STHETA5 <- 1
  dat$SETA1   <- dat$SETA2   <- 0
  write.csv(dat,file=paste0(tempdir(),"/simdat.csv"),na=".",quote=FALSE,row.names = FALSE)
  nmmod       <- system.file("testfiles/nonmem.mod",package="amp.sim")
  suppressWarnings(make_nmsimmodel(nmmod,paste0(tempdir(),"/simmod.mod"), data=paste0(tempdir(),"/simdat.csv")))
  mod         <- readLines(paste0(tempdir(),"/simmod.mod"))
  modsub      <- mod[grep("\\$PK",mod):length(mod)]
  
  expect_true(any(grepl("\\$SIM",mod)))
  expect_true(substr(mod[grepl("\\$EST",mod)],1,1)==";")
  expect_true(substr(mod[grepl("\\$COV",mod)],1,1)==";")
  expect_true(substr(mod[grepl("\\$THETA",mod)],1,1)==";")
  expect_true(grepl("simdat.csv",mod[grepl("^\\$DATA",mod)]))
  
  expect_true(any(grepl("STHETA1",modsub)))
  expect_true(any(grepl("STHETA5",modsub)))
  expect_true(any(grepl("SETA1",modsub)))
})

#------------------------
# Test split_sim function
# TAKE INTO ACCOUNT THAT THE PREVIOUS TEST SHOULD BE DONE BEFORE RUNNING THE CODE BELOW
test_that("split_sim correctly splits the simulation", {
  split_sim(data=paste0(tempdir(),"/simdat.csv"),model=paste0(tempdir(),"/simmod.mod"),
            locout=tempdir())
  nfo  <- file.info(list.files(tempdir(),full.names = TRUE))
  dats <- nfo$size[grepl(paste0("simdat.[[:digit:]].csv"),row.names(nfo))]
  
  expect_true(all(paste0("simmod.",1:4,".mod")%in%list.files(tempdir())))
  expect_true(all(paste0("simdat.",1:4,".csv")%in%list.files(tempdir())))
  expect_true(sd(dats)/mean(dats)<0.1)
})

