extern crate micromark; use micromark::{ mdast::{List, ListItem, Node, Paragraph, Root, Text}, micromark, micromark_to_mdast, micromark_with_options, unist::Position, Constructs, Options, ParseOptions, }; use pretty_assertions::assert_eq; #[test] fn gfm_task_list_item() -> Result<(), String> { let gfm = Options { parse: ParseOptions { constructs: Constructs::gfm(), ..ParseOptions::default() }, ..Options::default() }; assert_eq!( micromark("* [x] y."), "", "should ignore task list item checks by default" ); assert_eq!( micromark_with_options("* [x] y.", &gfm)?, "", "should support task list item checks" ); assert_eq!( micromark_with_options("* [ ] z.", &gfm)?, "", "should support unchecked task list item checks" ); assert_eq!( micromark_with_options("*\n [x]", &gfm)?, "", "should not support laziness (1)" ); assert_eq!( micromark_with_options("*\n[x]", &gfm)?, "\n

[x]

", "should not support laziness (2)" ); assert_eq!( micromark_with_options( &r###" * [ ] foo * [x] bar - [x] foo - [ ] bar - [x] baz - [ ] bim + [ ] Unchecked? * [x] Checked? + [y] What is this even? - [n]: # [ ] After a definition + [ ] In a setext heading ======================= * In the… [ ] Second paragraph - [ ] With a tab + [X] With an upper case `x` * [ ] In a lazy line - [ ] With two spaces + [x] Two spaces indent * [x] Three spaces indent - [x] Four spaces indent + [x] Five spaces indent [ ] here? * > [ ] here? - [ ]No space? Empty? + [ ] Space after: + [ ]␠ * [ ]␠Text. Tab after: + [ ]␉ * [ ]␉Text. EOL after: + [ ] * [ ] Text. - [ ] after blank? + # [ ] ATX Heading > * [x] In a list in a block quote "### .replace('␠', " ") .replace('␉', "\t"), &gfm )?, r###"

[ ] here?

Empty?

Space after:

Tab after:

EOL after:

"###, "should handle things like GitHub" ); assert_eq!( micromark_to_mdast("* [x] a\n* [ ] b\n* c", &gfm.parse)?, Node::Root(Root { children: vec![Node::List(List { ordered: false, spread: false, start: None, children: vec![ Node::ListItem(ListItem { checked: Some(true), spread: false, children: vec![Node::Paragraph(Paragraph { children: vec![Node::Text(Text { value: "a".to_string(), position: Some(Position::new(1, 7, 6, 1, 8, 7)) }),], position: Some(Position::new(1, 7, 6, 1, 8, 7)) })], position: Some(Position::new(1, 1, 0, 1, 8, 7)) }), Node::ListItem(ListItem { checked: Some(false), spread: false, children: vec![Node::Paragraph(Paragraph { children: vec![Node::Text(Text { value: "b".to_string(), position: Some(Position::new(2, 7, 14, 2, 8, 15)) }),], position: Some(Position::new(2, 7, 14, 2, 8, 15)) })], position: Some(Position::new(2, 1, 8, 2, 8, 15)) }), Node::ListItem(ListItem { checked: None, spread: false, children: vec![Node::Paragraph(Paragraph { children: vec![Node::Text(Text { value: "c".to_string(), position: Some(Position::new(3, 3, 18, 3, 4, 19)) }),], position: Some(Position::new(3, 3, 18, 3, 4, 19)) })], position: Some(Position::new(3, 1, 16, 3, 4, 19)) }), ], position: Some(Position::new(1, 1, 0, 3, 4, 19)) })], position: Some(Position::new(1, 1, 0, 3, 4, 19)) }), "should support task list items as `checked` fields on `ListItem`s in mdast" ); Ok(()) }