" set verbose=1

let s:suite = themis#suite('base')
let s:assert = themis#helper('assert')

let s:path = tempname()

function! s:suite.before_each() abort
  call dein#min#_init()
endfunction

function! s:suite.block_normal() abort
  call s:assert.equals(dein#begin(s:path), 0)
  call s:assert.equals(dein#end(), 0)

  call s:assert.equals(dein#begin(s:path), 0)
  call s:assert.equals(dein#end(), 0)
endfunction

function! s:suite.begin_invalid() abort
  call s:assert.equals(dein#begin(s:path), 0)
  call s:assert.equals(dein#begin(s:path), 1)

  call dein#min#_init()
  call s:assert.equals(dein#end(), 1)

  call s:assert.equals(dein#end(), 1)

  call s:assert.equals(dein#begin(getcwd() . '/plugin'), 1)
endfunction

function! s:suite.end_invalid() abort
  call s:assert.equals(dein#end(), 1)
endfunction

function! s:suite.add_normal() abort
  call s:assert.equals(dein#begin(s:path), 0)

  call dein#add('foo', {})
  call s:assert.equals(g:dein#_plugins.foo.name, 'foo')
  call dein#add('bar')
  call s:assert.equals(g:dein#_plugins.bar.name, 'bar')

  call s:assert.equals(dein#end(), 0)
endfunction

function! s:suite.add_overwrite() abort
  call s:assert.equals(dein#begin(s:path), 0)

  call dein#parse#_add('foo', {}, v:true)
  call s:assert.equals(g:dein#_plugins.foo.sourced, 0)

  call dein#parse#_add('foo', { 'sourced': 1 }, v:true)
  call s:assert.equals(g:dein#_plugins.foo.sourced, 1)

  call dein#parse#_add('foo', { 'sourced': 2 }, v:false)
  call s:assert.equals(g:dein#_plugins.foo.sourced, 1)

  call s:assert.equals(dein#end(), 0)
endfunction

function! s:suite.get() abort
  let plugins = { 'foo': {'name': 'bar'} }

  call dein#begin(s:path)
  call dein#add('foo', { 'name': 'bar' })
  call s:assert.equals(dein#get('bar').name, 'bar')
  call dein#add('foo')
  call s:assert.equals(dein#get('foo').name, 'foo')
  call dein#end()
endfunction

function! s:suite.expand() abort
  call s:assert.equals(dein#util#_expand('~'),
        \ dein#util#_substitute_path(fnamemodify('~', ':p')))
  call s:assert.equals(dein#util#_expand('$HOME'),
        \ dein#util#_substitute_path($HOME))
endfunction