From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <yew-devel-bounces@lists.proxmox.com> Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id C59621FF195 for <inbox@lore.proxmox.com>; Fri, 30 May 2025 14:22:49 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id C1F792E973; Fri, 30 May 2025 14:23:05 +0200 (CEST) From: Dominik Csapak <d.csapak@proxmox.com> To: yew-devel@lists.proxmox.com Date: Fri, 30 May 2025 14:21:47 +0200 Message-Id: <20250530122202.2779300-6-d.csapak@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250530122202.2779300-1-d.csapak@proxmox.com> References: <20250530122202.2779300-1-d.csapak@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.028 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment PROLO_LEO1 0.1 Meta Catches all Leo drug variations so far SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [yew-devel] [PATCH yew-comp 05/20] rrd: units: add tests X-BeenThere: yew-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Yew framework devel list at Proxmox <yew-devel.lists.proxmox.com> List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/yew-devel>, <mailto:yew-devel-request@lists.proxmox.com?subject=unsubscribe> List-Archive: <http://lists.proxmox.com/pipermail/yew-devel/> List-Post: <mailto:yew-devel@lists.proxmox.com> List-Help: <mailto:yew-devel-request@lists.proxmox.com?subject=help> List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel>, <mailto:yew-devel-request@lists.proxmox.com?subject=subscribe> Reply-To: Yew framework devel list at Proxmox <yew-devel@lists.proxmox.com> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: yew-devel-bounces@lists.proxmox.com Sender: "yew-devel" <yew-devel-bounces@lists.proxmox.com> so we can argue about code changes more easily, also expand the range check for negative ranges, since that should not happen. this also adds some comments what the functions should do Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- src/rrd/units.rs | 149 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 145 insertions(+), 4 deletions(-) diff --git a/src/rrd/units.rs b/src/rrd/units.rs index b29a238..ad72565 100644 --- a/src/rrd/units.rs +++ b/src/rrd/units.rs @@ -1,16 +1,21 @@ +// calculates the distance of the x axis labels + grid for base10 units +// The distance calculated is always between 1/2 and 1/10 of the range pub(crate) fn get_grid_unit_base10(min: f64, max: f64) -> f64 { let range = max - min; - if range == 0.0 { - panic!("get_grid_unit_base10: got zero range - internal error"); + if range <= 0.0 { + panic!("get_grid_unit_base10: got zero or negative range - internal error"); } let mut l = range.log10() as i32; + // the count can be between 1 and 10 while (range / 10.0_f64.powi(l)) < 2.0 { l -= 1; } + // now it must be between 2 and 20 + let mut res = 10.0_f64.powi(l); let count = range / res; @@ -20,15 +25,18 @@ pub(crate) fn get_grid_unit_base10(min: f64, max: f64) -> f64 { } else if count > 10.0 { res *= 2.0; } + // here the count must be between 2 and 10 res } +// calculates the distance of the x axis labels + grid for base2 units +// The distance calculated is always smaller than 1/4 of the range pub(crate) fn get_grid_unit_base2(min: f64, max: f64) -> f64 { let range = max - min; - if range == 0.0 { - panic!("get_grid_unit_base2: got zero range - internal error"); + if range <= 0.0 { + panic!("get_grid_unit_base2: got zero or negative range - internal error"); } let mut l = range.log2() as i32; @@ -93,3 +101,136 @@ pub(crate) fn get_time_grid_unit(min: i64, max: i64) -> i64 { l } + +#[cfg(test)] +mod test { + use std::panic; + + use crate::rrd::units::get_time_grid_unit; + + use super::{get_grid_unit_base10, get_grid_unit_base2}; + + const DELTA: f64 = 0.0000001; + + #[test] + fn test_grid_unit_base2() { + // min, max, result + let test_data = [ + // normal range tests + (0.0, 0.01, Some(2.0_f64.powi(-9))), + (0.0, 2.0, Some(2.0_f64.powi(-1))), + (0.0, 0.00001, Some(2.0_f64.powi(-19))), + (0.0, 100.0, Some(2.0_f64.powi(4))), + (0.0, 1_000_000.0, Some(2.0_f64.powi(17))), + (0.0, f64::MAX, Some(2.0_f64.powi(1021))), + ( + 10.0 * 1024.0 * 1024.0, + 12.5 * 1024.0 * 1024.0, + Some(2.0_f64.powi(19)), + ), + // ranges with negative data + (-500.0, -100.0, Some(2.0_f64.powi(6))), + (-500.0, 100.0, Some(2.0_f64.powi(7))), + // panic tests + (0.0, 0.0, None), + (100.0, 0.01, None), + ]; + + for (min, max, expected) in test_data { + match ( + panic::catch_unwind(|| get_grid_unit_base2(min, max)).ok(), + expected, + ) { + (Some(result), Some(expected)) => { + let diff = result - expected; + assert_eq!( + diff < DELTA, + diff > -DELTA, + "{min} .. {max} ->\n {expected} \n {result}" + ) + } + (None, Some(expected)) => { + panic!("panic'ed when it shouldn't: {min} .. {max} -> {expected}") + } + (Some(result), None) => { + panic!("result when it should have panic'ed: {min} .. {max} -> {result}") + } + (None, None) => {} + } + } + } + + #[test] + fn test_grid_unit_base10() { + // min, max, result + let test_data = [ + // normal range tests + (0.0, 0.01, Some(0.001)), + (0.0, 2.0, Some(1.0)), + (0.0, 0.00001, Some(0.000002)), + (0.0, 100.0, Some(10.0)), + (0.0, 1_000_000.0, Some(100_000.0)), + ( + 0.0, + f64::MAX, + Some(5000000000000002.0 * 10.0_f64.powf(292.0)), + ), + ( + 10.0 * 1024.0 * 1024.0, + 12.5 * 1024.0 * 1024.0, + Some(1_000_000.0), + ), + // ranges with negative data + (-500.0, -100.0, Some(100.0)), + (-500.0, 100.0, Some(100.0)), + // panic tests + (0.0, 0.0, None), + (100.0, 0.01, None), + ]; + + for (min, max, expected) in test_data { + match ( + panic::catch_unwind(|| get_grid_unit_base10(min, max)).ok(), + expected, + ) { + (Some(result), Some(expected)) => { + let diff = result - expected; + assert_eq!( + diff < DELTA, + diff > -DELTA, + "{min} .. {max} ->\n {expected} \n {result}" + ) + } + (None, Some(expected)) => { + panic!("panic'ed when it shouldn't: {min} .. {max} -> {expected}") + } + (Some(result), None) => { + panic!("result when it should have panic'ed: {min} .. {max} -> {result}") + } + (None, None) => {} + } + } + } + + #[test] + fn test_time_grid_unit() { + // min max result + let test_data = [ + (0, 10, 1), + (0, 100, 15), + (0, 1_000_000, 172800), + (0, i64::MAX, 1519964874237542400), + (-1000, 1_000_000, 172800), + (0, 0, 1), + (1, 0, 1), + ]; + + for (min, max, expected) in test_data { + assert_eq!( + get_time_grid_unit(min, max), + expected, + "{min}..{max} -> {expected}" + ) + } + } +} -- 2.39.5 _______________________________________________ yew-devel mailing list yew-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel