Skip to content

Commit cdc2adf

Browse files
authored
Merge pull request #1195 from shm11C3/chore/add-backend-test
Add unit tests for hardware monitoring and language services
2 parents 0333ea9 + 7ebd902 commit cdc2adf

File tree

5 files changed

+1119
-9
lines changed

5 files changed

+1119
-9
lines changed

src-tauri/src/infrastructure/providers/windows/wmi_provider.rs

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,3 +365,154 @@ fn describe_memory_type_with_fallback(
365365
None => "Unknown".to_string(),
366366
}
367367
}
368+
369+
#[cfg(test)]
370+
mod tests {
371+
use super::*;
372+
373+
// ── format_wmi_datetime ──
374+
375+
#[test]
376+
fn format_wmi_datetime_typical() {
377+
let result = format_wmi_datetime("20230101000000.000000+000");
378+
assert_eq!(result, Some("2023-01-01".to_string()));
379+
}
380+
381+
#[test]
382+
fn format_wmi_datetime_exact_8_chars() {
383+
let result = format_wmi_datetime("20240315");
384+
assert_eq!(result, Some("2024-03-15".to_string()));
385+
}
386+
387+
#[test]
388+
fn format_wmi_datetime_too_short() {
389+
let result = format_wmi_datetime("2023");
390+
assert!(result.is_none());
391+
}
392+
393+
#[test]
394+
fn format_wmi_datetime_empty() {
395+
let result = format_wmi_datetime("");
396+
assert!(result.is_none());
397+
}
398+
399+
// ── describe_memory_type ──
400+
401+
#[test]
402+
fn describe_memory_type_ddr4() {
403+
assert_eq!(describe_memory_type(Some(26)), "DDR4");
404+
}
405+
406+
#[test]
407+
fn describe_memory_type_ddr3() {
408+
assert_eq!(describe_memory_type(Some(24)), "DDR3");
409+
}
410+
411+
#[test]
412+
fn describe_memory_type_ddr2() {
413+
assert_eq!(describe_memory_type(Some(21)), "DDR2");
414+
}
415+
416+
#[test]
417+
fn describe_memory_type_ddr() {
418+
assert_eq!(describe_memory_type(Some(20)), "DDR");
419+
}
420+
421+
#[test]
422+
fn describe_memory_type_sdram() {
423+
assert_eq!(describe_memory_type(Some(17)), "SDRAM");
424+
}
425+
426+
#[test]
427+
fn describe_memory_type_unknown_zero() {
428+
assert_eq!(describe_memory_type(Some(0)), "Unknown or Unsupported");
429+
}
430+
431+
#[test]
432+
fn describe_memory_type_none() {
433+
assert_eq!(describe_memory_type(None), "Unknown");
434+
}
435+
436+
#[test]
437+
fn describe_memory_type_unrecognized_value() {
438+
assert_eq!(
439+
describe_memory_type(Some(99)),
440+
"Other or Unknown Memory Type (99)"
441+
);
442+
}
443+
444+
// ── describe_memory_type_with_fallback ──
445+
446+
#[test]
447+
fn fallback_memory_type_none_returns_unknown() {
448+
assert_eq!(describe_memory_type_with_fallback(None, None), "Unknown");
449+
}
450+
451+
#[test]
452+
fn fallback_memory_type_zero_with_smbios_ddr5() {
453+
assert_eq!(
454+
describe_memory_type_with_fallback(Some(0), Some(34)),
455+
"DDR5"
456+
);
457+
}
458+
459+
#[test]
460+
fn fallback_memory_type_zero_with_smbios_ddr4() {
461+
assert_eq!(
462+
describe_memory_type_with_fallback(Some(0), Some(26)),
463+
"DDR4"
464+
);
465+
}
466+
467+
#[test]
468+
fn fallback_memory_type_zero_with_smbios_ddr3() {
469+
assert_eq!(
470+
describe_memory_type_with_fallback(Some(0), Some(24)),
471+
"DDR3"
472+
);
473+
}
474+
475+
#[test]
476+
fn fallback_memory_type_zero_with_smbios_ddr2() {
477+
assert_eq!(
478+
describe_memory_type_with_fallback(Some(0), Some(21)),
479+
"DDR2"
480+
);
481+
}
482+
483+
#[test]
484+
fn fallback_memory_type_zero_with_smbios_ddr() {
485+
assert_eq!(describe_memory_type_with_fallback(Some(0), Some(20)), "DDR");
486+
}
487+
488+
#[test]
489+
fn fallback_memory_type_zero_with_unknown_smbios() {
490+
assert_eq!(
491+
describe_memory_type_with_fallback(Some(0), Some(50)),
492+
"Other SMBIOS Memory Type (50)"
493+
);
494+
}
495+
496+
#[test]
497+
fn fallback_memory_type_zero_with_no_smbios() {
498+
assert_eq!(describe_memory_type_with_fallback(Some(0), None), "Unknown");
499+
}
500+
501+
#[test]
502+
fn fallback_memory_type_nonzero_uses_primary() {
503+
// When memory_type is non-zero, it should use describe_memory_type directly
504+
assert_eq!(
505+
describe_memory_type_with_fallback(Some(26), Some(34)),
506+
"DDR4"
507+
);
508+
}
509+
510+
#[test]
511+
fn fallback_memory_type_nonzero_ignores_smbios() {
512+
// memory_type=24 (DDR3) should be used, not smbios_memory_type=34 (DDR5)
513+
assert_eq!(
514+
describe_memory_type_with_fallback(Some(24), Some(34)),
515+
"DDR3"
516+
);
517+
}
518+
}

