#![allow(non_snake_case)]
#![allow(non_upper_case_globals)] #![allow(dead_code)]
use crate::ported::hashtable::{Hashtable, Hashtable_foreach, Hashtable_get};
use crate::ported::object::{Object, ObjectClass, Object_class};
#[derive(Debug, Clone, PartialEq)]
pub struct DynamicMeter {
pub name: String,
pub caption: Option<String>,
pub description: Option<String>,
pub type_: u32,
pub maximum: f64,
}
static DynamicMeter_objectClass: ObjectClass = ObjectClass {
extends: Some(&Object_class),
};
impl Object for DynamicMeter {
fn klass(&self) -> &'static ObjectClass {
&DynamicMeter_objectClass
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DynamicIterator {
pub name: String,
pub key: u32,
pub found: bool,
}
pub fn DynamicMeter_compare(key: u32, meter: &DynamicMeter, iter: &mut DynamicIterator) {
if iter.name == meter.name {
iter.found = true;
iter.key = key;
}
}
pub fn DynamicMeters_new() {
todo!("port of DynamicMeter.c:39 — needs Platform_dynamicMeters()")
}
pub fn DynamicMeters_delete() {
todo!("port of DynamicMeter.c:43 — needs Platform_dynamicMetersDone")
}
pub fn DynamicMeter_search(
dynamics: Option<&Hashtable>,
name: &str,
key: Option<&mut u32>,
) -> bool {
let mut iter = DynamicIterator {
name: name.to_string(),
key: 0,
found: false,
};
if let Some(dynamics) = dynamics {
Hashtable_foreach(dynamics, &mut |k, value| {
let any: &dyn core::any::Any = value;
let meter = any
.downcast_ref::<DynamicMeter>()
.expect("DynamicMeter_search: hashtable value is not a DynamicMeter");
DynamicMeter_compare(k, meter, &mut iter);
});
}
if let Some(key) = key {
*key = iter.key;
}
iter.found
}
pub fn DynamicMeter_lookup(dynamics: &Hashtable, key: u32) -> Option<&str> {
Hashtable_get(dynamics, key)
.and_then(|o| {
let any: &dyn core::any::Any = o;
any.downcast_ref::<DynamicMeter>()
})
.map(|meter| meter.name.as_str())
}
pub fn DynamicMeter_init() {
todo!("port of DynamicMeter.c:79 — needs Platform_dynamicMeterInit")
}
pub fn DynamicMeter_updateValues() {
todo!("port of DynamicMeter.c:83 — needs Platform_dynamicMeterUpdateValues")
}
pub fn DynamicMeter_display() {
todo!("port of DynamicMeter.c:87 — needs Platform_dynamicMeterDisplay + RichString")
}
pub fn DynamicMeter_getCaption() {
todo!("port of DynamicMeter.c:92 — needs Settings.dynamicMeters + Hashtable_get")
}
pub fn DynamicMeter_getUiName() {
todo!("port of DynamicMeter.c:100 — needs Settings.dynamicMeters + Hashtable_get")
}
#[cfg(test)]
mod tests {
use super::*;
fn meter(name: &str) -> DynamicMeter {
DynamicMeter {
name: name.to_string(),
caption: None,
description: None,
type_: 0,
maximum: 0.0,
}
}
fn iter(name: &str) -> DynamicIterator {
DynamicIterator {
name: name.to_string(),
key: 0,
found: false,
}
}
#[test]
fn match_sets_found_and_key() {
let mut it = iter("cpu");
DynamicMeter_compare(7, &meter("cpu"), &mut it);
assert!(it.found);
assert_eq!(it.key, 7);
}
#[test]
fn no_match_leaves_iterator_untouched() {
let mut it = iter("cpu");
DynamicMeter_compare(7, &meter("mem"), &mut it);
assert!(!it.found);
assert_eq!(it.key, 0);
}
#[test]
fn string_eq_is_exact_case_sensitive() {
let mut it = iter("CPU");
DynamicMeter_compare(3, &meter("cpu"), &mut it);
assert!(!it.found);
assert_eq!(it.key, 0);
}
#[test]
fn later_match_overwrites_key_no_early_out() {
let mut it = iter("cpu");
DynamicMeter_compare(1, &meter("cpu"), &mut it);
assert_eq!(it.key, 1);
DynamicMeter_compare(2, &meter("cpu"), &mut it);
assert!(it.found);
assert_eq!(it.key, 2);
}
#[test]
fn empty_names_compare_equal() {
let mut it = iter("");
DynamicMeter_compare(5, &meter(""), &mut it);
assert!(it.found);
assert_eq!(it.key, 5);
}
use crate::ported::hashtable::{Hashtable_new, Hashtable_put};
fn registry(names: &[(u32, &str)]) -> Hashtable {
let mut ht = Hashtable_new(0, false);
for &(k, n) in names {
Hashtable_put(&mut ht, k, Box::new(meter(n)));
}
ht
}
#[test]
fn lookup_returns_name_for_present_key() {
let ht = registry(&[(1, "cpu"), (2, "mem"), (100, "io")]);
assert_eq!(DynamicMeter_lookup(&ht, 1), Some("cpu"));
assert_eq!(DynamicMeter_lookup(&ht, 2), Some("mem"));
assert_eq!(DynamicMeter_lookup(&ht, 100), Some("io"));
}
#[test]
fn lookup_returns_none_for_absent_key() {
let ht = registry(&[(1, "cpu")]);
assert_eq!(DynamicMeter_lookup(&ht, 999), None);
}
#[test]
fn search_finds_by_name_and_writes_key() {
let ht = registry(&[(10, "cpu"), (20, "mem"), (30, "io")]);
let mut key: u32 = 0;
assert!(DynamicMeter_search(Some(&ht), "mem", Some(&mut key)));
assert_eq!(key, 20);
}
#[test]
fn search_key_out_param_is_optional() {
let ht = registry(&[(5, "cpu")]);
assert!(DynamicMeter_search(Some(&ht), "cpu", None));
}
#[test]
fn search_miss_returns_false_and_zeroes_key() {
let ht = registry(&[(1, "cpu"), (2, "mem")]);
let mut key: u32 = 12345;
assert!(!DynamicMeter_search(
Some(&ht),
"nonexistent",
Some(&mut key)
));
assert_eq!(key, 0);
}
#[test]
fn search_null_table_returns_false() {
let mut key: u32 = 7;
assert!(!DynamicMeter_search(None, "cpu", Some(&mut key)));
assert_eq!(key, 0);
}
#[test]
fn search_is_case_sensitive_like_string_eq() {
let ht = registry(&[(1, "CPU")]);
let mut key: u32 = 0;
assert!(!DynamicMeter_search(Some(&ht), "cpu", Some(&mut key)));
assert_eq!(key, 0);
assert!(DynamicMeter_search(Some(&ht), "CPU", None));
}
#[test]
fn search_result_matches_lookup_of_returned_key() {
let ht = registry(&[(3, "alpha"), (17, "beta"), (42, "gamma")]);
for name in ["alpha", "beta", "gamma"] {
let mut key: u32 = 0;
assert!(DynamicMeter_search(Some(&ht), name, Some(&mut key)));
assert_eq!(DynamicMeter_lookup(&ht, key), Some(name));
}
}
}