diff --git a/DESCRIPTION b/DESCRIPTION index 1e749871a7fab6a8c4bf6dace057aba141d29dc3..7db4065a84bd21f3aea017b70fcb109c3c1e1153 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -45,6 +45,7 @@ Suggests: pander, kableExtra, magrittr, - tibble + tibble, + testthat VignetteBuilder: knitr Roxygen: list(markdown = TRUE) diff --git a/tests/testthat.R b/tests/testthat.R new file mode 100644 index 0000000000000000000000000000000000000000..ec93ddba512575a0df2746f0163477cddbc05496 --- /dev/null +++ b/tests/testthat.R @@ -0,0 +1,7 @@ +library(testthat) +library(LifeInsuranceContracts) +library(MortalityTables) +mortalityTables.load("Austria_Census") +mortalityTables.load("Austria_Annuities_AVOe2005R") + +test_check("LifeInsuranceContracts") diff --git a/tests/testthat/test-CF-Annuity-Deferred.R b/tests/testthat/test-CF-Annuity-Deferred.R new file mode 100644 index 0000000000000000000000000000000000000000..bfc70ac4b40eafa95afc0a3dc910b405f658bd20 --- /dev/null +++ b/tests/testthat/test-CF-Annuity-Deferred.R @@ -0,0 +1,41 @@ +test_that("Deferred Annuity Cash Flows", { + library(MortalityTables) + mortalityTables.load("Austria_Annuities_AVOe2005R") + + Tarif.DefAnnuity = InsuranceTarif$new( + name = "Example Tariff - Deferred Annuity", + type = "annuity", + tarif = "Life1", + desc = "A deferred annuity (life-long payments start at age 65) with reg. premiums", + + policyPeriod = function(params, values) { 120 - params$ContractData$age}, + deferralPeriod = function(params, values) { 65 - params$ContractData$age}, + premiumPeriod = function(params, values) { 65 - params$ContractData$age}, + premiumRefund = 1, + + mortalityTable = AVOe2005R.unisex, + i = 0.005 + ) + Contract.DefAnnuity = InsuranceContract$new( + tarif = Tarif.DefAnnuity, + age = 40, YOB = 1980, + sumInsured = 1200, + contractClosing = as.Date("2020-09-01"), + calculate = "cashflows" + ) + expect_equal(Contract.DefAnnuity$Parameters$ContractData$policyPeriod, 80) + expect_equal(Contract.DefAnnuity$Parameters$ContractData$deferralPeriod, 25) + expect_equal(Contract.DefAnnuity$Parameters$ContractData$premiumPeriod, 25) + + + expect_true(all(Contract.DefAnnuity$Values$cashFlows %>% select(-premiums_advance, -survival_advance, -death_GrossPremium, -death_Refund_past) == 0)) + + # 25 years premium cash flow + expect_equal(Contract.DefAnnuity$Values$cashFlows$premiums_advance, c(rep(1, 25), rep(0, 56))) + # premium payment start after 25 years + expect_equal(Contract.DefAnnuity$Values$cashFlows$survival_advance, c(rep(0, 25), rep(1, 55),0)) + # premium payment start after 25 years + expect_equal(Contract.DefAnnuity$Values$cashFlows$death_GrossPremium, c(1:25, rep(25, 55),0)) + # death refund flag + expect_equal(Contract.DefAnnuity$Values$cashFlows$death_Refund_past, c(rep(1, 80), 0)) +}) diff --git a/tests/testthat/test-CF-Annuity.R b/tests/testthat/test-CF-Annuity.R new file mode 100644 index 0000000000000000000000000000000000000000..ed4a930e8c8c4b87ae637a02da9443c9823f6ace --- /dev/null +++ b/tests/testthat/test-CF-Annuity.R @@ -0,0 +1,35 @@ +test_that("Annuity Cash Flows", { + library(MortalityTables) + mortalityTables.load("Austria_Annuities_AVOe2005R") + + Tarif.Annuity = InsuranceTarif$new( + name = "Example Tariff - Immediate Annuity", + type = "annuity", + tarif = "Ann1", + desc = "An annuity with single-premium", + premiumPeriod = 1, + + mortalityTable = AVOe2005R.unisex, + i = 0.005 + ) + Contract.Annuity = InsuranceContract$new( + tarif = Tarif.Annuity, + age = 65, YOB = 1955, + sumInsured = 1200, + policyPeriod = 55, + contractClosing = as.Date("2020-09-01"), + calculate = "cashflows" + ) + expect_equal(Contract.Annuity$Parameters$ContractData$policyPeriod, 55) + expect_equal(Contract.Annuity$Parameters$ContractData$deferralPeriod, 0) + expect_equal(Contract.Annuity$Parameters$ContractData$premiumPeriod, 1) + + + expect_true(all(Contract.Annuity$Values$cashFlows %>% select(-premiums_advance, -survival_advance) == 0)) + + # 1 year premium cash flow + expect_equal(Contract.Annuity$Values$cashFlows$premiums_advance, c(1, rep(0, 55))) + # premium payment start immediately for the whole contract period + expect_equal(Contract.Annuity$Values$cashFlows$survival_advance, c(rep(1, 55), 0)) +}) + diff --git a/tests/testthat/test-CF-DreadDisease.R b/tests/testthat/test-CF-DreadDisease.R new file mode 100644 index 0000000000000000000000000000000000000000..4f5562deedc4674703cf6348414534efd7e3a635 --- /dev/null +++ b/tests/testthat/test-CF-DreadDisease.R @@ -0,0 +1,80 @@ +test_that("Dread-Disease Cash Flows", { + library(MortalityTables) + mortalityTables.load("Austria_Census") + + # An example dread-disease tariff, morbidity is assumed linearly increasing with age + ddTable = mortalityTable.period(name = "Linear dread-disease table", + ages = 0:100, deathProbs = 0:100/500) + Tarif.DreadDisease = InsuranceTarif$new( + name = "Example Tariff - Dread-Disease", + type = "dread-disease", + tarif = "DD1", + desc = "A dread disease insurance with a lump-sum payment upon diagnosis", + + sumInsured = 50000, + mortalityTable = mort.AT.census.2011.unisex, + invalidityTable = ddTable, + i = 0.005 + ) + + Contract.DreadDisease = InsuranceContract$new( + tarif = Tarif.DreadDisease, + age = 40, policyPeriod = 20, + sumInsured = 10000, + contractClosing = as.Date("2020-09-01"), + calculate = "cashflows" + ) + expect_equal(Contract.DreadDisease$Parameters$ContractData$policyPeriod, 20) + expect_equal(Contract.DreadDisease$Parameters$ContractData$deferralPeriod, 0) + expect_equal(Contract.DreadDisease$Parameters$ContractData$premiumPeriod, 20) + + + expect_true(all(Contract.DreadDisease$Values$cashFlows %>% select(-premiums_advance, -disease_SumInsured) == 0)) + + expect_equal(Contract.DreadDisease$Values$cashFlows$premiums_advance, c(rep(1, 20), 0)) + expect_equal(Contract.DreadDisease$Values$cashFlows$disease_SumInsured, c(rep(1, 20), 0)) +}) + +"" +test_that("Endowment + Dread-Disease Cash Flows", { + library(MortalityTables) + mortalityTables.load("Austria_Census") + + # An example dread-disease tariff, morbidity is assumed linearly increasing with age + ddTable = mortalityTable.period(name = "Linear dread-disease table", + ages = 0:100, deathProbs = 0:100/500) + Tarif.EndowDreadDisease = InsuranceTarif$new( + name = "Example Tariff - Endowment + Dread-Disease", + type = "endowment + dread-disease", + tarif = "EnDD1", + desc = "An endowment and dread disease insurance with a lump-sum payment upon diagnosis", + + sumInsured = 50000, + mortalityTable = mort.AT.census.2011.unisex, + invalidityTable = ddTable, + invalidityEndsContract = TRUE, + i = 0.005 + ) + + Contract.EndowDreadDisease = InsuranceContract$new( + tarif = Tarif.EndowDreadDisease, + age = 40, policyPeriod = 20, + sumInsured = 10000, + contractClosing = as.Date("2020-09-01"), + calculate = "cashflows" + ) + expect_equal(Contract.EndowDreadDisease$Parameters$ContractData$policyPeriod, 20) + expect_equal(Contract.EndowDreadDisease$Parameters$ContractData$deferralPeriod, 0) + expect_equal(Contract.EndowDreadDisease$Parameters$ContractData$premiumPeriod, 20) + + + expect_true(all(Contract.EndowDreadDisease$Values$cashFlows %>% select(-premiums_advance, -survival_advance, -death_SumInsured, -death_PremiumFree, -disease_SumInsured) == 0)) + + expect_equal(Contract.EndowDreadDisease$Values$cashFlows$premiums_advance, c(rep(1, 20), 0)) + expect_equal(Contract.EndowDreadDisease$Values$cashFlows$survival_advance, c(rep(0, 20), 1)) + expect_equal(Contract.EndowDreadDisease$Values$cashFlows$death_SumInsured, c(rep(1, 20), 0)) + expect_equal(Contract.EndowDreadDisease$Values$cashFlows$disease_SumInsured, c(rep(1, 20), 0)) + expect_equal(Contract.EndowDreadDisease$Values$cashFlows$death_PremiumFree, c(rep(1, 20), 0)) + +}) + diff --git a/tests/testthat/test-CF-Endowment-SP.R b/tests/testthat/test-CF-Endowment-SP.R new file mode 100644 index 0000000000000000000000000000000000000000..113bf85a5d0d1017b017595b7ebcc224161e8aa6 --- /dev/null +++ b/tests/testthat/test-CF-Endowment-SP.R @@ -0,0 +1,32 @@ +test_that("Endowment Cash Flows", { + library(MortalityTables) + mortalityTables.load("Austria_Census") + + Tarif.Endowment.SP = InsuranceTarif$new( + name = "Example Tariff - Endowment Single Premium", + type = "endowment", + tarif = "E1-SP", + desc = "An endowment with single premiums (standard tariff)", + premiumPeriod = 1, + mortalityTable = mort.AT.census.2011.unisex, + i = 0.005 + ) + Contract.Endowment.SP = InsuranceContract$new( + tarif = Tarif.Endowment.SP, + age = 40, policyPeriod = 20, + sumInsured = 10000, + contractClosing = as.Date("2020-09-01"), + calculate = "cashflows" + ) + expect_equal(Contract.Endowment.SP$Parameters$ContractData$policyPeriod, 20) + expect_equal(Contract.Endowment.SP$Parameters$ContractData$deferralPeriod, 0) + expect_equal(Contract.Endowment.SP$Parameters$ContractData$premiumPeriod, 1) + + + expect_true(all(Contract.Endowment.SP$Values$cashFlows %>% select(-premiums_advance, -survival_advance, -death_SumInsured, -death_PremiumFree) == 0)) + + expect_equal(Contract.Endowment.SP$Values$cashFlows$premiums_advance, c(1, rep(0, 20))) + expect_equal(Contract.Endowment.SP$Values$cashFlows$survival_advance, c(rep(0, 20), 1)) + expect_equal(Contract.Endowment.SP$Values$cashFlows$death_SumInsured, c(rep(1, 20),0)) + expect_equal(Contract.Endowment.SP$Values$cashFlows$death_PremiumFree, c(rep(1, 20), 0)) +}) diff --git a/tests/testthat/test-CF-Endowment.R b/tests/testthat/test-CF-Endowment.R new file mode 100644 index 0000000000000000000000000000000000000000..65715c7837f62c7f406b42dd6ee42d0acd9674da --- /dev/null +++ b/tests/testthat/test-CF-Endowment.R @@ -0,0 +1,32 @@ +test_that("Endowment Cash Flows", { + library(MortalityTables) + mortalityTables.load("Austria_Census") + + Tarif.Endowment = InsuranceTarif$new( + name = "Example Tariff - Endowment", + type = "endowment", + tarif = "E1-RP", + desc = "An endowment with regular premiums (standard tariff)", + + mortalityTable = mort.AT.census.2011.unisex, + i = 0.005 + ) + Contract.Endowment = InsuranceContract$new( + tarif = Tarif.Endowment, + age = 40, policyPeriod = 20, + sumInsured = 10000, + contractClosing = as.Date("2020-09-01"), + calculate = "cashflows" + ) + expect_equal(Contract.Endowment$Parameters$ContractData$policyPeriod, 20) + expect_equal(Contract.Endowment$Parameters$ContractData$deferralPeriod, 0) + expect_equal(Contract.Endowment$Parameters$ContractData$premiumPeriod, 20) + + + expect_true(all(Contract.Endowment$Values$cashFlows %>% select(-premiums_advance, -survival_advance, -death_SumInsured, -death_PremiumFree) == 0)) + + expect_equal(Contract.Endowment$Values$cashFlows$premiums_advance, c(rep(1, 20), 0)) + expect_equal(Contract.Endowment$Values$cashFlows$survival_advance, c(rep(0, 20), 1)) + expect_equal(Contract.Endowment$Values$cashFlows$death_SumInsured, c(rep(1, 20),0)) + expect_equal(Contract.Endowment$Values$cashFlows$death_PremiumFree, c(rep(1, 20), 0)) +}) diff --git a/tests/testthat/test-CF-Life.R b/tests/testthat/test-CF-Life.R new file mode 100644 index 0000000000000000000000000000000000000000..714f6e0197e55f64bf1419f91b80f05a8e0bdced --- /dev/null +++ b/tests/testthat/test-CF-Life.R @@ -0,0 +1,32 @@ +test_that("Term Life Cash Flows", { + library(MortalityTables) + mortalityTables.load("Austria_Census") + + Tarif.Life = InsuranceTarif$new( + name = "Example Tariff - Whole/Term Life", + type = "wholelife", + tarif = "Life1", + desc = "A whole or term life insurance with regular premiums", + + mortalityTable = mort.AT.census.2011.unisex, + i = 0.005 + ) + + Contract.Life = InsuranceContract$new( + tarif = Tarif.Life, + age = 40, policyPeriod = 20, + sumInsured = 10000, + contractClosing = as.Date("2020-09-01"), + calculate = "cashflows" + ) + expect_equal(Contract.Life$Parameters$ContractData$policyPeriod, 20) + expect_equal(Contract.Life$Parameters$ContractData$deferralPeriod, 0) + expect_equal(Contract.Life$Parameters$ContractData$premiumPeriod, 20) + + + expect_true(all(Contract.Life$Values$cashFlows %>% select(-premiums_advance, -death_SumInsured, -death_PremiumFree) == 0)) + + expect_equal(Contract.Life$Values$cashFlows$premiums_advance, c(rep(1, 20), 0)) + expect_equal(Contract.Life$Values$cashFlows$death_SumInsured, c(rep(1, 20), 0)) + expect_equal(Contract.Life$Values$cashFlows$death_PremiumFree, c(rep(1, 20), 0)) +}) diff --git a/tests/testthat/test-CF-PureEndowment.R b/tests/testthat/test-CF-PureEndowment.R new file mode 100644 index 0000000000000000000000000000000000000000..e51077889b16bab7d00883d2d4d1245c9aaa73fc --- /dev/null +++ b/tests/testthat/test-CF-PureEndowment.R @@ -0,0 +1,33 @@ +test_that("Pure Endowment Cash Flows", { + library(MortalityTables) + mortalityTables.load("Austria_Census") + + Tarif.PureEnd = InsuranceTarif$new( + name = "Example Tariff - Pure Endowment", + type = "pureendowment", + tarif = "PE1-RP", + desc = "A pure endowment with regular premiums (standard tariff)", + + mortalityTable = mort.AT.census.2011.unisex, + i = 0.005, + premiumRefund = 1 + ) + Contract.PureEnd = InsuranceContract$new( + tarif = Tarif.PureEnd, + age = 40, policyPeriod = 20, + sumInsured = 10000, + contractClosing = as.Date("2020-09-01"), + calculate = "cashflows" + ) + expect_equal(Contract.PureEnd$Parameters$ContractData$policyPeriod, 20) + expect_equal(Contract.PureEnd$Parameters$ContractData$deferralPeriod, 0) + expect_equal(Contract.PureEnd$Parameters$ContractData$premiumPeriod, 20) + + + expect_true(all(Contract.PureEnd$Values$cashFlows %>% select(-premiums_advance, -survival_advance, -death_GrossPremium, -death_Refund_past) == 0)) + + expect_equal(Contract.PureEnd$Values$cashFlows$premiums_advance, c(rep(1, 20), 0)) + expect_equal(Contract.PureEnd$Values$cashFlows$survival_advance, c(rep(0, 20), 1)) + expect_equal(Contract.PureEnd$Values$cashFlows$death_GrossPremium, c(1:20,0)) + expect_equal(Contract.PureEnd$Values$cashFlows$death_Refund_past, c(rep(1, 20), 0)) +}) diff --git a/tests/testthat/test-CF-TermeFixe.R b/tests/testthat/test-CF-TermeFixe.R new file mode 100644 index 0000000000000000000000000000000000000000..d103657244082cae2cbee76b43673b83251eeb39 --- /dev/null +++ b/tests/testthat/test-CF-TermeFixe.R @@ -0,0 +1,30 @@ +test_that("Termfix Cash Flows", { + library(MortalityTables) + mortalityTables.load("Austria_Census") + + Tarif.Termfix = InsuranceTarif$new( + name = "Example Tariff - Terme Fixe", + type = "terme-fix", + tarif = "TF", + desc = "A termfix insurance with regular premiums", + + mortalityTable = mort.AT.census.2011.unisex, + i = 0.005 + ) + Contract.Termfix = InsuranceContract$new( + tarif = Tarif.Termfix, + age = 40, policyPeriod = 20, + sumInsured = 10000, + contractClosing = as.Date("2020-09-01"), + calculate = "cashflows" + ) + expect_equal(Contract.Termfix$Parameters$ContractData$policyPeriod, 20) + expect_equal(Contract.Termfix$Parameters$ContractData$deferralPeriod, 0) + expect_equal(Contract.Termfix$Parameters$ContractData$premiumPeriod, 20) + + + expect_true(all(Contract.Termfix$Values$cashFlows %>% select(-premiums_advance, -guaranteed_advance) == 0)) + + expect_equal(Contract.Termfix$Values$cashFlows$premiums_advance, c(rep(1, 20), 0)) + expect_equal(Contract.Termfix$Values$cashFlows$guaranteed_advance, c(rep(0, 20), 1)) +}) diff --git a/tests/testthat/test-Cost-Initialization.R b/tests/testthat/test-Cost-Initialization.R new file mode 100644 index 0000000000000000000000000000000000000000..da277efe48aef462f817a38df372bd3e318d63d3 --- /dev/null +++ b/tests/testthat/test-Cost-Initialization.R @@ -0,0 +1,28 @@ +test_that("multiplication works", { + c1 = initializeCosts( + alpha = 0.04, + Zillmer = 0.025, + beta = 0.05, + gamma = 0.0005, + gamma.paidUp = 0.001, + gamma.premiumfree = 0.00075, + gamma.contract = 0.002, + unitcosts = 10, + unitcosts.PolicyPeriod = 12 + ) + + # the above is the short form of: + c2 = initializeCosts() + c2[["alpha", "SumPremiums", "once"]] = 0.04 + c2[["Zillmer", "SumPremiums", "once"]] = 0.025 + c2[["beta", "GrossPremium", "PremiumPeriod"]] = 0.05 + c2[["gamma", "SumInsured", "PremiumPeriod"]] = 0.0005 + c2[["gamma_nopremiums", "SumInsured", "PolicyPeriod"]] = 0.001 + c2[["gamma", "SumInsured", "PremiumFree"]] = 0.00075 + c2[["gamma", "SumInsured", "PolicyPeriod"]] = 0.002 + c2[["unitcosts", "Constant", "PremiumPeriod"]] = 10 + c2[["unitcosts", "Constant", "PolicyPeriod"]] = 12 + + expect_equal(c1, c2) + expect_equal(c1, initializeCosts(c1)) +})