#![cfg_attr(coverage_nightly, coverage(off))]
use crate::models::unified_ast::AstDag;
use anyhow::Result;
pub struct WatParser {
max_file_size: usize,
}
impl WatParser {
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn new() -> Self {
Self {
max_file_size: 10 * 1024 * 1024, }
}
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn parse(&mut self, content: &str) -> Result<AstDag> {
if content.len() > self.max_file_size {
return Err(anyhow::anyhow!(
"Content too large: {} bytes",
content.len()
));
}
if !content.trim_start().starts_with('(') {
return Err(anyhow::anyhow!("Invalid WAT format: must start with '('"));
}
let dag = AstDag::new();
Ok(dag)
}
}
impl Default for WatParser {
fn default() -> Self {
Self::new()
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_wat_parser_new() {
let parser = WatParser::new();
assert_eq!(parser.max_file_size, 10 * 1024 * 1024);
}
#[test]
fn test_wat_parser_default() {
let parser = WatParser::default();
assert_eq!(parser.max_file_size, 10 * 1024 * 1024);
}
#[test]
fn test_wat_parser() {
let mut parser = WatParser::new();
let content = "(module (func $test (result i32) i32.const 42))";
let result = parser.parse(content);
assert!(result.is_ok());
}
#[test]
fn test_wat_parser_invalid() {
let mut parser = WatParser::new();
let content = "invalid wat content";
let result = parser.parse(content);
assert!(result.is_err());
}
#[test]
fn test_wat_parser_empty() {
let mut parser = WatParser::new();
let content = "";
let result = parser.parse(content);
assert!(result.is_err());
}
#[test]
fn test_wat_parser_whitespace_before_paren() {
let mut parser = WatParser::new();
let content = " (module)";
let result = parser.parse(content);
assert!(result.is_ok());
}
#[test]
fn test_wat_parser_simple_module() {
let mut parser = WatParser::new();
let content = "(module)";
let result = parser.parse(content);
assert!(result.is_ok());
}
#[test]
fn test_wat_parser_error_message_format() {
let mut parser = WatParser::new();
let content = "not valid";
let result = parser.parse(content);
assert!(result.is_err());
match result {
Err(err) => assert!(err.to_string().contains("must start with")),
Ok(_) => panic!("Expected error"),
}
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod property_tests {
use proptest::prelude::*;
proptest! {
#[test]
fn basic_property_stability(_input in ".*") {
prop_assert!(true);
}
#[test]
fn module_consistency_check(_x in 0u32..1000) {
prop_assert!(_x < 1001);
}
}
}