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 = {}
    let g:php_builtin_classes = {}
    " disable built-in interfaces
    let g:php_builtin_interfaces = {}
    let g:php_builtin_interfacenames = {}
    " disable built-in functions
    let g:php_builtin_functions = {}
    " disable tags
    exe ':set tags='
endf

fun! TestCase_returns_empty_strings_when_symbol_not_found()
    call SetUp()

    let res = phpcomplete#LocateSymbol('no_such_thing', '', '', {})
    call VUAssertEquals(['', '', ''], res)
endf

fun! TestCase_returns_symbol_locations()
    call SetUp()

    let path =  expand('%:p:h')."/".'fixtures/GetCurrentSymbolWithContext/foo.php'
    below 1new
    exe ":silent! edit ".path

    call cursor(18, 2)
    let res = phpcomplete#LocateSymbol('get_foo', '', '', {})
    call VUAssertEquals([path, 15, 10], res)

    call cursor(18, 13)
    let res = phpcomplete#LocateSymbol('baz', 'get_foo()->', '', {})
    call VUAssertEquals([path, 4, 18], res)

    call cursor(20, 3)
    let res = phpcomplete#LocateSymbol('Foo', '', '', {})
    call VUAssertEquals([path, 2, 7], res)

    call cursor(20, 7)
    let res = phpcomplete#LocateSymbol('baz', 'Foo::', '', {})
    call VUAssertEquals([path, 4, 18], res)

    silent! bw! %
endf

fun! TestCase_returns_symbol_locations_with_namespaces()
    call SetUp()

    exe ':set tags='.expand('%:p:h').'/'.'fixtures/GetCurrentSymbolWithContext/namespaced_tags'

    let foo2_path = expand('%:p:h')."/".'fixtures/GetCurrentSymbolWithContext/namespaced_foo2.php'
    let path = expand('%:p:h')."/".'fixtures/GetCurrentSymbolWithContext/namespaced_foo.php'
    below 1new
    exe ":silent! edit ".path

    call cursor(24, 25)
    let res = phpcomplete#LocateSymbol('returnFoo2', '$f2->returnBaz2()->', 'NS1', {})
    call VUAssertEquals([foo2_path, 22, 18], res)

    call cursor(28, 10)
    let res = phpcomplete#LocateSymbol('returnBaz2', '$f2->', 'NS1', {})
    call VUAssertEquals([foo2_path, 11, 18], res)

    silent! bw! %
endf

fun! TestCase_returns_location_for_inherited_methods()
    call SetUp()
    exe ':set tags='.expand('%:p:h').'/'.'fixtures/GetCurrentSymbolWithContext/inherited_tags'

    let base_path = expand('%:p:h')."/".'fixtures/GetCurrentSymbolWithContext/base_foo.php'
    let path = expand('%:p:h')."/".'fixtures/GetCurrentSymbolWithContext/child_foo.php'
    below 1new
    exe ":silent! edit ".path

    call cursor(7, 10)
    let res = phpcomplete#LocateSymbol('inherited', '$f->', '', {})
    call VUAssertEquals([base_path, 5, 18], res)

    silent! bw! %
endf

fun! TestCase_returns_locations_for_reference_returning_functions()
    call SetUp()

    let path =  expand('%:p:h')."/".'fixtures/GetCurrentSymbolWithContext/foo_references.php'
    below 1new
    exe ":silent! edit ".path

    call cursor(16, 5)
    let res = phpcomplete#LocateSymbol('return_foo_ref', '', '', {})
    call VUAssertEquals([path, 13, 11], res)

    call cursor(16, 32)
    let res = phpcomplete#LocateSymbol('return_foo_ref_method', 'return_foo_ref()->', '', {})
    call VUAssertEquals([path, 4, 19], res)

    silent! bw! %
endf

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