jbuild 0.1.9

High-performance Java build tool supporting Maven and Gradle
Documentation
use jbuild::interactive::*;

mod test_utils;
use test_utils::*;

#[test]
fn test_build_metrics_creation() {
    let metrics = BuildMetrics::new();
    assert!(metrics.elapsed().as_millis() >= 0);
    assert!(metrics.phase_times.is_empty());
}

#[test]
fn test_profile_report_structure() {
    let report = create_test_profile_report();
    assert_eq!(report.build_time.as_secs(), 5);
    assert!(report.success);
    assert_eq!(report.error_count, 1);
    assert_eq!(report.phases.len(), 3);
}

#[test]
fn test_environment_creation() {
    let env = TestEnvironment::new();
    assert!(env.project_path().exists());
    assert!(env.temp_path().exists());
}

#[test]
fn test_maven_project_creation() {
    let env = TestEnvironment::new().with_maven_project();
    assert!(env.project_path().join("pom.xml").exists());
    assert!(env.project_path().join("src").join("main").join("java").exists());
}

#[test]
fn test_gradle_project_creation() {
    let env = TestEnvironment::new().with_gradle_project();
    assert!(env.project_path().join("build.gradle").exists());
    assert!(env.project_path().join("src").join("main").join("java").exists());
}

#[test]
fn test_command_execution() {
    // Test that jbuild commands can be executed
    let output = run_jbuild_command(&["--help"], None);
    assert!(output.status.success() || !output.stderr.is_empty());
}

#[test]
fn test_report_generation() {
    let report = create_test_profile_report();
    let markdown = generate_markdown_report(&report);
    assert!(markdown.contains("# Build Profile Report"));
    
    let text = generate_text_report(&report);
    assert!(text.contains("Build Profile Report"));
}

#[test]
fn test_performance_timing() {
    let duration = measure_time(|| {
        // Simulate some work
        std::thread::sleep(std::time::Duration::from_millis(10));
    });
    
    assert!(duration.as_millis() >= 10);
}

#[test]
fn test_project_creation_utilities() {
    let temp_dir = create_test_dir();
    let project_path = temp_dir.path();
    
    create_maven_project(project_path);
    assert!(project_path.join("pom.xml").exists());
    
    create_gradle_project(project_path);
    assert!(project_path.join("build.gradle").exists());
    
    create_minimal_project(project_path);
    assert!(project_path.join("pom.xml").exists());
}

#[test]
fn test_assertions_macros() {
    assert_contains_ignore_case("Hello World", "hello");
    assert_contains_ignore_case("Test Output", "output");
    
    // This should pass
    assert_non_empty_output(&["--help"], None);
}

#[test]
fn test_configuration_defaults() {
    let config = TestConfig::default();
    assert_eq!(config.timeout, 30);
    assert_eq!(config.iterations, 100);
    assert!(!config.verbose);
    assert!(config.cleanup);
    
    let runner_config = TestRunnerConfig::default();
    assert_eq!(runner_config.threads, 1);
    assert_eq!(runner_config.timeout, 30);
    assert_eq!(runner_config.categories.len(), 3);
}

#[test]
fn test_results_tracking() {
    let mut results = TestResults::new();
    assert_eq!(results.total, 0);
    assert_eq!(results.passed, 0);
    assert_eq!(results.failed, 0);
    assert!(results.all_passed());
    
    results.add_test("test1", true);
    results.add_test("test2", false);
    
    assert_eq!(results.total, 2);
    assert_eq!(results.passed, 1);
    assert_eq!(results.failed, 1);
    assert!(!results.all_passed());
    assert_eq!(results.success_rate(), 50.0);
}

#[test]
fn test_categories() {
    assert_eq!(TestCategory::Unit.as_str(), "unit");
    assert_eq!(TestCategory::Integration.as_str(), "integration");
    assert_eq!(TestCategory::Performance.as_str(), "performance");
    assert_eq!(TestCategory::Stress.as_str(), "stress");
}

#[test]
fn test_multi_source_project() {
    let env = TestEnvironment::new().with_multi_source_project();
    assert!(env.project_path().join("src").join("main").join("java").join("MainApp.java").exists());
    assert!(env.project_path().join("src").join("test").join("java").join("ServiceTest.java").exists());
}