Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/cfg/src/tests.rs')
| -rw-r--r-- | crates/cfg/src/tests.rs | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/crates/cfg/src/tests.rs b/crates/cfg/src/tests.rs index 62fb429a63..8eca907d8b 100644 --- a/crates/cfg/src/tests.rs +++ b/crates/cfg/src/tests.rs @@ -1,7 +1,10 @@ use arbitrary::{Arbitrary, Unstructured}; use expect_test::{expect, Expect}; use mbe::{syntax_node_to_token_tree, DummyTestSpanMap, DUMMY}; -use syntax::{ast, AstNode}; +use syntax::{ + ast::{self, Attr}, + AstNode, SourceFile, +}; use crate::{CfgAtom, CfgExpr, CfgOptions, DnfExpr}; @@ -12,6 +15,22 @@ fn assert_parse_result(input: &str, expected: CfgExpr) { let cfg = CfgExpr::parse(&tt); assert_eq!(cfg, expected); } +fn check_dnf_from_syntax(input: &str, expect: Expect) { + let parse = SourceFile::parse(input); + let node = match parse.tree().syntax().descendants().find_map(Attr::cast) { + Some(it) => it, + None => { + let node = std::any::type_name::<Attr>(); + panic!("Failed to make ast node `{node}` from text {input}") + } + }; + let node = node.clone_subtree(); + assert_eq!(node.syntax().text_range().start(), 0.into()); + + let cfg = CfgExpr::parse_from_attr_meta(node.meta().unwrap()).unwrap(); + let actual = format!("#![cfg({})]", DnfExpr::new(cfg)); + expect.assert_eq(&actual); +} fn check_dnf(input: &str, expect: Expect) { let source_file = ast::SourceFile::parse(input).ok().unwrap(); @@ -86,6 +105,11 @@ fn smoke() { check_dnf("#![cfg(not(a))]", expect![[r#"#![cfg(not(a))]"#]]); } +#[test] +fn cfg_from_attr() { + check_dnf_from_syntax(r#"#[cfg(test)]"#, expect![[r#"#![cfg(test)]"#]]); + check_dnf_from_syntax(r#"#[cfg(not(never))]"#, expect![[r#"#![cfg(not(never))]"#]]); +} #[test] fn distribute() { |