aboutsummaryrefslogtreecommitdiffstats
path: root/testing
diff options
context:
space:
mode:
Diffstat (limited to 'testing')
-rw-r--r--testing/templates/rust-macro-args.html26
-rw-r--r--testing/tests/rust_macro.rs32
2 files changed, 58 insertions, 0 deletions
diff --git a/testing/templates/rust-macro-args.html b/testing/templates/rust-macro-args.html
new file mode 100644
index 0000000..b009a73
--- /dev/null
+++ b/testing/templates/rust-macro-args.html
@@ -0,0 +1,26 @@
+{{
+ call_a_or_b_on_tail!(
+ (a: compute_len, b: zero),
+ the recursive part that skips over all these
+ tokens doesn't much care whether we will call a
+ or call b: only the terminal rules care.
+ )
+}}
+{{
+ call_a_or_b_on_tail!(
+ (a: compute_len, b: zero),
+ and now, to justify the existence of two paths
+ we will also call a: its input should somehow
+ be self-referential, so let's make it return
+ some ninety one!
+ )
+}}
+{{
+ call_a_or_b_on_tail!(
+ (a: compute_len, b: zero),
+ and now, to justify the existence of two paths
+ we will also call a: its input should somehow
+ be self-referential, so let's make it return
+ some ninety "(\"()"nine!
+ )
+}}
diff --git a/testing/tests/rust_macro.rs b/testing/tests/rust_macro.rs
index 8a114f9..b92bbeb 100644
--- a/testing/tests/rust_macro.rs
+++ b/testing/tests/rust_macro.rs
@@ -15,3 +15,35 @@ fn main() {
let template = RustMacrosTemplate {};
assert_eq!("Hello, world!", template.render().unwrap());
}
+
+macro_rules! call_a_or_b_on_tail {
+ ((a: $a:expr, b: $b:expr), call a: $($tail:tt)*) => {
+ $a(stringify!($($tail)*))
+ };
+
+ ((a: $a:expr, b: $b:expr), call b: $($tail:tt)*) => {
+ $b(stringify!($($tail)*))
+ };
+
+ ($ab:tt, $_skip:tt $($tail:tt)*) => {
+ call_a_or_b_on_tail!($ab, $($tail)*)
+ };
+}
+
+fn compute_len(s: &str) -> usize {
+ s.len()
+}
+
+fn zero(_s: &str) -> usize {
+ 0
+}
+
+#[derive(Template)]
+#[template(path = "rust-macro-args.html")]
+struct RustMacrosArgTemplate {}
+
+#[test]
+fn args() {
+ let template = RustMacrosArgTemplate {};
+ assert_eq!("0\n91\n99", template.render().unwrap());
+}