1use lalrpop_util::lalrpop_mod;
2
3lalrpop_mod!(pub midl);
4
5pub mod codegen;
6pub mod parser;
7
8#[cfg(feature = "cargo")]
9pub mod cargo;
10
11#[cfg(test)]
12mod tests {
13 use crate::midl;
14
15 #[test]
16 fn import_include() {
17 midl::ImportParser::new()
18 .parse("import \"iunknown.idl\"")
19 .unwrap();
20 midl::IncludeParser::new()
21 .parse("include \"iunknown.idl\", \"blah.idl\", \"file with spaces.idl\"")
22 .unwrap();
23 assert!(midl::ImportParser::new()
24 .parse("import \"unfinished")
25 .is_err());
26 }
27
28 #[test]
29 fn ctype() {
30 midl::CtypeParser::new().parse("int").unwrap();
31 midl::CtypeParser::new().parse("int *").unwrap();
32 midl::CtypeParser::new().parse("int ***").unwrap();
33 midl::CtypeParser::new()
34 .parse("const int *const *")
35 .unwrap();
36 midl::CtypeParser::new()
37 .parse("int **const *const **")
38 .unwrap();
39 assert!(midl::CtypeParser::new().parse("const int const").is_err());
40 assert!(midl::CtypeParser::new()
41 .parse("int const * const const")
42 .is_err());
43 }
44
45 #[test]
46 fn function() {
47 midl::FnArgParser::new().parse("int x").unwrap();
48 midl::FnArgParser::new().parse("int y").unwrap();
49 midl::FunctionParser::new().parse("int AddRef()").unwrap();
50 midl::FunctionParser::new()
51 .parse("[ptr] void *QueryInterface([in] const IID *itf_type)")
52 .unwrap();
53 }
54
55 #[test]
56 fn interface() {
57 midl::InterfaceParser::new()
58 .parse("[object] interface IUnknown {}")
59 .unwrap();
60 }
61
62 #[test]
63 fn it_works() {
64 let res = midl::FileParser::new().parse(include_str!("test.idl"));
65
66 match res {
67 Err(e) => {
68 println!("{}", e);
69 panic!();
70 }
71 Ok(v) => {
72 println!("{:?}", v);
73 }
74 }
75 }
76}