freeze: macro platform complete; default ON with profiles; env consolidation; docs + smokes\n\n- Profiles: --profile {lite|dev|ci|strict} (dev-like default for macros)\n- Macro paths: prefer NYASH_MACRO_PATHS (legacy envs deprecated with warnings)\n- Selfhost pre-expand: auto mode, PyVM-only, add smokes (array/map)\n- Docs: user-macros updated; new macro-profiles guide; AGENTS freeze note; CURRENT_TASK freeze\n- Compat: non-breaking; legacy envs print deprecation notices\n
This commit is contained in:
34
src/tests/macro_derive_test.rs
Normal file
34
src/tests/macro_derive_test.rs
Normal file
@ -0,0 +1,34 @@
|
||||
use nyash_rust::parser::NyashParser;
|
||||
|
||||
#[test]
|
||||
fn macro_derive_injects_equals_and_tostring() {
|
||||
// Enable macro engine and default derives
|
||||
std::env::set_var("NYASH_MACRO_ENABLE", "1");
|
||||
std::env::set_var("NYASH_MACRO_TRACE", "0");
|
||||
std::env::remove_var("NYASH_MACRO_DERIVE");
|
||||
|
||||
let code = r#"
|
||||
box UserBox {
|
||||
name: StringBox
|
||||
age: IntegerBox
|
||||
}
|
||||
"#;
|
||||
let ast = NyashParser::parse_from_string(code).expect("parse ok");
|
||||
let ast2 = crate::r#macro::maybe_expand_and_dump(&ast, false);
|
||||
|
||||
// Find UserBox and check methods
|
||||
let mut found = false;
|
||||
if let nyash_rust::ASTNode::Program { statements, .. } = ast2 {
|
||||
for st in statements {
|
||||
if let nyash_rust::ASTNode::BoxDeclaration { name, methods, .. } = st {
|
||||
if name == "UserBox" {
|
||||
assert!(methods.contains_key("equals"), "equals method should be generated");
|
||||
assert!(methods.contains_key("toString"), "toString method should be generated");
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
assert!(found, "UserBox declaration not found after expansion");
|
||||
}
|
||||
|
||||
49
src/tests/macro_pattern_test.rs
Normal file
49
src/tests/macro_pattern_test.rs
Normal file
@ -0,0 +1,49 @@
|
||||
use nyash_rust::ast::{ASTNode, BinaryOperator, Span};
|
||||
use crate::r#macro::pattern::{TemplatePattern, AstBuilder, MacroPattern};
|
||||
use std::collections::HashMap;
|
||||
|
||||
#[test]
|
||||
fn template_pattern_matches_and_unquotes() {
|
||||
// Build a template: ($x + 1) == $y (Binary(Equal, Binary(Add, $x, 1), $y))
|
||||
let tpl = ASTNode::BinaryOp {
|
||||
operator: BinaryOperator::Equal,
|
||||
left: Box::new(ASTNode::BinaryOp {
|
||||
operator: BinaryOperator::Add,
|
||||
left: Box::new(ASTNode::Variable { name: "$x".into(), span: Span::unknown() }),
|
||||
right: Box::new(ASTNode::Literal { value: nyash_rust::ast::LiteralValue::Integer(1), span: Span::unknown() }),
|
||||
span: Span::unknown(),
|
||||
}),
|
||||
right: Box::new(ASTNode::Variable { name: "$y".into(), span: Span::unknown() }),
|
||||
span: Span::unknown(),
|
||||
};
|
||||
let pat = TemplatePattern::new(tpl);
|
||||
|
||||
// Target: (a + 1) == b
|
||||
let target = ASTNode::BinaryOp {
|
||||
operator: BinaryOperator::Equal,
|
||||
left: Box::new(ASTNode::BinaryOp {
|
||||
operator: BinaryOperator::Add,
|
||||
left: Box::new(ASTNode::Variable { name: "a".into(), span: Span::unknown() }),
|
||||
right: Box::new(ASTNode::Literal { value: nyash_rust::ast::LiteralValue::Integer(1), span: Span::unknown() }),
|
||||
span: Span::unknown(),
|
||||
}),
|
||||
right: Box::new(ASTNode::Variable { name: "b".into(), span: Span::unknown() }),
|
||||
span: Span::unknown(),
|
||||
};
|
||||
let binds = pat.match_ast(&target).expect("pattern match");
|
||||
assert!(binds.contains_key("x"));
|
||||
assert!(binds.contains_key("y"));
|
||||
|
||||
// Unquote a template: return $y
|
||||
let builder = AstBuilder::new();
|
||||
let tpl2 = ASTNode::Return { value: Some(Box::new(ASTNode::Variable { name: "$y".into(), span: Span::unknown() })), span: Span::unknown() };
|
||||
let out = builder.unquote(&tpl2, &binds);
|
||||
match out {
|
||||
ASTNode::Return { value: Some(v), .. } => match *v {
|
||||
ASTNode::Variable { name, .. } => assert_eq!(name, "b"),
|
||||
_ => panic!("expected variable"),
|
||||
}
|
||||
_ => panic!("expected return"),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user