From 36dc951f1b0af9e40ae0b35daecb186bcedea6eb Mon Sep 17 00:00:00 2001 From: kingchenc Date: Sat, 23 May 2026 23:28:26 +0200 Subject: [PATCH] test(ohlcv): cover Candle::new_unchecked skip-validation constructor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Codecov flagged lines 86-102 in crates/wickra-core/src/ohlcv.rs as missed (file at 90.00%) — the entire body of `Candle::new_unchecked`. Every existing test routes through the validating `Candle::new`, so the unchecked constructor (intended for callers like the aggregator and parsed-payload paths that have already validated upstream) was dead. Add candle_new_unchecked_preserves_fields_verbatim: - first assertion builds a candle with six distinct field values and verifies each reads back exactly. - second assertion feeds an OHLC combination (high < low) that the checked constructor rejects with Error::InvalidCandle, then proves Candle::new_unchecked still builds the struct as-is. This documents and enforces the API contract that the unchecked variant performs no validation. ohlcv.rs is now at 170/170 lines, no behavioural change. --- crates/wickra-core/src/ohlcv.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/crates/wickra-core/src/ohlcv.rs b/crates/wickra-core/src/ohlcv.rs index d60b5479..f3bbce17 100644 --- a/crates/wickra-core/src/ohlcv.rs +++ b/crates/wickra-core/src/ohlcv.rs @@ -216,6 +216,34 @@ mod tests { assert!(matches!(err, Error::InvalidCandle { .. })); } + /// Cover the unchecked constructor `Candle::new_unchecked` (lines 86-102). + /// Every existing test routes through the validating `Candle::new`, so the + /// unchecked path is dead. + /// + /// The first assertion shows that a valid set of fields round-trips + /// verbatim. The second feeds `high < low` (which `Candle::new` would + /// reject with `Error::InvalidCandle`) and asserts the unchecked + /// constructor still produces the struct as-is — documenting and + /// enforcing the API contract that the unchecked variant performs no + /// validation and is the caller's responsibility. + #[test] + fn candle_new_unchecked_preserves_fields_verbatim() { + let c = Candle::new_unchecked(1.0, 2.0, 0.5, 1.5, 100.0, 42); + assert_eq!(c.open, 1.0); + assert_eq!(c.high, 2.0); + assert_eq!(c.low, 0.5); + assert_eq!(c.close, 1.5); + assert_eq!(c.volume, 100.0); + assert_eq!(c.timestamp, 42); + + // Skip-validation contract: an OHLC combination that the checked + // constructor rejects (high < low) is still built without error. + assert!(Candle::new(10.0, 9.0, 10.0, 10.0, 1.0, 0).is_err()); + let unchecked = Candle::new_unchecked(10.0, 9.0, 10.0, 10.0, 1.0, 0); + assert_eq!(unchecked.high, 9.0); + assert_eq!(unchecked.low, 10.0); + } + #[test] fn candle_typical_price() { let c = Candle::new(10.0, 12.0, 9.0, 11.0, 1.0, 0).unwrap();