use crate::tests::prelude::*;
track_file!("docs/modules/blocks/pages/open-blocks.adoc");
non_normative!(
r#"
= Open Blocks
"#
);
#[test]
fn open_block_is_a_generic_container() {
verifies!(
r#"
The most versatile block of all is the open block.
It allows you to apply block attributes to a chunk of text without giving it any other semantics.
In other words, it provides a generic structural container for enclosing content.
The only notable limitation is that an open block cannot be nested inside of another open block.
"#
);
let doc = Parser::default().parse("--\nGeneric content.\n--");
assert_css(&doc, "div.openblock > div.content", 1);
assert_css(&doc, "div.openblock > div.content > div.paragraph", 1);
let open = doc.nested_blocks().next().unwrap();
assert_eq!(open.raw_context().as_ref(), "open");
assert_eq!(open.resolved_context().as_ref(), "open");
let doc = Parser::default().parse("--\nouter\n--\n\ninner\n\n--\nafter\n--");
assert_css(&doc, "div.openblock", 2);
assert_css(&doc, "div.openblock div.openblock", 0);
}
#[test]
fn open_block_syntax() {
non_normative!(
r#"
== Open block syntax
.Open block syntax
[#ex-open]
----
include::example$open.adoc[tag=base]
----
The result of <<ex-open>> is displayed below.
include::example$open.adoc[tag=base]
"#
);
let doc = Parser::default().parse(
"--\nAn open block can be an anonymous container,\nor it can masquerade as any other block.\n--",
);
assert_css(&doc, ".openblock", 1);
assert_css(&doc, "div.openblock > div.content", 1);
assert_css(&doc, "div.openblock > div.content > div.paragraph > p", 1);
assert_xpath(
&doc,
"//div[@class=\"openblock\"]/div[@class=\"content\"]/div[@class=\"paragraph\"]/p[contains(text(), \"anonymous container\")]",
1,
);
}
#[test]
fn open_block_masquerading_as_a_sidebar() {
verifies!(
r#"
An open block can act as any other paragraph or delimited block, with the exception of _pass_ and _table_.
For instance, in <<ex-open-sidebar>> an open block is acting as a sidebar.
"#
);
verifies!(
r#"
.Open block masquerading as a sidebar
[#ex-open-sidebar]
----
include::example$open.adoc[tag=sb]
----
The result of <<ex-open-sidebar>> is displayed below.
include::example$open.adoc[tag=sb]
"#
);
let doc = Parser::default().parse(
"[sidebar]\n.Related information\n--\nThis is aside text.\n\nIt is used to present information related to the main content.\n--",
);
assert_css(&doc, ".openblock", 0);
assert_css(&doc, "div.sidebarblock > div.content", 1);
assert_xpath(
&doc,
"//div[@class=\"sidebarblock\"]/div[@class=\"content\"]/div[@class=\"title\"][text()=\"Related information\"]",
1,
);
assert_css(&doc, "div.sidebarblock > div.content > div.paragraph", 2);
let block = doc.nested_blocks().next().unwrap();
assert_eq!(block.raw_context().as_ref(), "open");
assert_eq!(block.resolved_context().as_ref(), "sidebar");
}
#[test]
fn open_block_masquerading_as_a_source_block() {
verifies!(
r#"
<<ex-open-source>> is an open block acting as a source block.
"#
);
verifies!(
r#"
.Open block masquerading as a source block
[#ex-open-source]
----
include::example$open.adoc[tag=src]
----
The result of <<ex-open-source>> is displayed below.
include::example$open.adoc[tag=src]
"#
);
let doc = Parser::default().parse("[source]\n--\nputs \"I'm a source block!\"\n--");
assert_css(&doc, ".openblock", 0);
assert_css(&doc, "div.listingblock", 1);
assert_xpath(
&doc,
"//div[@class=\"listingblock\"]//pre/code[contains(text(), \"I'm a source block!\")]",
1,
);
let block = doc.nested_blocks().next().unwrap();
assert_eq!(block.content_model(), ContentModel::Verbatim);
}
#[test]
fn open_block_carries_id_and_roles() {
let doc = Parser::default().parse(".My open block\n[#myid.myrole]\n--\nbody.\n--");
assert_xpath(&doc, "//div[@id=\"myid\"]", 1);
assert_css(&doc, "div.openblock.myrole", 1);
assert_xpath(
&doc,
"//div[@class=\"openblock myrole\"]/div[@class=\"title\"][text()=\"My open block\"]",
1,
);
assert_css(&doc, "div.openblock > div.title + div.content", 1);
}
#[test]
fn open_block_masquerading_as_a_listing_or_literal_block() {
let doc = Parser::default().parse("[listing]\n--\nlisting body\n--");
assert_css(&doc, ".openblock", 0);
assert_css(&doc, "div.listingblock > pre", 1);
assert_eq!(
doc.nested_blocks().next().unwrap().content_model(),
ContentModel::Verbatim
);
let doc = Parser::default().parse("[literal]\n--\nliteral body\n--");
assert_css(&doc, ".openblock", 0);
assert_css(&doc, "div.literalblock > pre", 1);
assert_eq!(
doc.nested_blocks().next().unwrap().content_model(),
ContentModel::Verbatim
);
}
#[test]
fn open_block_masquerading_as_a_quote_or_verse_block() {
let doc = Parser::default().parse("[quote,Author]\n--\nQuoted open block.\n--");
assert_css(&doc, ".openblock", 0);
assert_css(&doc, "div.quoteblock > blockquote", 1);
let doc = Parser::default().parse("[verse]\n--\nverse line\n--");
assert_css(&doc, ".openblock", 0);
assert_css(&doc, "div.verseblock > pre.content", 1);
}
#[test]
fn masquerade_style_only_applies_to_an_open_block() {
let doc = Parser::default().parse("[quote]\n====\nx\n====");
assert_css(&doc, "div.exampleblock", 1);
assert_css(&doc, "div.quoteblock", 0);
}