+ AssertNotEqual SyntaxOf('a')[0:2], 'tex'
+ AssertEqual SyntaxOf('b')[0:2], 'tex'
+ AssertNotEqual SyntaxOf('c')[0:2], 'tex'
+
+Given markdown;
+$ \sqrt{a}{b} $
+$$ \frac{a}{b} $$
+
+Execute (math tex highlighting):
+ let g:vim_markdown_math=0
+ syn off | syn on
+ AssertNotEqual SyntaxOf('sqrt')[0:2], 'tex'
+ AssertNotEqual SyntaxOf('frac')[0:2], 'tex'
+ let g:vim_markdown_math=1
+ syn off | syn on
+ AssertEqual SyntaxOf('sqrt')[0:2], 'tex'
+ AssertEqual SyntaxOf('frac')[0:2], 'tex'
+
+Given markdown;
+$a b[$ c
+
+Execute (math ends with $):
+ let g:vim_markdown_math=1
+ syn off | syn on
+ AssertEqual SyntaxOf('a')[0:2], 'tex'
+ AssertEqual SyntaxOf('b')[0:2], 'tex'
+ AssertNotEqual SyntaxOf('c')[0:2], 'tex'
+
+Given markdown;
+$$a b[$$ c
+
+Execute (math ends with $$):
+ let g:vim_markdown_math=1
+ syn off | syn on
+ AssertEqual SyntaxOf('a')[0:2], 'tex'
+ AssertEqual SyntaxOf('b')[0:2], 'tex'
+ AssertNotEqual SyntaxOf('c')[0:2], 'tex'
+
+Given markdown;
+$(0 \leq 1)$
+
+Execute (math conceal in $):
+ if has('conceal')
+ setlocal conceallevel=2
+ let g:vim_markdown_math=1
+ syn off | syn on
+ AssertEqual synconcealed(1, 1)[0], 1, '$'
+ AssertEqual synconcealed(1, 2)[0], 0
+ AssertEqual synconcealed(1, 3)[0], 0
+ AssertEqual synconcealed(1, 4)[0], 0
+ AssertEqual synconcealed(1, 5)[0], 1, '\leq'
+ AssertEqual synconcealed(1, 6)[0], 1
+ AssertEqual synconcealed(1, 7)[0], 1
+ AssertEqual synconcealed(1, 8)[0], 1
+ AssertEqual synconcealed(1, 9)[0], 0
+ AssertEqual synconcealed(1, 10)[0], 0
+ AssertEqual synconcealed(1, 11)[0], 0
+ AssertEqual synconcealed(1, 12)[0], 1, '$'
+ setlocal conceallevel=0
+ endif
+
+Given markdown;
+$$
+\omega
+0 \leq 1
+$$
+
+Execute (math conceal in $$):
+ if has('conceal')
+ setlocal conceallevel=2
+ let g:vim_markdown_math=1
+ syn off | syn on
+ AssertEqual synconcealed(1, 1)[0], 1, '$$'
+ AssertEqual synconcealed(2, 1)[0], 1, '\omega'
+ AssertEqual synconcealed(3, 1)[0], 0, '0'
+ AssertEqual synconcealed(3, 3)[0], 1, '\leq'
+ AssertEqual synconcealed(3, 8)[0], 0, '1'
+ AssertEqual synconcealed(4, 1)[0], 1, '$$'
+ setlocal conceallevel=0
+ endif
+
+# YAML frontmatter
+
+Given markdown;
+---
+a: b
+---
+
+Execute (YAML frontmatter is controlled by the option):
+ AssertNotEqual SyntaxOf('a')[0:3], 'yaml'
+ let g:vim_markdown_frontmatter=1
+ syn off | syn on
+ AssertEqual SyntaxOf('a')[0:3], 'yaml'
+ let g:vim_markdown_frontmatter=0
+ syn off | syn on
+ AssertNotEqual SyntaxOf('a')[0:3], 'yaml'
+
+Given markdown;
+
+---
+a: b
+---
+
+Execute (YAML frontmatter only works if it's the first thing in the file):
+ let g:vim_markdown_frontmatter=1
+ syn off | syn on
+ AssertNotEqual SyntaxOf('a')[0:3], 'yaml'
+
+Given markdown;
+---
+a: b
+---
+
+---
+
+Execute (rules are not mistaken by YAML frontmatter delimiters):
+ let g:vim_markdown_frontmatter=1
+ syn off | syn on
+ AssertEqual SyntaxAt(5, 1), 'mkdRule'
+ unlet g:vim_markdown_frontmatter
+
+# TOML frontmatter
+
+Given markdown;
++++
+a = "b"
++++
+
+Execute (TOML frontmatter is controlled by the option):
+ syn off | syn on
+ AssertNotEqual SyntaxOf('b'), 'tomlString'
+ let g:vim_markdown_toml_frontmatter=1
+ syn off | syn on
+ AssertEqual SyntaxOf('b'), 'tomlString'
+ let g:vim_markdown_toml_frontmatter=0
+ syn off | syn on
+ AssertNotEqual SyntaxOf('b'), 'tomlString'
+
+Given markdown;
+
++++
+a = "b"
++++
+
+Execute (TOML frontmatter only works if it's the first thing in the file):
+ let g:vim_markdown_toml_frontmatter=1
+ syn off | syn on
+ AssertNotEqual SyntaxOf('b'), 'tomlString'
+ unlet g:vim_markdown_toml_frontmatter
+
+# JSON frontmatter
+
+Given markdown;
+{
+ "a": "b"
+}
+
+Execute (JSON frontmatter is controlled by the option):
+ syn off | syn on
+ AssertNotEqual SyntaxOf('a'), 'jsonKeyword'
+ let g:vim_markdown_json_frontmatter=1
+ syn off | syn on
+ AssertEqual SyntaxOf('a'), 'jsonKeyword'
+ let g:vim_markdown_json_frontmatter=0
+ syn off | syn on
+ AssertNotEqual SyntaxOf('a'), 'jsonKeyword'
+
+Given markdown;
+
+{
+ "a": "b"
+}
+
+Execute (JSON frontmatter only works if it's the first thing in the file):
+ let g:vim_markdown_json_frontmatter=1
+ syn off | syn on
+ AssertNotEqual SyntaxOf('a'), 'jsonKeyword'
+ unlet g:vim_markdown_json_frontmatter
+
+# Header
+
+Given markdown;
+# #a
+ccc
+
+## #b
+ddd
+
+Execute (header title starts with #):
+ AssertEqual SyntaxOf('a'), 'htmlH1'
+ AssertEqual SyntaxOf('b'), 'htmlH2'
+
+Given markdown;
+# h1 space
+
+#h1 nospace
+
+# h1 2 spaces
+
+# h1 trailing hash #
+
+## h2 space
+
+##h2 nospace
+
+## h2 trailing hash ##
+
+### h3 space
+
+###h3 nospace
+
+### h3 trailing hash ###
+
+#### h4
+
+##### h5
+
+###### h6
+
+Execute (atx headers):
+ AssertEqual SyntaxOf(' h1 space'), 'htmlH1'
+ AssertEqual SyntaxOf('h1 nospace'), 'htmlH1'
+ AssertEqual SyntaxOf(' h1 2 spaces'), 'htmlH1'
+ AssertEqual SyntaxOf(' h1 trailing hash '), 'htmlH1'
+ AssertEqual SyntaxOf(' h2 space'), 'htmlH2'
+ AssertEqual SyntaxOf('h2 nospace'), 'htmlH2'
+ AssertEqual SyntaxOf(' h2 trailing hash '), 'htmlH2'
+ AssertEqual SyntaxOf(' h3 space'), 'htmlH3'
+ AssertEqual SyntaxOf('h3 nospace'), 'htmlH3'
+ AssertEqual SyntaxOf(' h3 trailing hash '), 'htmlH3'
+ AssertEqual SyntaxOf(' h4'), 'htmlH4'
+ AssertEqual SyntaxOf(' h5'), 'htmlH5'
+ AssertEqual SyntaxOf(' h6'), 'htmlH6'
+
+Given markdown;
+# h1 before h2
+
+## h2 between h1s
+
+# h1 after h2
+
+Execute (atx headers relative positions):
+ AssertEqual SyntaxOf(' h1 before h2'), 'htmlH1'
+ AssertEqual SyntaxOf(' h2 between h1s'), 'htmlH2'
+ AssertEqual SyntaxOf(' h1 after h2'), 'htmlH1'
+
+Given markdown;
+setex h1
+========
+
+setex h2
+--------
+
+setex h1 single punctuation
+=
+
+setex h1 punctuation longer than header
+================================
+
+Execute (setex headers):
+ AssertEqual SyntaxOf('setex h1'), 'htmlH1'
+ AssertEqual SyntaxOf('^========$'), 'htmlH1'
+ AssertEqual SyntaxOf('setex h2'), 'htmlH2'
+ AssertEqual SyntaxOf('--------'), 'htmlH2'
+ AssertEqual SyntaxOf('setex h1 single punctuation'), 'htmlH1'
+ AssertEqual SyntaxOf('^=$'), 'htmlH1'
+ AssertEqual SyntaxOf('setex h1 punctuation longer than header'), 'htmlH1'
+ AssertEqual SyntaxOf('^================================$'), 'htmlH1'
+
+Given markdown;
+- not Setex
+- because list
+
+Execute (prevent list vs Setex confusion):
+ AssertNotEqual SyntaxOf('- not Setex'), 'htmlH2'
+ AssertNotEqual SyntaxOf('- becuase list'), 'htmlH2'
+
+Given markdown;
+setex h1 before atx
+===================
+
+## atx h2
+
+### atx h3
+
+# atx h1
+
+setex h2
+------------------
+
+### atx h3 2
+
+Execute (mixed atx and setex headers):
+ AssertEqual SyntaxOf('setex h1 before atx'), 'htmlH1'
+ AssertEqual SyntaxOf('==================='), 'htmlH1'
+ AssertEqual SyntaxOf(' atx h2'), 'htmlH2'
+ AssertEqual SyntaxOf(' atx h3'), 'htmlH3'
+ AssertEqual SyntaxOf(' atx h1'), 'htmlH1'
+ AssertEqual SyntaxOf('setex h2'), 'htmlH2'
+ AssertEqual SyntaxOf('------------------'), 'htmlH2'
+
+# List
+
+Given markdown;
+- a & b
+1. c > d
+
+Execute (& and > are not marked as htmlError in lists):
+ AssertEqual SyntaxOf('-'), 'mkdListItem'
+ AssertEqual SyntaxOf('1.'), 'mkdListItem'
+ AssertNotEqual SyntaxOf('&'), 'htmlError'
+ AssertNotEqual SyntaxOf('>'), 'htmlError'
+
+Given markdown;
+1. a
+2. b
+
+Execute (list after line break):
+ AssertEqual SyntaxOf('1'), 'mkdListItem'
+ AssertEqual SyntaxOf('2'), 'mkdListItem'
+
+# HTML
+
+Given markdown;
+a
+
+<p>b</p>
+
+- <span>c</span>
+
+Execute (HTML tag in text):
+ AssertEqual SyntaxOf('p'), 'htmlTagName'
+ AssertEqual SyntaxOf('<p>'), 'htmlTag'
+ AssertEqual SyntaxOf('</p>'), 'htmlEndTag'
+ AssertEqual SyntaxOf('span'), 'htmlTagName'
+ AssertEqual SyntaxOf('<span>'), 'htmlTag'
+ AssertEqual SyntaxOf('</span>'), 'htmlEndTag'
+
+Given markdown;
+# _h1_
+
+## _h2_
+
+### _h3_
+
+#### _h4_
+
+##### _h5_
+
+###### _h6_
+
+Execute (underscore italic text in atx headings):
+ AssertEqual SyntaxOf('h1'), 'htmlItalic'
+ AssertEqual SyntaxOf('h2'), 'htmlItalic'
+ AssertEqual SyntaxOf('h3'), 'htmlItalic'
+ AssertEqual SyntaxOf('h4'), 'htmlItalic'
+ AssertEqual SyntaxOf('h5'), 'htmlItalic'
+ AssertEqual SyntaxOf('h6'), 'htmlItalic'
+
+Given markdown;
+# *h1*
+
+## *h2*
+
+### *h3*
+
+#### *h4*
+
+##### *h5*
+
+###### *h6*
+
+Execute (asterisk italic text in atx headings):
+ AssertEqual SyntaxOf('h1'), 'htmlItalic'
+ AssertEqual SyntaxOf('h2'), 'htmlItalic'
+ AssertEqual SyntaxOf('h3'), 'htmlItalic'
+ AssertEqual SyntaxOf('h4'), 'htmlItalic'
+ AssertEqual SyntaxOf('h5'), 'htmlItalic'
+ AssertEqual SyntaxOf('h6'), 'htmlItalic'
+
+Given markdown;
+_h1_
+=
+
+_h2_
+-
+
+Execute (underscore italic text in setext headings):
+ AssertEqual SyntaxOf('h1'), 'htmlItalic'
+ AssertEqual SyntaxOf('h2'), 'htmlItalic'
+
+Given markdown;
+*h1*
+=
+
+*h2*
+-
+
+Execute (asterisk italic text in setext headings):
+ AssertEqual SyntaxOf('h1'), 'htmlItalic'
+ AssertEqual SyntaxOf('h2'), 'htmlItalic'
+
+Given markdown;
+# __h1__
+
+## __h2__
+
+### __h3__
+
+#### __h4__
+
+##### __h5__
+
+###### __h6__
+
+Execute (underscore bold text in atx headings):
+ AssertEqual SyntaxOf('h1'), 'htmlBold'
+ AssertEqual SyntaxOf('h2'), 'htmlBold'
+ AssertEqual SyntaxOf('h3'), 'htmlBold'
+ AssertEqual SyntaxOf('h4'), 'htmlBold'
+ AssertEqual SyntaxOf('h5'), 'htmlBold'
+ AssertEqual SyntaxOf('h6'), 'htmlBold'
+
+Given markdown;
+# **h1**
+
+## **h2**
+
+### **h3**
+
+#### **h4**
+
+##### **h5**
+
+###### **h6**
+
+Execute (asterisk bold text in atx headings):
+ AssertEqual SyntaxOf('h1'), 'htmlBold'
+ AssertEqual SyntaxOf('h2'), 'htmlBold'
+ AssertEqual SyntaxOf('h3'), 'htmlBold'
+ AssertEqual SyntaxOf('h4'), 'htmlBold'
+ AssertEqual SyntaxOf('h5'), 'htmlBold'
+ AssertEqual SyntaxOf('h6'), 'htmlBold'
+
+Given markdown;
+__h1__
+=
+
+__h2__
+-
+
+Execute (underscore bold text in setext headings):
+ AssertEqual SyntaxOf('h1'), 'htmlBold'
+ AssertEqual SyntaxOf('h2'), 'htmlBold'
+
+Given markdown;
+**h1**
+=
+
+**h2**
+-
+
+Execute (asterisk bold text in setext headings):
+ AssertEqual SyntaxOf('h1'), 'htmlBold'
+ AssertEqual SyntaxOf('h2'), 'htmlBold'
+
+Given markdown;
+# ___h1___
+
+## ___h2___
+
+### ___h3___
+
+#### ___h4___
+
+##### ___h5___
+
+###### ___h6___
+
+Execute (underscore bold italic text in atx headings):
+ AssertEqual SyntaxOf('h1'), 'htmlBoldItalic'
+ AssertEqual SyntaxOf('h2'), 'htmlBoldItalic'
+ AssertEqual SyntaxOf('h3'), 'htmlBoldItalic'
+ AssertEqual SyntaxOf('h4'), 'htmlBoldItalic'
+ AssertEqual SyntaxOf('h5'), 'htmlBoldItalic'
+ AssertEqual SyntaxOf('h6'), 'htmlBoldItalic'
+
+Given markdown;
+# ***h1***
+
+## ***h2***
+
+### ***h3***
+
+#### ***h4***
+
+##### ***h5***
+
+###### ***h6***
+
+Execute (asterisk bold italic text in atx headings):
+ AssertEqual SyntaxOf('h1'), 'htmlBoldItalic'
+ AssertEqual SyntaxOf('h2'), 'htmlBoldItalic'
+ AssertEqual SyntaxOf('h3'), 'htmlBoldItalic'
+ AssertEqual SyntaxOf('h4'), 'htmlBoldItalic'
+ AssertEqual SyntaxOf('h5'), 'htmlBoldItalic'
+ AssertEqual SyntaxOf('h6'), 'htmlBoldItalic'
+
+Given markdown;
+___h1___
+=
+
+___h2___
+-
+
+Execute (underscore bold italic text in setext headings):
+ AssertEqual SyntaxOf('h1'), 'htmlBoldItalic'
+ AssertEqual SyntaxOf('h2'), 'htmlBoldItalic'
+
+Given markdown;
+***h1***
+=
+
+***h2***
+-
+
+Execute (asterisk bold italic text in setext headings):
+ AssertEqual SyntaxOf('h1'), 'htmlBoldItalic'
+ AssertEqual SyntaxOf('h2'), 'htmlBoldItalic'
+
+Given markdown;
+# [^h1]
+
+## [^h2]
+
+### [^h3]
+
+#### [^h4]
+
+##### [^h5]
+
+###### [^h6]
+
+Execute (footnotes in atx headings):
+ AssertEqual SyntaxOf('h1'), 'mkdFootnotes'
+ AssertEqual SyntaxOf('h2'), 'mkdFootnotes'
+ AssertEqual SyntaxOf('h3'), 'mkdFootnotes'
+ AssertEqual SyntaxOf('h4'), 'mkdFootnotes'
+ AssertEqual SyntaxOf('h5'), 'mkdFootnotes'
+ AssertEqual SyntaxOf('h6'), 'mkdFootnotes'
+
+Given markdown;
+[^h1]
+=
+
+[^h2]
+-
+
+Execute (footnotes in setext headings):
+ AssertEqual SyntaxOf('h1'), 'mkdFootnotes'
+ AssertEqual SyntaxOf('h2'), 'mkdFootnotes'