fun! SetUp()
    " normalize g:phpcomplete_min_num_of_chars_for_namespace_completion option
    let g:phpcomplete_min_num_of_chars_for_namespace_completion = 2
    " disable built-in classes
    let g:php_builtin_classnames = {}
    " disable built-in interfaces
    let g:php_builtin_interfaces = {}
    " disable built-in interfaces
    let g:php_builtin_interfacenames = {}
    " disable tags
    exe ':set tags='
endf

fun! TestCase_completes_builtin_classes()
    call SetUp()
    let g:php_builtin_classnames = {
                \ 'arrayaccess': '',
                \ 'arrayobject': '',
                \ }

    let g:php_builtin_classes = {
                \ 'arrayaccess':{
                \   'name': 'ArrayAccess',
                \ },
                \ 'arrayobject':{
                \   'name': 'ArrayObject',
                \ },
                \ }

    " returns every builtin class when nothing typed in
    let res = phpcomplete#CompleteUse('')
    call VUAssertEquals([
                \{'word': 'ArrayAccess', 'kind': 'c'},
                \{'word': 'ArrayObject', 'kind': 'c'}],
                \res)

    " returns every builtin class when only a \ typed in
    let res = phpcomplete#CompleteUse('\')
    call VUAssertEquals([
                \{'word': 'ArrayAccess', 'kind': 'c'},
                \{'word': 'ArrayObject', 'kind': 'c'}],
                \res)

    " filters to the typed in string
    let res = phpcomplete#CompleteUse('ArrayO')
    call VUAssertEquals([
                \{'word': 'ArrayObject', 'kind': 'c'}]
                \, res)

    " removes the leading \ when its in the base, php manual doesn't recommend
    " to type out those since imports are always absolute
    let res = phpcomplete#CompleteUse('\ArrayO')
    call VUAssertEquals([
                \{'word': 'ArrayObject', 'kind': 'c'}]
                \, res)
endf

fun! TestCase_completes_namespaces_from_tags()
    call SetUp()
    exe ':set tags='.expand('%:p:h').'/'.'fixtures/CompleteUse/tags'

    let res = phpcomplete#CompleteUse('Ass')
    call VUAssertEquals([
                \ {'word': 'Assetic', 'menu': 'fixtures/CompleteUse/foo.php', 'info': 'fixtures/CompleteUse/foo.php', 'kind': 'n'},
                \ {'word': 'Assetic\Asset', 'menu': 'fixtures/CompleteUse/foo.php', 'info': 'fixtures/CompleteUse/foo.php', 'kind': 'n'},
                \ {'word': 'Assetic\Asset\Iterator', 'menu': 'fixtures/CompleteUse/foo.oho', 'info': 'fixtures/CompleteUse/foo.oho', 'kind': 'n'},
                \ {'word': 'Assetic\Cache', 'menu': 'fixtures/CompleteUse/foo.php', 'info': 'fixtures/CompleteUse/foo.php', 'kind': 'n'}],
                \ res)

    " removes the leading \ when its in the base, php manual doesn't recommend
    " to type out those since imports are always absolute
    let res = phpcomplete#CompleteUse('\Ass')
    call VUAssertEquals([
                \ {'word': 'Assetic', 'menu': 'fixtures/CompleteUse/foo.php', 'info': 'fixtures/CompleteUse/foo.php', 'kind': 'n'},
                \ {'word': 'Assetic\Asset', 'menu': 'fixtures/CompleteUse/foo.php', 'info': 'fixtures/CompleteUse/foo.php', 'kind': 'n'},
                \ {'word': 'Assetic\Asset\Iterator', 'menu': 'fixtures/CompleteUse/foo.oho', 'info': 'fixtures/CompleteUse/foo.oho', 'kind': 'n'},
                \ {'word': 'Assetic\Cache', 'menu': 'fixtures/CompleteUse/foo.php', 'info': 'fixtures/CompleteUse/foo.php', 'kind': 'n'}],
                \ res)

    " Should return traits too (tags with kind "t")
    let res = phpcomplete#CompleteUse('Some')
    call VUAssertEquals([
                \ {'word': 'SomeTrait', 'menu': 'fixtures/CompleteUse/foo.php', 'info': 'fixtures/CompleteUse/foo.php', 'kind': 't'}],
                \ res)
endf

fun! TestCase_completes_namespaces_and_classes_from_tags_when_a_leading_namespace_is_already_typed_in()
    call SetUp()

    exe ':set tags='.expand('%:p:h').'/'.'fixtures/CompleteUse/tags'
    let res = phpcomplete#CompleteUse('Assetic\Asset\Ba')
    call VUAssertEquals([
                \ {'word': 'Assetic\Asset\BaseAsset', 'menu': 'fixtures/CompleteUse/foo.php', 'info': 'fixtures/CompleteUse/foo.php', 'kind': 'c'}],
                \ res)

    " should complete tags matching the word after the last \ when no
    " namespaces found in tags file
    exe ':set tags='.expand('%:p:h').'/'.'fixtures/CompleteUse/old_style_tags'
    let res = phpcomplete#CompleteUse('Assetic\Asset\Ba')
    call VUAssertEquals([
                \ {'word': 'Assetic\Asset\BaseAsset', 'menu': 'fixtures/CompleteUse/foo.php', 'info': 'fixtures/CompleteUse/foo.php', 'kind': 'c'}],
                \ res)
endf

fun! TestCase_honors_the_min_num_of_chars_for_namespace_completion_setting_for_namespaces()
    call SetUp()
    exe ':set tags='.expand('%:p:h').'/'.'fixtures/CompleteUse/tags'
    let g:phpcomplete_min_num_of_chars_for_namespace_completion = 99

    let res = phpcomplete#CompleteUse('Assetic\')
    call VUAssertEquals([], res)
endf

fun! TestCase_honors_the_min_num_of_chars_for_namespace_completion_setting_for_classnames()
    call SetUp()
    exe ':set tags='.expand('%:p:h').'/'.'fixtures/CompleteUse/tags'
    let g:phpcomplete_min_num_of_chars_for_namespace_completion = 99

    let res = phpcomplete#CompleteUse('Assetic\Asset\Ba')
    call VUAssertEquals([], res)
endf

" vim: foldmethod=marker:expandtab:ts=4:sts=4