use pixelsrc::build::{BuildPlan, BuildResult, BuildStatus, TargetResult};
use std::path::PathBuf;
use std::time::Duration;
#[test]
fn test_build_result_success() {
let mut result = BuildResult::new();
let target_result = TargetResult::success(
"test_sprite".to_string(),
vec![PathBuf::from("dist/test_sprite.png")],
Duration::from_millis(50),
);
result.add_result(target_result);
assert!(result.is_success(), "Result should be success");
assert_eq!(result.success_count(), 1, "Should have 1 success");
assert_eq!(result.failed_count(), 0, "Should have 0 failures");
}
#[test]
fn test_build_result_failure() {
let mut result = BuildResult::new();
let target_result = TargetResult::failed(
"broken_sprite".to_string(),
"Palette 'missing' not found".to_string(),
Duration::from_millis(10),
);
result.add_result(target_result);
assert!(!result.is_success(), "Result should not be success");
assert_eq!(result.success_count(), 0, "Should have 0 successes");
assert_eq!(result.failed_count(), 1, "Should have 1 failure");
}
#[test]
fn test_build_result_mixed() {
let mut result = BuildResult::new();
result.add_result(TargetResult::success(
"sprite_a".to_string(),
vec![PathBuf::from("dist/sprite_a.png")],
Duration::from_millis(30),
));
result.add_result(TargetResult::failed(
"sprite_b".to_string(),
"Parse error".to_string(),
Duration::from_millis(5),
));
result.add_result(TargetResult::success(
"sprite_c".to_string(),
vec![PathBuf::from("dist/sprite_c.png")],
Duration::from_millis(25),
));
assert!(!result.is_success(), "Result should not be success (has failures)");
assert_eq!(result.success_count(), 2, "Should have 2 successes");
assert_eq!(result.failed_count(), 1, "Should have 1 failure");
}
#[test]
fn test_build_result_skipped() {
let mut result = BuildResult::new();
result.add_result(TargetResult::skipped("cached_sprite".to_string()));
assert!(result.is_success(), "Skipped counts as success");
assert_eq!(result.skipped_count(), 1, "Should have 1 skipped");
}
#[test]
fn test_target_result_success() {
let outputs = vec![
PathBuf::from("dist/hero.png"),
PathBuf::from("dist/hero@2x.png"),
];
let result = TargetResult::success(
"hero".to_string(),
outputs.clone(),
Duration::from_millis(100),
);
assert!(result.is_success(), "Should be success");
assert_eq!(result.target_id, "hero");
assert_eq!(result.outputs, outputs);
}
#[test]
fn test_target_result_failure() {
let result = TargetResult::failed(
"broken".to_string(),
"Sprite 'missing' not found in palette".to_string(),
Duration::from_millis(5),
);
assert!(result.status.is_failure(), "Should be failure");
assert_eq!(result.target_id, "broken");
match &result.status {
BuildStatus::Failed(err) => assert!(err.contains("not found")),
_ => panic!("Expected Failed status"),
}
}
#[test]
fn test_target_result_with_warnings() {
let result = TargetResult::success(
"warning_sprite".to_string(),
vec![PathBuf::from("dist/warning_sprite.png")],
Duration::from_millis(50),
)
.with_warnings(vec![
"Color '#FFF' shortened to '#FFFFFF'".to_string(),
"Unused palette entry '{unused}'".to_string(),
]);
assert!(result.is_success(), "Should still be success");
assert_eq!(result.warnings.len(), 2, "Should have 2 warnings");
}
#[test]
fn test_build_result_summary() {
let mut result = BuildResult::new();
result.add_result(TargetResult::success(
"sprite_1".to_string(),
vec![],
Duration::from_millis(50),
));
result.add_result(TargetResult::success(
"sprite_2".to_string(),
vec![],
Duration::from_millis(30),
));
let summary = result.summary();
assert!(
summary.contains("2") || summary.contains("success"),
"Summary should mention successes: {}",
summary
);
}
#[test]
fn test_build_result_all_outputs() {
let mut result = BuildResult::new();
result.add_result(TargetResult::success(
"sprite_a".to_string(),
vec![PathBuf::from("dist/a.png")],
Duration::from_millis(20),
));
result.add_result(TargetResult::success(
"sprite_b".to_string(),
vec![PathBuf::from("dist/b.png"), PathBuf::from("dist/b@2x.png")],
Duration::from_millis(30),
));
let outputs = result.all_outputs();
assert_eq!(outputs.len(), 3, "Should have 3 total outputs");
}
#[test]
fn test_build_plan_empty() {
let plan = BuildPlan::new();
assert!(plan.is_empty(), "Empty plan should report empty");
assert_eq!(plan.targets().len(), 0, "Should have 0 targets");
}
#[test]
fn test_build_result_duration() {
let duration = Duration::from_secs(5);
let result = BuildResult::new().with_duration(duration);
assert_eq!(result.total_duration, duration, "Duration should match");
}