library("testthat")
library("survival")

context("test-survfit.R")

test_that("Check very small Cox example with no ties, breslow baseline", {
    test <- read.table(header=T, sep = ",", text = "
start, length, event, x1, x2
0, 4,  1,0,0
0, 3.5,1,2,0
0, 3,  0,0,1
0, 2.5,1,0,1
0, 2,  1,1,1
0, 1.5,0,1,0
0, 1,  1,1,0
")

    if (packageVersion("survival") >= '3.2.9') {
        goldFit <-  coxph(Surv(start, length, event) ~ x1 + x2, test, ties = "breslow", nocenter = NULL)
    } else {
        goldFit <-  coxph(Surv(start, length, event) ~ x1 + x2, test, ties = "breslow")
    }
    goldSurv <- survfit(goldFit)

    dataPtr <- createCyclopsData(Surv(length, event) ~ x1 + x2, data = test, modelType = "cox")
    cyclopsFit <- fitCyclopsModel(dataPtr)
    cyclopsSurv <- survfit(cyclopsFit, type="aalen")

    expect_equal(goldSurv$time, cyclopsSurv$time)
    tolerance <- 1E-4
    expect_equal(goldSurv$surv, cyclopsSurv$surv, tolerance = tolerance)
})

test_that("Check very small Cox example with time-ties, but no failure ties, breslow baseline", {
    test <- read.table(header=T, sep = ",", text = "
start, length, event, x1, x2
0, 4,  1,0,0
0, 3,  1,2,0
0, 3,  0,0,1
0, 2,  1,0,1
0, 2,  0,1,1
0, 1,  0,1,0
0, 1,  1,1,0
")

    if (packageVersion("survival") >= '3.2.9') {
        goldFit <-  coxph(Surv(start, length, event) ~ x1 + x2, test, ties = "breslow", nocenter = NULL)
    } else {
        goldFit <-  coxph(Surv(start, length, event) ~ x1 + x2, test, ties = "breslow")
    }
    goldSurv <- survfit(goldFit)

    dataPtr <- createCyclopsData(Surv(length, event) ~ x1 + x2, data = test, modelType = "cox")
    cyclopsFit <- fitCyclopsModel(dataPtr)
    cyclopsSurv <- survfit(cyclopsFit, type="aalen")

    expect_equal(goldSurv$time, cyclopsSurv$time)
    tolerance <- 1E-4
    expect_equal(goldSurv$surv, cyclopsSurv$surv, tolerance = tolerance)
})

test_that("Check very small Cox example with failure ties, no risk-set contribution after tie, breslow baseline", {
    test <- read.table(header=T, sep = ",", text = "
start, length, event, x1, x2
0, 4,  1,0,0
0, 3,  1,2,0
0, 3,  0,0,1
0, 2,  1,0,1
0, 2,  1,1,1
0, 2,  1,0,0
")
    if (packageVersion("survival") >= '3.2.9') {
        goldFit <-  coxph(Surv(start, length, event) ~ x1 + x2, test, ties = "breslow", nocenter = NULL)
    } else {
        goldFit <-  coxph(Surv(start, length, event) ~ x1 + x2, test, ties = "breslow")
    }
    goldSurv <- survfit(goldFit)

    dataPtr <- createCyclopsData(Surv(length, event) ~ x1 + x2, data = test, modelType = "cox")
    cyclopsFit <- fitCyclopsModel(dataPtr)
    cyclopsSurv <- survfit(cyclopsFit, type="aalen")

    expect_equal(goldSurv$time, cyclopsSurv$time)
    tolerance <- 1E-4
    expect_equal(goldSurv$surv, cyclopsSurv$surv, tolerance = tolerance)})

test_that("Check very small Cox example with failure ties, with risk-set contribution after tie, breslow baseline", {
    test <- read.table(header=T, sep = ",", text = "
start, length, event, x1, x2
0, 4,  1,0,0
0, 3,  1,2,0
0, 3,  0,0,1
0, 2,  1,0,1
0, 2,  1,1,1
0, 1,  0,1,0
0, 1,  1,1,0
")

    if (packageVersion("survival") >= '3.2.9') {
        goldFit <-  coxph(Surv(start, length, event) ~ x1 + x2, test, ties = "breslow", nocenter = NULL)
    } else {
        goldFit <-  coxph(Surv(start, length, event) ~ x1 + x2, test, ties = "breslow")
    }
    goldSurv <- survfit(goldFit)

    dataPtr <- createCyclopsData(Surv(length, event) ~ x1 + x2, data = test, modelType = "cox")
    cyclopsFit <- fitCyclopsModel(dataPtr)
    cyclopsSurv <- survfit(cyclopsFit, type="aalen")

    expect_equal(goldSurv$time, cyclopsSurv$time)
    tolerance <- 1E-4
    expect_equal(goldSurv$surv, cyclopsSurv$surv, tolerance = tolerance)
})

