#[cfg(test)]
mod category_tests {
use crate::falsification::FalsificationRegistry;
use crate::parser::Parser;
#[test]
fn test_full_evaluation_pipeline() {
let ptx = r#"
.version 8.0
.target sm_70
.address_size 64
.entry lz4_compress(
.param .u64 param0,
.param .u64 param1,
.param .u32 param2
)
{
.reg .u32 %r<32>;
.reg .u64 %rd<16>;
.reg .pred %p<8>;
// Initialize
mov.u32 %r0, 0;
mov.u64 %rd0, 0;
// Load parameters
ld.param.u64 %rd1, [param0];
ld.param.u64 %rd2, [param1];
ld.param.u32 %r1, [param2];
// Simple computation
add.u32 %r2, %r0, %r1;
setp.eq.u32 %p0, %r2, 0;
@%p0 bra exit_label;
// Some work
mul.lo.u32 %r3, %r2, 4;
exit_label:
ret;
}
"#;
let mut parser = Parser::new(ptx).expect("parser creation should succeed");
let module = parser.parse().expect("parsing should succeed");
let registry = FalsificationRegistry::new();
let report = registry.evaluate(&module);
assert!(!report.results.is_empty());
assert!(report.total_points > 0);
assert!(report.score >= 0.0 && report.score <= 100.0);
assert!(report.confidence >= 0.0 && report.confidence <= 1.0);
println!("Falsification Score: {:.1}/100", report.score);
println!("Confidence: {:.1}%", report.confidence * 100.0);
println!("Earned: {}/{}", report.earned_points, report.total_points);
let failed = report.failed_tests();
if !failed.is_empty() {
println!("Failed tests:");
for (id, cat, desc, result) in failed {
if let crate::falsification::TestResult::Fail { evidence, .. } = result {
println!(" {} ({:?}): {} - {}", id, cat, desc, evidence);
}
}
}
}
#[test]
fn test_loaded_value_bug_detection() {
let buggy_ptx = r#"
.version 8.0
.target sm_70
.address_size 64
.entry buggy_kernel()
{
.reg .u32 %r<10>;
// Load from shared memory
ld.shared.u32 %r0, [%r1];
// Store the loaded value - THIS IS THE BUG PATTERN
st.shared.u32 [%r2], %r0;
ret;
}
"#;
let mut parser = Parser::new(buggy_ptx).expect("parser creation should succeed");
let module = parser.parse().expect("parsing should succeed");
let registry = FalsificationRegistry::new();
let report = registry.evaluate(&module);
let f081_result = report
.results
.iter()
.find(|(id, _, _, _)| id == "F081")
.map(|(_, _, _, r)| r);
assert!(f081_result.is_some(), "F081 test should exist");
}
#[test]
fn test_barrier_safety() {
let good_ptx = r#"
.version 8.0
.target sm_70
.address_size 64
.entry good_kernel()
{
.reg .u32 %r<10>;
// Write to shared
st.shared.u32 [%r0], %r1;
// Synchronize
bar.sync 0;
// Read from shared
ld.shared.u32 %r2, [%r3];
ret;
}
"#;
let mut parser = Parser::new(good_ptx).expect("parser creation should succeed");
let module = parser.parse().expect("parsing should succeed");
let registry = FalsificationRegistry::new();
let report = registry.evaluate(&module);
let f036_result = report
.results
.iter()
.find(|(id, _, _, _)| id == "F036")
.map(|(_, _, _, r)| r);
assert!(f036_result.is_some(), "F036 test should exist");
}
#[test]
fn test_category_coverage() {
let ptx = r#"
.version 8.0
.target sm_70
.address_size 64
.entry test()
{
ret;
}
"#;
let mut parser = Parser::new(ptx).expect("parser creation should succeed");
let module = parser.parse().expect("parsing should succeed");
let registry = FalsificationRegistry::new();
let report = registry.evaluate(&module);
let categories: std::collections::HashSet<_> =
report.results.iter().map(|(_, cat, _, _)| *cat).collect();
assert!(
categories.len() >= 8,
"Should have tests in at least 8 categories"
);
}
}