tests/testthat/test-e2e.R

python_golden <- list(
  MID_SIZE_UNIVERSAL = c(
    AT1=220000000, CBR_RATE=.036, CET1=1352732127.7053258,
    CET1_HEADROOM=560742300.6250302, CET1_RATIO=.1556430536381755,
    CSRBB_LOSS=44603017.943738274, ECONOMIC_CAPACITY=1455000000,
    ECONOMIC_HEADROOM=290760000, EC_AGGREGATE=1164240000,
    EC_LINEAR=1449000000, EC_RWA_EQUIVALENT=14553000000,
    EVE_ES_99=1967725037.2937167, EVE_SOT_RATIO=.11054996119457457,
    EVE_VAR_99=1733552173.1972048, FLOOR_UPLIFT=0,
    IRB_EL=2170688.206597876, IRB_EXCESS=79899663.3141933,
    IRB_SHORTFALL=0, IRRBB_MANAGEMENT_CAPITAL=2012328055.237455,
    IRRBB_RWA_EQUIVALENT=25154100690.468185, K_CVA=4684525.1115463115,
    K_CVA_SA=282053.53976149135, K_LARGE_EXPOSURE=2000000,
    K_MARKET=12179250.426791588, K_MARKET_FRTB=30885967.05134277,
    K_MARKET_IMA_PARALLEL=105980769.23076922,
    K_MARKET_LEGACY=12179250.426791588, K_OPERATIONAL=102399999.99999999,
    K_SETTLEMENT=566000, LEVERAGE_EXPOSURE=24742847963.960125,
    LEVERAGE_RATIO=.06356310033493849, MREL_HEADROOM=2617348668.690491,
    NII_SOT_RATIO=.017271484075622522, NORMATIVE_MIN_HEADROOM=-93495461.3326348,
    OUTPUT_FLOOR_FACTOR=.55, P2G_RATE=.012, P2R_AMOUNT=156442434.97882384,
    P2R_CET1_SHARE=.5625, P2R_RATE=.018, P2R_RWA_EQUIVALENT=1955530437.235298,
    P2R_TIER1_SHARE=.75, RWEA_CCP=33591058.08968653,
    RWEA_CCR=57428265.206141725, RWEA_CRYPTO=8250000,
    RWEA_IRB=901108184.5742879, RWEA_KSA=5401278717.592506,
    RWEA_KSA_SHADOW_ALL=9752217943.87269,
    RWEA_SECURITISATION=761533968.0205913, RWEA_SFT=5184000.000000001,
    S_TREA=12141077429.418335, T2=287059442.0975881,
    TIER1=1572732127.7053258, TIER1_HEADROOM=621040648.2508142,
    TIER1_RATIO=.18095587877117747, TLAC_HEADROOM=3095367220.014675,
    TOTAL_CAPITAL_RATIO=.2139844490466018, TOTAL_HEADROOM=695164553.8494473,
    TOTAL_OWN_FUNDS=1859791569.802914, TREA=8691246387.712437,
    U_TREA=8691246387.712437, WORST_EVE_LOSS=173865475.68728447,
    WORST_NII_DECLINE=27163417.89888246
  ),
  KSA_BANK = c(
    AT1=220000000, CBR_RATE=.036, CET1=1352732127.7053258,
    CET1_HEADROOM=346669486.3199271, CET1_RATIO=.12252489066426517,
    CSRBB_LOSS=44603017.943738274, ECONOMIC_CAPACITY=1455000000,
    ECONOMIC_HEADROOM=290760000, EC_AGGREGATE=1164240000,
    EC_LINEAR=1449000000, EC_RWA_EQUIVALENT=14553000000,
    EVE_ES_99=1967725037.2937167, EVE_SOT_RATIO=.11054996119457457,
    EVE_VAR_99=1733552173.1972048, FLOOR_UPLIFT=0, IRB_EL=0,
    IRB_EXCESS=0, IRB_SHORTFALL=0,
    IRRBB_MANAGEMENT_CAPITAL=2012328055.237455,
    IRRBB_RWA_EQUIVALENT=25154100690.468185, K_CVA=0, K_CVA_SA=0,
    K_LARGE_EXPOSURE=0, K_MARKET=0, K_MARKET_FRTB=0,
    K_MARKET_IMA_PARALLEL=0, K_MARKET_LEGACY=0,
    K_OPERATIONAL=102399999.99999999, K_SETTLEMENT=0,
    LEVERAGE_EXPOSURE=24685419698.753983,
    LEVERAGE_RATIO=.06371097380145864, MREL_HEADROOM=2059874953.885386,
    NII_SOT_RATIO=.017271484075622522, NORMATIVE_MIN_HEADROOM=-354664294.7848606,
    OUTPUT_FLOOR_FACTOR=.55, P2G_RATE=.012, P2R_AMOUNT=198728422.9897084,
    P2R_CET1_SHARE=.5625, P2R_RATE=.018, P2R_RWA_EQUIVALENT=2484105287.371355,
    P2R_TIER1_SHARE=.75, RWEA_CCP=0, RWEA_CCR=0,
    RWEA_CRYPTO=8250000, RWEA_IRB=0, RWEA_KSA=9752217943.87269,
    RWEA_KSA_SHADOW_ALL=9752217943.87269, RWEA_SECURITISATION=0,
    RWEA_SFT=0, S_TREA=11040467943.87269, T2=281652792.9901424,
    TIER1=1572732127.7053258, TIER1_HEADROOM=363800887.8512664,
    TIER1_RATIO=.14245158227900756, TLAC_HEADROOM=2667100690.7983837,
    TOTAL_CAPITAL_RATIO=.16796252931694136,
    TOTAL_HEADROOM=374962216.2165277, TOTAL_OWN_FUNDS=1854384920.6954682,
    TREA=11040467943.87269, U_TREA=11040467943.87269,
    WORST_EVE_LOSS=173865475.68728447, WORST_NII_DECLINE=27163417.89888246
  )
)

test_that("both complete reference profiles match Python 1.0.0", {
  for (profile in names(python_golden)) {
    result <- calculate_tables(
      generate_synthetic_tables(bank_profile = profile),
      run_id = paste0("TEST-", profile)
    )
    expected <- python_golden[[profile]]
    expect_setequal(names(result$metrics), c(names(expected), "FLOOR_BINDING"))
    actual <- unlist(result$metrics[names(expected)], use.names = TRUE)
    allowed <- pmax(1e-5, abs(expected) * 1e-12)
    expect_true(all(abs(actual - expected) <= allowed),
                info = paste("Cross-language metric mismatch for", profile))
    expect_false(result$metrics$FLOOR_BINDING)
    expect_equal(length(result$results), 34L)
    expect_equal(length(result$parallel_results), 34L)
    expect_true(rwa_internal("calculation_successful")(result))
    expect_equal(rwa_internal("controls_passed")(result), 12L)
  }
})

Try the riskweightedassets package in your browser

Any scripts or data that you put into this service are public.

riskweightedassets documentation built on Sept. 24, 2026, 5:12 p.m.