mirror of
https://github.com/hinto-janai/gupax.git
synced 2024-11-17 09:47:36 +00:00
helper: add [HumanTime] & [HumanNumber] #[test]s
This commit is contained in:
parent
e35f5b243b
commit
233ccd62ac
6 changed files with 122 additions and 17 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
@ -3291,9 +3291,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustversion"
|
name = "rustversion"
|
||||||
version = "1.0.10"
|
version = "1.0.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4378ea89513870b6e2303ec50618e97da0fa43cdd9ded83ad3b6bad2693c08c6"
|
checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ryu"
|
name = "ryu"
|
||||||
|
|
|
@ -310,7 +310,7 @@ mod test {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn git_commit_is_41_chars() {
|
fn git_commit_eq_or_gt_40_chars() {
|
||||||
assert_eq!(crate::COMMIT.len(), 41);
|
assert!(crate::COMMIT.len() >= 40);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -248,7 +248,7 @@ impl State {
|
||||||
// leaving behind old keys+values and updating [default] with old valid ones.
|
// leaving behind old keys+values and updating [default] with old valid ones.
|
||||||
pub fn merge(old: &str) -> Result<Self, TomlError> {
|
pub fn merge(old: &str) -> Result<Self, TomlError> {
|
||||||
let default = toml::ser::to_string(&Self::new()).unwrap();
|
let default = toml::ser::to_string(&Self::new()).unwrap();
|
||||||
let new: Self = match Figment::from(Toml::string(&default)).merge(Toml::string(&old)).extract() {
|
let new: Self = match Figment::from(Toml::string(&default)).merge(Toml::string(old)).extract() {
|
||||||
Ok(new) => { info!("State | TOML merge ... OK"); new },
|
Ok(new) => { info!("State | TOML merge ... OK"); new },
|
||||||
Err(err) => { error!("State | Couldn't merge default + old TOML"); return Err(TomlError::Merge(err)) },
|
Err(err) => { error!("State | Couldn't merge default + old TOML"); return Err(TomlError::Merge(err)) },
|
||||||
};
|
};
|
||||||
|
@ -696,7 +696,7 @@ impl Default for P2pool {
|
||||||
}
|
}
|
||||||
impl Xmrig {
|
impl Xmrig {
|
||||||
fn with_threads(max_threads: usize, current_threads: usize) -> Self {
|
fn with_threads(max_threads: usize, current_threads: usize) -> Self {
|
||||||
let mut xmrig = Self::default();
|
let xmrig = Self::default();
|
||||||
Self {
|
Self {
|
||||||
max_threads,
|
max_threads,
|
||||||
current_threads,
|
current_threads,
|
||||||
|
|
107
src/helper.rs
107
src/helper.rs
|
@ -1116,7 +1116,7 @@ impl Helper {
|
||||||
// Code taken from [https://docs.rs/humantime/] and edited to remove sub-second time, change spacing and some words.
|
// Code taken from [https://docs.rs/humantime/] and edited to remove sub-second time, change spacing and some words.
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, Eq, PartialEq)]
|
||||||
pub struct HumanTime(Duration);
|
pub struct HumanTime(Duration);
|
||||||
|
|
||||||
impl Default for HumanTime {
|
impl Default for HumanTime {
|
||||||
|
@ -1186,7 +1186,7 @@ impl std::fmt::Display for HumanTime {
|
||||||
// Percent | [0.001] -> [0%] | Rounds down, removes redundant zeros
|
// Percent | [0.001] -> [0%] | Rounds down, removes redundant zeros
|
||||||
// Hashrate | [123.0, 311.2, null] -> [123, 311, ???] | Casts, replaces null with [???]
|
// Hashrate | [123.0, 311.2, null] -> [123, 311, ???] | Casts, replaces null with [???]
|
||||||
// CPU Load | [12.0, 11.4, null] -> [12.0, 11.4, ???] | No change, just into [String] form
|
// CPU Load | [12.0, 11.4, null] -> [12.0, 11.4, ???] | No change, just into [String] form
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, Eq, PartialEq)]
|
||||||
pub struct HumanNumber(String);
|
pub struct HumanNumber(String);
|
||||||
|
|
||||||
impl std::fmt::Display for HumanNumber {
|
impl std::fmt::Display for HumanNumber {
|
||||||
|
@ -1216,11 +1216,6 @@ impl HumanNumber {
|
||||||
buf.write_formatted(&(f as u128), &LOCALE);
|
buf.write_formatted(&(f as u128), &LOCALE);
|
||||||
Self(buf.as_str().to_string())
|
Self(buf.as_str().to_string())
|
||||||
}
|
}
|
||||||
fn from_u8(u: u8) -> Self {
|
|
||||||
let mut buf = num_format::Buffer::new();
|
|
||||||
buf.write_formatted(&u, &LOCALE);
|
|
||||||
Self(buf.as_str().to_string())
|
|
||||||
}
|
|
||||||
fn from_u16(u: u16) -> Self {
|
fn from_u16(u: u16) -> Self {
|
||||||
let mut buf = num_format::Buffer::new();
|
let mut buf = num_format::Buffer::new();
|
||||||
buf.write_formatted(&u, &LOCALE);
|
buf.write_formatted(&u, &LOCALE);
|
||||||
|
@ -1272,7 +1267,7 @@ impl HumanNumber {
|
||||||
let mut n = 0;
|
let mut n = 0;
|
||||||
for i in array {
|
for i in array {
|
||||||
match i {
|
match i {
|
||||||
Some(f) => string.push_str(format!("{}", f).as_str()),
|
Some(f) => string.push_str(format!("{:.2}", f).as_str()),
|
||||||
None => string.push_str("???"),
|
None => string.push_str("???"),
|
||||||
}
|
}
|
||||||
if n != 2 {
|
if n != 2 {
|
||||||
|
@ -1336,6 +1331,12 @@ pub struct ImgP2pool {
|
||||||
pub log_level: String, // What log level?
|
pub log_level: String, // What log level?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for ImgP2pool {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl ImgP2pool {
|
impl ImgP2pool {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
@ -1554,6 +1555,12 @@ pub struct ImgXmrig {
|
||||||
pub url: String,
|
pub url: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for ImgXmrig {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl ImgXmrig {
|
impl ImgXmrig {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
@ -1717,6 +1724,90 @@ impl Hashrate {
|
||||||
//---------------------------------------------------------------------------------------------------- TESTS
|
//---------------------------------------------------------------------------------------------------- TESTS
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
|
#[test]
|
||||||
|
fn human_number() {
|
||||||
|
use crate::HumanNumber;
|
||||||
|
assert!(HumanNumber::to_percent(0.001).to_string() == "0%");
|
||||||
|
assert!(HumanNumber::to_percent(12.123123123123).to_string() == "12.12%");
|
||||||
|
assert!(HumanNumber::from_hashrate([Some(123.1), Some(11111.1), None]).to_string() == "[123 H/s, 11,111 H/s, ??? H/s]");
|
||||||
|
assert!(HumanNumber::from_hashrate([None, Some(1.123), Some(123123.312)]).to_string() == "[??? H/s, 1 H/s, 123,123 H/s]");
|
||||||
|
assert!(HumanNumber::from_load([Some(123.1234), Some(321.321), None]).to_string() == "[123.12, 321.32, ???]");
|
||||||
|
assert!(HumanNumber::from_load([None, Some(4321.43), Some(1234.1)]).to_string() == "[???, 4321.43, 1234.10]");
|
||||||
|
assert!(HumanNumber::from_f32(123_123.123123123).to_string() == "123,123");
|
||||||
|
assert!(HumanNumber::from_f64(123_123_123.123123123123123).to_string() == "123,123,123");
|
||||||
|
assert!(HumanNumber::from_u16(1_000).to_string() == "1,000");
|
||||||
|
assert!(HumanNumber::from_u16(65_535).to_string() == "65,535");
|
||||||
|
assert!(HumanNumber::from_u32(65_536).to_string() == "65,536");
|
||||||
|
assert!(HumanNumber::from_u32(100_000).to_string() == "100,000");
|
||||||
|
assert!(HumanNumber::from_u32(1_000_000).to_string() == "1,000,000");
|
||||||
|
assert!(HumanNumber::from_u32(10_000_000).to_string() == "10,000,000");
|
||||||
|
assert!(HumanNumber::from_u32(100_000_000).to_string() == "100,000,000");
|
||||||
|
assert!(HumanNumber::from_u32(1_000_000_000).to_string() == "1,000,000,000");
|
||||||
|
assert!(HumanNumber::from_u32(4_294_967_295).to_string() == "4,294,967,295");
|
||||||
|
assert!(HumanNumber::from_u64(4_294_967_296).to_string() == "4,294,967,296");
|
||||||
|
assert!(HumanNumber::from_u64(10_000_000_000).to_string() == "10,000,000,000");
|
||||||
|
assert!(HumanNumber::from_u64(100_000_000_000).to_string() == "100,000,000,000");
|
||||||
|
assert!(HumanNumber::from_u64(1_000_000_000_000).to_string() == "1,000,000,000,000");
|
||||||
|
assert!(HumanNumber::from_u64(10_000_000_000_000).to_string() == "10,000,000,000,000");
|
||||||
|
assert!(HumanNumber::from_u64(100_000_000_000_000).to_string() == "100,000,000,000,000");
|
||||||
|
assert!(HumanNumber::from_u64(1_000_000_000_000_000).to_string() == "1,000,000,000,000,000");
|
||||||
|
assert!(HumanNumber::from_u64(10_000_000_000_000_000).to_string() == "10,000,000,000,000,000");
|
||||||
|
assert!(HumanNumber::from_u64(18_446_744_073_709_551_615).to_string() == "18,446,744,073,709,551,615");
|
||||||
|
assert!(HumanNumber::from_u128(18_446_744_073_709_551_616).to_string() == "18,446,744,073,709,551,616");
|
||||||
|
assert!(HumanNumber::from_u128(100_000_000_000_000_000_000).to_string() == "100,000,000,000,000,000,000");
|
||||||
|
assert_eq!(
|
||||||
|
HumanNumber::from_u128(340_282_366_920_938_463_463_374_607_431_768_211_455).to_string(),
|
||||||
|
"340,282,366,920,938,463,463,374,607,431,768,211,455",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn human_time() {
|
||||||
|
use crate::HumanTime;
|
||||||
|
use std::time::Duration;
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(0)).to_string() == "0 seconds");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(1)).to_string() == "1 second");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(2)).to_string() == "2 seconds");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(59)).to_string() == "59 seconds");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(60)).to_string() == "1 minute");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(61)).to_string() == "1 minute, 1 second");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(62)).to_string() == "1 minute, 2 seconds");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(120)).to_string() == "2 minutes");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(121)).to_string() == "2 minutes, 1 second");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(122)).to_string() == "2 minutes, 2 seconds");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(179)).to_string() == "2 minutes, 59 seconds");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(3599)).to_string() == "59 minutes, 59 seconds");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(3600)).to_string() == "1 hour");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(3601)).to_string() == "1 hour, 1 second");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(3602)).to_string() == "1 hour, 2 seconds");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(3660)).to_string() == "1 hour, 1 minute");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(3720)).to_string() == "1 hour, 2 minutes");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(86399)).to_string() == "23 hours, 59 minutes, 59 seconds");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(86400)).to_string() == "1 day");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(86401)).to_string() == "1 day, 1 second");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(86402)).to_string() == "1 day, 2 seconds");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(86460)).to_string() == "1 day, 1 minute");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(86520)).to_string() == "1 day, 2 minutes");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(90000)).to_string() == "1 day, 1 hour");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(93600)).to_string() == "1 day, 2 hours");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(604799)).to_string() == "6 days, 23 hours, 59 minutes, 59 seconds");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(604800)).to_string() == "7 days");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(2630016)).to_string() == "1 month");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(3234815)).to_string() == "1 month, 6 days, 23 hours, 59 minutes, 59 seconds");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(5260032)).to_string() == "2 months");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(31557600)).to_string() == "1 year");
|
||||||
|
assert!(HumanTime::into_human(Duration::from_secs(63115200)).to_string() == "2 years");
|
||||||
|
assert_eq!(
|
||||||
|
HumanTime::into_human(Duration::from_secs(18446744073709551615)).to_string(),
|
||||||
|
"584542046090 years, 7 months, 15 days, 17 hours, 5 minutes, 3 seconds",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn build_p2pool_regex() {
|
||||||
|
crate::helper::P2poolRegex::new();
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn calc_payouts_and_xmr_from_output_p2pool() {
|
fn calc_payouts_and_xmr_from_output_p2pool() {
|
||||||
use crate::helper::{PubP2poolApi,P2poolRegex};
|
use crate::helper::{PubP2poolApi,P2poolRegex};
|
||||||
|
|
18
src/main.rs
18
src/main.rs
|
@ -1222,7 +1222,7 @@ impl eframe::App for App {
|
||||||
let color = if hide { BLACK } else { BRIGHT_YELLOW };
|
let color = if hide { BLACK } else { BRIGHT_YELLOW };
|
||||||
if ui.add_sized([box_width, height], Button::new(RichText::new("👁").color(color))).on_hover_text(PASSWORD_HIDE).clicked() { sudo.hide = !sudo.hide; }
|
if ui.add_sized([box_width, height], Button::new(RichText::new("👁").color(color))).on_hover_text(PASSWORD_HIDE).clicked() { sudo.hide = !sudo.hide; }
|
||||||
});
|
});
|
||||||
if (key.is_esc() && !sudo.testing) || ui.add_sized([width, height*4.0], Button::new("Leave")).clicked() { self.error_state.reset(); };
|
if (key.is_esc() && !sudo.testing) || ui.add_sized([width, height*4.0], Button::new("Leave")).on_hover_text(PASSWORD_LEAVE).clicked() { self.error_state.reset(); };
|
||||||
// If [test_sudo()] finished, reset error state.
|
// If [test_sudo()] finished, reset error state.
|
||||||
if sudo.success {
|
if sudo.success {
|
||||||
self.error_state.reset();
|
self.error_state.reset();
|
||||||
|
@ -1571,7 +1571,21 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn build_regex() {
|
fn build_regex() {
|
||||||
crate::Regexes::new();
|
use regex::Regex;
|
||||||
|
let r = crate::Regexes::new();
|
||||||
|
assert!(Regex::is_match(&r.name, "_this_ is... a n-a-m-e."));
|
||||||
|
assert!(Regex::is_match(&r.address, "44hintoFpuo3ugKfcqJvh5BmrsTRpnTasJmetKC4VXCt6QDtbHVuixdTtsm6Ptp7Y8haXnJ6j8Gj2dra8CKy5ewz7Vi9CYW"));
|
||||||
|
assert!(Regex::is_match(&r.ipv4, "192.168.1.2"));
|
||||||
|
assert!(Regex::is_match(&r.ipv4, "127.0.0.1"));
|
||||||
|
assert!(Regex::is_match(&r.domain, "my.node.com"));
|
||||||
|
assert!(Regex::is_match(&r.domain, "my.monero-node123.net"));
|
||||||
|
assert!(Regex::is_match(&r.domain, "www.my-node.org"));
|
||||||
|
assert!(Regex::is_match(&r.domain, "www.my-monero-node123.io"));
|
||||||
|
for i in 1..=65535 {
|
||||||
|
assert!(Regex::is_match(&r.port, &i.to_string()));
|
||||||
|
}
|
||||||
|
assert!(!Regex::is_match(&r.port, "0"));
|
||||||
|
assert!(!Regex::is_match(&r.port, "65536"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -412,7 +412,7 @@ impl Update {
|
||||||
*update.lock().unwrap().prog.lock().unwrap() = 5.0;
|
*update.lock().unwrap().prog.lock().unwrap() = 5.0;
|
||||||
|
|
||||||
// Create Tor/HTTPS client
|
// Create Tor/HTTPS client
|
||||||
let mut lock = update.lock().unwrap();
|
let lock = update.lock().unwrap();
|
||||||
let tor = lock.tor;
|
let tor = lock.tor;
|
||||||
if tor {
|
if tor {
|
||||||
let msg = MSG_TOR.to_string();
|
let msg = MSG_TOR.to_string();
|
||||||
|
|
Loading…
Reference in a new issue