#[test]
fn test_barrier_syncthreads_no_early_return() {
let content = "void kernel() {\n __syncthreads();\n}";
let analysis = analyze_cuda_barriers(content);
assert_eq!(analysis.barrier_safety.total_barriers, 1);
assert_eq!(analysis.barrier_safety.safe_barriers, 1);
assert!(analysis.barrier_safety.unsafe_barriers.is_empty());
assert!((analysis.barrier_safety.safety_score - 1.0).abs() < f64::EPSILON);
}
#[test]
fn test_barrier_syncwarp_no_early_return() {
let content = "void kernel() {\n __syncwarp();\n}";
let analysis = analyze_cuda_barriers(content);
assert_eq!(analysis.barrier_safety.total_barriers, 1);
assert_eq!(analysis.barrier_safety.safe_barriers, 1);
assert!(analysis.barrier_safety.unsafe_barriers.is_empty());
}
#[test]
fn test_barrier_bar_sync_no_early_return() {
let content = "void kernel() {\n bar.sync;\n}";
let analysis = analyze_cuda_barriers(content);
assert_eq!(analysis.barrier_safety.total_barriers, 1);
assert_eq!(analysis.barrier_safety.safe_barriers, 1);
}
#[test]
fn test_barrier_syncthreads_with_early_return_in_scope() {
let content = "void kernel() {\n if (tid > N) return;\n __syncthreads();\n}";
let analysis = analyze_cuda_barriers(content);
assert_eq!(analysis.barrier_safety.total_barriers, 1);
assert_eq!(analysis.barrier_safety.unsafe_barriers.len(), 1);
assert_eq!(analysis.barrier_safety.unsafe_barriers[0].barrier_type, "__syncthreads");
assert!(analysis.barrier_safety.unsafe_barriers[0].issue.contains("PARITY-114"));
}
#[test]
fn test_barrier_syncwarp_with_early_return_in_scope() {
let content = "void kernel() {\n return;\n __syncwarp();\n}";
let analysis = analyze_cuda_barriers(content);
assert_eq!(analysis.barrier_safety.total_barriers, 1);
assert_eq!(analysis.barrier_safety.unsafe_barriers.len(), 1);
assert_eq!(analysis.barrier_safety.unsafe_barriers[0].barrier_type, "__syncwarp");
}
#[test]
fn test_barrier_bar_sync_with_early_return_in_scope() {
let content = "void kernel() {\n return;\n bar.sync;\n}";
let analysis = analyze_cuda_barriers(content);
assert_eq!(analysis.barrier_safety.total_barriers, 1);
assert_eq!(analysis.barrier_safety.unsafe_barriers.len(), 1);
assert_eq!(analysis.barrier_safety.unsafe_barriers[0].barrier_type, "bar.sync");
}
#[test]
fn test_barrier_early_return_in_nested_scope_not_detected() {
let content = "void kernel() {\n {\n return;\n }\n __syncthreads();\n}";
let analysis = analyze_cuda_barriers(content);
assert_eq!(analysis.barrier_safety.total_barriers, 1);
assert_eq!(analysis.barrier_safety.safe_barriers, 1);
}
#[test]
fn test_barrier_early_exit_before_barrier() {
let content = "void kernel() {\n exit;\n __syncthreads();\n}";
let analysis = analyze_cuda_barriers(content);
assert_eq!(analysis.barrier_safety.total_barriers, 1);
}
#[test]
fn test_barrier_multiple_barriers_mixed_safety() {
let content = "void kernel() {\n __syncthreads();\n return;\n __syncwarp();\n}";
let analysis = analyze_cuda_barriers(content);
assert_eq!(analysis.barrier_safety.total_barriers, 2);
assert_eq!(analysis.barrier_safety.safe_barriers, 1);
assert_eq!(analysis.barrier_safety.unsafe_barriers.len(), 1);
assert_eq!(analysis.barrier_safety.unsafe_barriers[0].barrier_type, "__syncwarp");
}
#[test]
fn test_barrier_safety_score_partial() {
let content = "void kernel() {\n __syncthreads();\n return;\n __syncthreads();\n}";
let analysis = analyze_cuda_barriers(content);
assert_eq!(analysis.barrier_safety.total_barriers, 2);
assert!((analysis.barrier_safety.safety_score - 0.5).abs() < f64::EPSILON);
}
#[test]
fn test_barrier_no_barriers_zero_score() {
let content = "void kernel() {\n int x = 1;\n}";
let analysis = analyze_cuda_barriers(content);
assert_eq!(analysis.barrier_safety.total_barriers, 0);
assert_eq!(analysis.barrier_safety.safe_barriers, 0);
assert!((analysis.barrier_safety.safety_score - 0.0).abs() < f64::EPSILON);
}
#[test]
fn test_barrier_defect_added_for_unsafe_barrier() {
let content = "void kernel() {\n return;\n __syncthreads();\n}";
let analysis = analyze_cuda_barriers(content);
assert!(has_defect(&analysis, "PARITY-114"));
}
#[test]
fn test_barrier_no_defect_for_safe_barrier() {
let content = "void kernel() {\n __syncthreads();\n}";
let analysis = analyze_cuda_barriers(content);
assert!(!has_defect(&analysis, "PARITY-114"));
}
#[test]
fn test_barrier_return_with_value_before_barrier() {
let content = "void kernel() {\n return 0;\n __syncthreads();\n}";
let analysis = analyze_cuda_barriers(content);
assert_eq!(analysis.barrier_safety.unsafe_barriers.len(), 1);
}
#[test]
fn test_barrier_many_safe_barriers() {
let content = "void kernel() {\n __syncthreads();\n __syncwarp();\n bar.sync;\n}";
let analysis = analyze_cuda_barriers(content);
assert_eq!(analysis.barrier_safety.total_barriers, 3);
assert_eq!(analysis.barrier_safety.safe_barriers, 3);
assert!(analysis.barrier_safety.unsafe_barriers.is_empty());
assert!((analysis.barrier_safety.safety_score - 1.0).abs() < f64::EPSILON);
}