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.rs26
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() {