//! Parse a Foam file into a major structure. use pest_derive::Parser; #[derive(Parser)] #[grammar = "foam.pest"] struct FoamParser; pub enum Foam { Attribution { name: String, value: String }, } #[cfg(test)] mod parser { use super::*; use pest::Parser; #[test] fn multi_comment() { let parse = FoamParser::parse(Rule::multi_comment, "/* this is comment */"); assert!(parse.is_ok()); } #[test] fn definition() { let parse = FoamParser::parse(Rule::definition, "foamFile"); assert!(parse.is_ok(), "{:#?}", parse); let parse = FoamParser::parse(Rule::definition, "div(phi,U)"); assert!(parse.is_ok(), "{:#?}", parse); let parse = FoamParser::parse(Rule::definition, "div((nuEff*dev2(T(grad(U)))))"); assert!(parse.is_ok(), "{:#?}", parse); let parse = FoamParser::parse(Rule::definition, "FoamFile"); assert!(parse.is_ok(), "{:#?}", parse); let parse = FoamParser::parse(Rule::definition, "foam_file"); assert!(parse.is_ok()); } #[test] fn attribution() { let parse = FoamParser::parse(Rule::attribution, "version 2.0;"); assert!(parse.is_ok(), "{:#?}", parse); let parse = FoamParser::parse(Rule::attribution, "div(U) Gauss linear;"); assert!(parse.is_ok(), "{:#?}", parse); } #[test] fn broken_multi() { let parse = FoamParser::parse(Rule::multi_comment, "/* bad comment"); assert!(parse.is_err()); } #[test] fn single_comment() { let parse = FoamParser::parse(Rule::single_comment, "// this is comment"); assert!(parse.is_ok()); } #[test] fn broken_identifer() { let parse = FoamParser::parse(Rule::value, "123"); assert!(parse.is_err(), "{:#?}", parse); let parse = FoamParser::parse(Rule::value, "asd "); assert!(parse.is_ok(), "{:?}", parse); } // #[test] // fn attribution() { // let parse = FoamParser::parse(Rule::attribution, "version 2.0;"); // assert!(parse.is_ok(), "{:?}", parse); // } // #[test] // fn broken_attribution() { // let parse = FoamParser::parse(Rule::attribution, "version 2.0"); // assert!(parse.is_err(), "{:?}", parse); // } // #[test] // fn dictionary() { // let text = "FoamFile\n{\nversion 2.0;\nformat ascii;\nclass dictionary;\nlocation system;\nobject caseSetupDict;\n}"; // let parse = FoamParser::parse(Rule::dictionary, text); // assert!(parse.is_ok(), "{:#?}", parse); // } // #[test] // fn dict_in_dict() { // let text = "dict1 { dict2 { class bad; } }"; // let parse = FoamParser::parse(Rule::dictionary, text); // assert!(parse.is_ok(), "{:#?}", parse); // } // #[test] // fn list() { // let text = "list_name ( 1 2 3 );"; // let parse = FoamParser::parse(Rule::list, text); // assert!(parse.is_ok(), "{:#?}", parse); // } // #[test] // fn sized_list() { // let text = "list_name 3 ( 1 2 3 );"; // let parse = FoamParser::parse(Rule::list, text); // assert!(parse.is_ok(), "{:#?}", parse); // } } // #[cfg(test)] // mod file { // use super::*; // use pest::Parser; // #[test] // fn chained_comments() { // let text = "/* this is one comment */\n// And this is another"; // let parse = FoamParser::parse(Rule::file, text); // assert!(parse.is_ok(), "{:?}", parse); // } // #[test] // fn attribution_with_comment() { // let text = "version 2.0; // this is good"; // let parse = FoamParser::parse(Rule::file, text); // assert!(parse.is_ok(), "{:?}", parse); // } // #[test] // fn mid_comment() { // let text = "version /* this is comment */ 2.0;"; // let parse = FoamParser::parse(Rule::file, text); // assert!(parse.is_ok(), "{:?}", parse); // } // #[test] // fn complex() { // let text = "/* this is file */\nList ( 1\n2 // this is ok\n 3);"; // let parse = FoamParser::parse(Rule::file, text); // assert!(parse.is_ok(), "{:?}", parse); // } // // Note: the following files were retrieved from OpenFoam examples: // // https://develop.openfoam.com/Development/openfoam/-/tree/develop/tutorials/incompressible/pimpleFoam/RAS/rotatingFanInRoom/system // #[test] // fn control_dict() { // let text = include_bytes!("../resources/controlDict"); // let parse = FoamParser::parse(Rule::file, &std::str::from_utf8(text).unwrap()); // assert!(parse.is_ok(), "{:?}", parse); // } // #[test] // fn block_mesh_dict() { // let text = include_bytes!("../resources/blockMeshDict"); // let parse = FoamParser::parse(Rule::file, &std::str::from_utf8(text).unwrap()); // assert!(parse.is_ok(), "{:?}", parse); // } // // #[test] // // fn create_patch_dict() { // // let text = include_bytes!("../resources/createPatchDict"); // // let parse = FoamParser::parse(Rule::file, &std::str::from_utf8(text).unwrap()); // // assert!(parse.is_ok(), "{:?}", parse); // // } // #[test] // fn fv_scheme() { // let text = include_bytes!("../resources/fvSchemes"); // let parse = FoamParser::parse(Rule::file, &std::str::from_utf8(text).unwrap()); // assert!(parse.is_ok(), "{:?}", parse); // } // }