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;
[ge_test.md](ge_test.md)

Execute (ge opens file):
  normal ge
  AssertEqual @%, 'ge_test.md'
  AssertEqual getline(1), 'ge test'

Given markdown;
[ge_test](ge_test)

Execute (ge opens file without .md extensions):
  let g:vim_markdown_no_extensions_in_markdown = 1
  normal ge
  AssertEqual @%, 'ge_test.md'
  AssertEqual getline(1), 'ge test'
  unlet g:vim_markdown_no_extensions_in_markdown

Given markdown;
[ge_test.md](ge_test.md)

Execute (ge does not write before opening file):
  normal ia
  normal l
  normal ge
  AssertEqual @%, 'ge_test.md'
  AssertEqual getline(1), 'ge test'

Given markdown;
[ge_test.md](ge_test.md)

Execute (ge auto-write before opening file):
  let g:vim_markdown_autowrite = 1
  normal ia
  normal l
  AssertThrows normal ge
  AssertEqual g:vader_exception, 'Vim(write):E382: Cannot write, ''buftype'' option is set'
  unlet g:vim_markdown_autowrite

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