Given markdown;
a <http://b> c

Execute (gx autolink):
  let b:url = 'http://b'
  let b:line = getline(1)
  let b:func = Markdown_GetFunc('vim-markdown/ftplugin/markdown.vim', 'Markdown_GetUrlForPosition')
  AssertEqual b:func(1, match(b:line, 'a') + 1), ''
  AssertEqual b:func(1, match(b:line, '<') + 1), b:url
  AssertEqual b:func(1, match(b:line, 'h') + 1), b:url
  AssertEqual b:func(1, match(b:line, '>') + 1), b:url
  AssertEqual b:func(1, match(b:line, 'c') + 1), ''

Given markdown;
a http://b.bb c

Execute (gx implicit autolink):
  let b:url = 'http://b.bb'
  let b:line = getline(1)
  let b:func = Markdown_GetFunc('vim-markdown/ftplugin/markdown.vim', 'Markdown_GetUrlForPosition')
  AssertEqual b:func(1, match(b:line, 'a') + 1), ''
  AssertEqual b:func(1, match(b:line, 'h') + 1), b:url
  AssertEqual b:func(1, match(b:line, 'c') + 1), ''

Given markdown;
[a]: http://b "c"

Execute (gx link reference definition):
  let b:url = 'http://b'
  let b:line = getline(1)
  let b:func = Markdown_GetFunc('vim-markdown/ftplugin/markdown.vim', 'Markdown_GetUrlForPosition')
  " TODO would be cool if all of the following gave the link.
  AssertEqual b:func(1, match(b:line, 'a') + 1), ''
  AssertEqual b:func(1, match(b:line, 'h') + 1), b:url
  AssertEqual b:func(1, match(b:line, 'c') + 1), ''

Given markdown;
a [b](c) d

Execute (gx autolink):
  let b:url = 'c'
  let b:line = getline(1)
  let b:func = Markdown_GetFunc('vim-markdown/ftplugin/markdown.vim', 'Markdown_GetUrlForPosition')
  AssertEqual b:func(1, match(b:line, 'a') + 1), ''
  AssertEqual b:func(1, match(b:line, '[') + 1), b:url
  AssertEqual b:func(1, match(b:line, 'b') + 1), b:url
  AssertEqual b:func(1, match(b:line, ']') + 1), b:url
  AssertEqual b:func(1, match(b:line, '(') + 1), b:url
  AssertEqual b:func(1, match(b:line, 'c') + 1), b:url
  AssertEqual b:func(1, match(b:line, ')') + 1), b:url
  AssertEqual b:func(1, match(b:line, 'd') + 1), ''

Given markdown;
# a

b

# c

d

Execute (]] same level):
  AssertEqual line('.'), 1
  normal ]]
  AssertEqual line('.'), 5
  normal [[
  AssertEqual line('.'), 1

Given markdown;
# a

b

## c

d

Execute (]] different levels level):
  AssertEqual line('.'), 1
  normal ]]
  AssertEqual line('.'), 5
  normal [[
  AssertEqual line('.'), 1

Given markdown;
# a

b

## c

d

# e

f

Execute (][ different levels level):
  AssertEqual line('.'), 1
  normal ][
  AssertEqual line('.'), 9
  normal []
  AssertEqual line('.'), 1

Given markdown;
# a

b

Execute (]c):
  normal! 3G
  AssertEqual line('.'), 3
  normal ]c
  AssertEqual line('.'), 1

Given markdown;
# a

Execute (Toc does not set nomodifiable on other files):
  " Sanity check.
  Assert &modifiable

  :Toc
  :lclose
  :edit a

  Assert &modifiable
