Skip to content

Commit 9b03043

Browse files
committed
expression: add some unit tests
1 parent ad85f92 commit 9b03043

File tree

1 file changed

+65
-1
lines changed

1 file changed

+65
-1
lines changed

src/expression/mod.rs

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,12 @@ where
307307

308308
#[cfg(test)]
309309
mod tests {
310-
use super::parse_num;
310+
use super::*;
311+
312+
/// Test functions to manually build trees
313+
fn leaf(name: &str) -> Tree { Tree { name, args: vec![] } }
314+
315+
fn paren_node<'a>(name: &'a str, args: Vec<Tree<'a>>) -> Tree<'a> { Tree { name, args } }
311316

312317
#[test]
313318
fn test_parse_num() {
@@ -327,4 +332,63 @@ mod tests {
327332
}
328333
assert_eq!(valid_chars, super::VALID_CHARS);
329334
}
335+
336+
#[test]
337+
fn parse_tree_basic() {
338+
assert_eq!(Tree::from_str("thresh").unwrap(), leaf("thresh"));
339+
340+
assert!(matches!(Tree::from_str("thresh,"), Err(Error::Unexpected(s)) if s == ","));
341+
342+
assert!(matches!(
343+
Tree::from_str("thresh,thresh"),
344+
Err(Error::Unexpected(s)) if s == ",thresh",
345+
));
346+
347+
assert!(matches!(
348+
Tree::from_str("thresh()thresh()"),
349+
Err(Error::Unexpected(s)) if s == "thresh()",
350+
));
351+
352+
assert_eq!(Tree::from_str("thresh()").unwrap(), paren_node("thresh", vec![leaf("")]));
353+
354+
// FIXME even for our current crappy error handling, this one is pretty bad
355+
assert!(matches!(Tree::from_str("thresh(a()b)"), Err(Error::ExpectedChar(')'))));
356+
357+
assert!(matches!(Tree::from_str("thresh()xyz"), Err(Error::Unexpected(s)) if s == "xyz"));
358+
}
359+
360+
#[test]
361+
fn parse_tree_parens() {
362+
assert!(matches!(Tree::from_str("a("), Err(Error::ExpectedChar(')'))));
363+
364+
assert!(matches!(Tree::from_str(")"), Err(Error::Unexpected(s)) if s == ")"));
365+
366+
assert!(matches!(Tree::from_str("x(y))"), Err(Error::Unexpected(s)) if s == ")"));
367+
368+
// In next commit will add tests related to {}s; currently we ignore
369+
// these except in Taproot mode.
370+
}
371+
372+
#[test]
373+
fn parse_tree_desc() {
374+
let keys = [
375+
"02c2fd50ceae468857bb7eb32ae9cd4083e6c7e42fbbec179d81134b3e3830586c",
376+
"0257f4a2816338436cccabc43aa724cf6e69e43e84c3c8a305212761389dd73a8a",
377+
];
378+
let desc = format!("wsh(t:or_c(pk({}),v:pkh({})))", keys[0], keys[1]);
379+
380+
assert_eq!(
381+
Tree::from_str(&desc).unwrap(),
382+
paren_node(
383+
"wsh",
384+
vec![paren_node(
385+
"t:or_c",
386+
vec![
387+
paren_node("pk", vec![leaf(keys[0])]),
388+
paren_node("v:pkh", vec![leaf(keys[1])]),
389+
]
390+
)]
391+
),
392+
);
393+
}
330394
}

0 commit comments

Comments
 (0)