src-tauri/src/models/hardware.rs

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,3 +151,113 @@ where
151151
s.serialize_str(&format!("{x:.1}")) // Up to 1 decimal place
152152
}
153153
}
154+
155+
#[cfg(test)]
156+
mod tests {
157+
use super::*;
158+
159+
fn make_process_info(cpu: f32, mem: f32) -> ProcessInfo {
160+
ProcessInfo {
161+
pid: 1,
162+
name: "test".to_string(),
163+
cpu_usage: cpu,
164+
memory_usage: mem,
165+
}
166+
}
167+
168+
// ── serialize_usage via ProcessInfo JSON serialization ──
169+
170+
#[test]
171+
fn serialize_usage_integer_values() {
172+
let info = make_process_info(50.0, 100.0);
173+
let json = serde_json::to_value(&info).unwrap();
174+
assert_eq!(json["cpuUsage"], "50");
175+
assert_eq!(json["memoryUsage"], "100");
176+
}
177+
178+
#[test]
179+
fn serialize_usage_fractional_values() {
180+
let info = make_process_info(12.5, 33.3);
181+
let json = serde_json::to_value(&info).unwrap();
182+
assert_eq!(json["cpuUsage"], "12.5");
183+
assert_eq!(json["memoryUsage"], "33.3");
184+
}
185+
186+
#[test]
187+
fn serialize_usage_zero() {
188+
let info = make_process_info(0.0, 0.0);
189+
let json = serde_json::to_value(&info).unwrap();
190+
assert_eq!(json["cpuUsage"], "0");
191+
assert_eq!(json["memoryUsage"], "0");
192+
}
193+
194+
#[test]
195+
fn serialize_usage_small_fraction() {
196+
let info = make_process_info(0.1, 0.9);
197+
let json = serde_json::to_value(&info).unwrap();
198+
assert_eq!(json["cpuUsage"], "0.1");
199+
assert_eq!(json["memoryUsage"], "0.9");
200+
}
201+
202+
// ── ProcessInfo camelCase serialization ──
203+
204+
#[test]
205+
fn process_info_camel_case_keys() {
206+
let info = make_process_info(1.0, 2.0);
207+
let json = serde_json::to_value(&info).unwrap();
208+
assert!(json.get("cpuUsage").is_some());
209+
assert!(json.get("memoryUsage").is_some());
210+
assert!(json.get("pid").is_some());
211+
assert!(json.get("name").is_some());
212+
}
213+
214+
// ── NameValue serialization ──
215+
216+
#[test]
217+
fn name_value_serialization() {
218+
let nv = NameValue {
219+
name: "GPU0".to_string(),
220+
value: 72,
221+
};
222+
let json = serde_json::to_value(&nv).unwrap();
223+
assert_eq!(json["name"], "GPU0");
224+
assert_eq!(json["value"], 72);
225+
}
226+
227+
// ── GpuUsageResult serialization ──
228+
229+
#[test]
230+
fn gpu_usage_result_serialization() {
231+
let result = GpuUsageResult {
232+
usage: 85,
233+
source: "NVAPI".to_string(),
234+
};
235+
let json = serde_json::to_value(&result).unwrap();
236+
assert_eq!(json["usage"], 85);
237+
assert_eq!(json["source"], "NVAPI");
238+
}
239+
240+
// ── GpuMemoryUsage serialization ──
241+
242+
#[test]
243+
fn gpu_memory_usage_with_none_fields() {
244+
let mem = GpuMemoryUsage {
245+
in_use_bytes: None,
246+
alloc_bytes: None,
247+
};
248+
let json = serde_json::to_value(&mem).unwrap();
249+
assert!(json["inUseBytes"].is_null());
250+
assert!(json["allocBytes"].is_null());
251+
}
252+
253+
#[test]
254+
fn gpu_memory_usage_with_values() {
255+
let mem = GpuMemoryUsage {
256+
in_use_bytes: Some("1048576".to_string()),
257+
alloc_bytes: Some("2097152".to_string()),
258+
};
259+
let json = serde_json::to_value(&mem).unwrap();
260+
assert_eq!(json["inUseBytes"], "1048576");
261+
assert_eq!(json["allocBytes"], "2097152");
262+
}
263+
}

0 commit comments

Comments
 (0)