view src/testdir/test_assert.vim @ 33278:b5ed566262d3 v9.0.1906

patch 9.0.1906: Vim9: Interfaces should not support class methods and variables Commit: https://github.com/vim/vim/commit/92d9ee5f4ca0d2de04c39afbafc7609da43fb2e9 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Sun Sep 17 17:03:19 2023 +0200 patch 9.0.1906: Vim9: Interfaces should not support class methods and variables Problem: Vim9: Interfaces should not support class methods and variables Solution: Make sure interface follow the interface specification Vim9 interface changes to follow the new interface specification: 1) An interface can have only read-only and read-write instance variables. 2) An interface can have only public instance methods. 3) An interface cannot have class variables and class methods. 4) An interface cannot have private instance variables and private instance methods. 5) A interface can extend another interface using "extends". The sub-interface gets all the variables and methods in the super interface. That means: - Interfaces should not support class methods and variables. - Adjust error numbers and add additional tests. - Interface methods can be defined in one of the super classes. - Interface variables can be defined in one of the super classes. and instance variables can be repeated in sub interfaces. - Check the class variable types with the type in interface. closes: #13100 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
author Christian Brabandt <cb@256bit.org>
date Sun, 17 Sep 2023 17:15:06 +0200
parents 695b50472e85
children fbb08f0dde3a
line wrap: on
line source

" Test that the methods used for testing work.

source check.vim
source term_util.vim

func Test_assert_false()
  call assert_equal(0, assert_false(0))
  call assert_equal(0, assert_false(v:false))
  call assert_equal(0, v:false->assert_false())

  call assert_equal(1, assert_false(123))
  call assert_match("Expected False but got 123", v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(1, 123->assert_false())
  call assert_match("Expected False but got 123", v:errors[0])
  call remove(v:errors, 0)
endfunc

func Test_assert_true()
  call assert_equal(0, assert_true(1))
  call assert_equal(0, assert_true(123))
  call assert_equal(0, assert_true(v:true))
  call assert_equal(0, v:true->assert_true())

  call assert_equal(1, assert_true(0))
  call assert_match("Expected True but got 0", v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(1, 0->assert_true())
  call assert_match("Expected True but got 0", v:errors[0])
  call remove(v:errors, 0)
endfunc

func Test_assert_equal()
  let s = 'foo'
  call assert_equal(0, assert_equal('foo', s))
  let n = 4
  call assert_equal(0, assert_equal(4, n))
  let l = [1, 2, 3]
  call assert_equal(0, assert_equal([1, 2, 3], l))
  call assert_equal(test_null_list(), test_null_list())
  call assert_equal(test_null_list(), [])
  call assert_equal([], test_null_list())

  let s = 'foo'
  call assert_equal(1, assert_equal('bar', s))
  call assert_match("Expected 'bar' but got 'foo'", v:errors[0])
  call remove(v:errors, 0)

  call assert_equal('XxxxxxxxxxxxxxxxxxxxxxX', 'XyyyyyyyyyyyyyyyyyyyyyyyyyX')
  call assert_match("Expected 'X\\\\\\[x occurs 21 times]X' but got 'X\\\\\\[y occurs 25 times]X'", v:errors[0])
  call remove(v:errors, 0)

  " special characters are escaped
  call assert_equal("\b\e\f\n\t\r\\\x01\x7f", 'x')
  call assert_match('Expected ''\\b\\e\\f\\n\\t\\r\\\\\\x01\\x7f'' but got ''x''', v:errors[0])
  call remove(v:errors, 0)

  " many composing characters are handled properly
  call setline(1, ' ')
  norm 100grƯ€
  call assert_equal(1, getline(1))
  call assert_match("Expected 1 but got '.* occurs 100 times]'", v:errors[0])
  call remove(v:errors, 0)
  bwipe!
endfunc

func Test_assert_equal_dict()
  call assert_equal(0, assert_equal(#{one: 1, two: 2}, #{two: 2, one: 1}))

  call assert_equal(1, assert_equal(#{one: 1, two: 2}, #{two: 2, one: 3}))
  call assert_match("Expected {'one': 1} but got {'one': 3} - 1 equal item omitted", v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(1, assert_equal(#{one: 1, two: 2}, #{two: 22, one: 11}))
  call assert_match("Expected {'one': 1, 'two': 2} but got {'one': 11, 'two': 22}", v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(1, assert_equal(#{}, #{two: 2, one: 1}))
  call assert_match("Expected {} but got {'one': 1, 'two': 2}", v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(1, assert_equal(#{two: 2, one: 1}, #{}))
  call assert_match("Expected {'one': 1, 'two': 2} but got {}", v:errors[0])
  call remove(v:errors, 0)
endfunc

func Test_assert_equalfile()
  call assert_equal(1, assert_equalfile('abcabc', 'xyzxyz'))
  call assert_match("E485: Can't read file abcabc", v:errors[0])
  call remove(v:errors, 0)

  let goodtext = ["one", "two", "three"]
  call writefile(goodtext, 'Xone', 'D')
  call assert_equal(1, 'Xone'->assert_equalfile('xyzxyz'))
  call assert_match("E485: Can't read file xyzxyz", v:errors[0])
  call remove(v:errors, 0)

  call writefile(goodtext, 'Xtwo', 'D')
  call assert_equal(0, assert_equalfile('Xone', 'Xtwo'))

  call writefile([goodtext[0]], 'Xone')
  call assert_equal(1, assert_equalfile('Xone', 'Xtwo'))
  call assert_match("first file is shorter", v:errors[0])
  call remove(v:errors, 0)

  call writefile(goodtext, 'Xone')
  call writefile([goodtext[0]], 'Xtwo')
  call assert_equal(1, assert_equalfile('Xone', 'Xtwo'))
  call assert_match("second file is shorter", v:errors[0])
  call remove(v:errors, 0)

  call writefile(['1234X89'], 'Xone')
  call writefile(['1234Y89'], 'Xtwo')
  call assert_equal(1, assert_equalfile('Xone', 'Xtwo'))
  call assert_match('difference at byte 4, line 1 after "1234X" vs "1234Y"', v:errors[0])
  call remove(v:errors, 0)

  call writefile([repeat('x', 234) .. 'X'], 'Xone')
  call writefile([repeat('x', 234) .. 'Y'], 'Xtwo')
  call assert_equal(1, assert_equalfile('Xone', 'Xtwo'))
  let xes = repeat('x', 134)
  call assert_match('difference at byte 234, line 1 after "' .. xes .. 'X" vs "' .. xes .. 'Y"', v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(1, assert_equalfile('Xone', 'Xtwo', 'a message'))
  call assert_match("a message: difference at byte 234, line 1 after", v:errors[0])
  call remove(v:errors, 0)
endfunc

func Test_assert_notequal()
  let n = 4
  call assert_equal(0, assert_notequal('foo', n))
  let s = 'foo'
  call assert_equal(0, assert_notequal([1, 2, 3], s))

  call assert_equal(1, assert_notequal('foo', s))
  call assert_match("Expected not equal to 'foo'", v:errors[0])
  call remove(v:errors, 0)
endfunc

func Test_assert_report()
  call assert_equal(1, assert_report('something is wrong'))
  call assert_match('something is wrong', v:errors[0])
  call remove(v:errors, 0)
  call assert_equal(1, 'also wrong'->assert_report())
  call assert_match('also wrong', v:errors[0])
  call remove(v:errors, 0)
endfunc

func Test_assert_exception()
  try
    nocommand
  catch
    call assert_equal(0, assert_exception('E492:'))
  endtry

  try
    nocommand
  catch
    call assert_equal(1, assert_exception('E12345:'))
  endtry
  call assert_match("Expected 'E12345:' but got 'Vim:E492: ", v:errors[0])
  call remove(v:errors, 0)

  try
    nocommand
  catch
    try
      " illegal argument, get NULL for error
      call assert_equal(1, assert_exception([]))
    catch
      call assert_equal(0, assert_exception('E730:'))
    endtry
  endtry

  call assert_equal(1, assert_exception('E492:'))
  call assert_match('v:exception is not set', v:errors[0])
  call remove(v:errors, 0)
endfunc

func Test_wrong_error_type()
  let save_verrors = v:errors
  let v:['errors'] = {'foo': 3}
  call assert_equal('yes', 'no')
  let verrors = v:errors
  let v:errors = save_verrors
  call assert_equal(type([]), type(verrors))
endfunc

func Test_compare_fail()
  let s:v = {}
  let s:x = {"a": s:v}
  let s:v["b"] = s:x
  let s:w = {"c": s:x, "d": ''}
  try
    call assert_equal(s:w, '')
  catch
    call assert_equal(0, assert_exception('E724:'))
    call assert_match("Expected NULL but got ''", v:errors[0])
    call remove(v:errors, 0)
  endtry
endfunc

func Test_match()
  call assert_equal(0, assert_match('^f.*b.*r$', 'foobar'))

  call assert_equal(1, assert_match('bar.*foo', 'foobar'))
  call assert_match("Pattern 'bar.*foo' does not match 'foobar'", v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(1, assert_match('bar.*foo', 'foobar', 'wrong'))
  call assert_match('wrong', v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(1, 'foobar'->assert_match('bar.*foo', 'wrong'))
  call assert_match('wrong', v:errors[0])
  call remove(v:errors, 0)
endfunc

func Test_notmatch()
  call assert_equal(0, assert_notmatch('foo', 'bar'))
  call assert_equal(0, assert_notmatch('^foobar$', 'foobars'))

  call assert_equal(1, assert_notmatch('foo', 'foobar'))
  call assert_match("Pattern 'foo' does match 'foobar'", v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(1, 'foobar'->assert_notmatch('foo'))
  call assert_match("Pattern 'foo' does match 'foobar'", v:errors[0])
  call remove(v:errors, 0)
endfunc

func Test_assert_fail_fails()
  call assert_equal(1, assert_fails('xxx', 'E12345'))
  call assert_match("Expected 'E12345' but got 'E492:", v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(1, assert_fails('xxx', 'E9876', 'stupid'))
  call assert_match("stupid: Expected 'E9876' but got 'E492:", v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(1, assert_fails('xxx', ['E9876']))
  call assert_match("Expected 'E9876' but got 'E492:", v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(1, assert_fails('xxx', ['E492:', 'E9876']))
  call assert_match("Expected 'E9876' but got 'E492:", v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(1, assert_fails('echo', '', 'echo command'))
  call assert_match("command did not fail: echo command", v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(1, 'echo'->assert_fails('', 'echo command'))
  call assert_match("command did not fail: echo command", v:errors[0])
  call remove(v:errors, 0)

  try
    call assert_equal(1, assert_fails('xxx', []))
  catch
    let exp = v:exception
  endtry
  call assert_match("E856: \"assert_fails()\" second argument", exp)

  try
    call assert_equal(1, assert_fails('xxx', ['1', '2', '3']))
  catch
    let exp = v:exception
  endtry
  call assert_match("E856: \"assert_fails()\" second argument", exp)

  try
    call assert_equal(1, assert_fails('xxx', test_null_list()))
  catch
    let exp = v:exception
  endtry
  call assert_match("E856: \"assert_fails()\" second argument", exp)

  try
    call assert_equal(1, assert_fails('xxx', []))
  catch
    let exp = v:exception
  endtry
  call assert_match("E856: \"assert_fails()\" second argument", exp)

  try
    call assert_equal(1, assert_fails('xxx', #{one: 1}))
  catch
    let exp = v:exception
  endtry
  call assert_match("E1222: String or List required for argument 2", exp)

  try
    call assert_equal(0, assert_fails('xxx', [#{one: 1}]))
  catch
    let exp = v:exception
  endtry
  call assert_match("E731: Using a Dictionary as a String", exp)

  let exp = ''
  try
    call assert_equal(0, assert_fails('xxx', ['E492', #{one: 1}]))
  catch
    let exp = v:exception
  endtry
  call assert_match("E731: Using a Dictionary as a String", exp)

  try
    call assert_equal(1, assert_fails('xxx', 'E492', '', 'burp'))
  catch
    let exp = v:exception
  endtry
  call assert_match("E1210: Number required for argument 4", exp)

  try
    call assert_equal(1, assert_fails('xxx', 'E492', '', 54, 123))
  catch
    let exp = v:exception
  endtry
  call assert_match("E1174: String required for argument 5", exp)

  call assert_equal(1, assert_fails('c0', ['', '\(.\)\1']))
  call assert_match("Expected '\\\\\\\\(.\\\\\\\\)\\\\\\\\1' but got 'E939: Positive count required: c0': c0", v:errors[0])
  call remove(v:errors, 0)

  " Test for matching the line number and the script name in an error message
  call writefile(['', 'call Xnonexisting()'], 'Xassertfails.vim', 'D')
  call assert_fails('source Xassertfails.vim', 'E117:', '', 10)
  call assert_match("Expected 10 but got 2", v:errors[0])
  call remove(v:errors, 0)
  call assert_fails('source Xassertfails.vim', 'E117:', '', 2, 'Xabc')
  call assert_match("Expected 'Xabc' but got .*Xassertfails.vim", v:errors[0])
  call remove(v:errors, 0)
endfunc

func Test_assert_wrong_arg_emsg_off()
  CheckFeature folding

  new
  call setline(1, ['foo', 'bar'])
  1,2fold

  " This used to crash Vim
  let &l:foldtext = 'assert_match({}, {})'
  redraw!

  let &l:foldtext = 'assert_equalfile({}, {})'
  redraw!

  bwipe!
endfunc

func Test_assert_fails_in_try_block()
  try
    call assert_equal(0, assert_fails('throw "error"'))
  endtry
endfunc

" Test that assert_fails() in a timer does not cause a hit-enter prompt.
" Requires using a terminal, in regular tests the hit-enter prompt won't be
" triggered.
func Test_assert_fails_in_timer()
  CheckRunVimInTerminal

  let buf = RunVimInTerminal('', {'rows': 6})
  let cmd = ":call timer_start(0, {-> assert_fails('call', 'E471:')})"
  call term_sendkeys(buf, cmd)
  call WaitForAssert({-> assert_equal(cmd, term_getline(buf, 6))})
  call term_sendkeys(buf, "\<CR>")
  call TermWait(buf, 100)
  call assert_match('E471: Argument required', term_getline(buf, 6))

  call StopVimInTerminal(buf)
endfunc

func Test_assert_beeps()
  new
  call assert_equal(0, assert_beeps('normal h'))

  call assert_equal(1, assert_beeps('normal 0'))
  call assert_match("command did not beep: normal 0", v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(0, 'normal h'->assert_beeps())
  call assert_equal(1, 'normal 0'->assert_beeps())
  call assert_match("command did not beep: normal 0", v:errors[0])
  call remove(v:errors, 0)

  bwipe
endfunc

func Test_assert_nobeep()
  call assert_equal(1, assert_nobeep('normal! cr'))
  call assert_match("command did beep: normal! cr", v:errors[0])
  call remove(v:errors, 0)
endfunc

func Test_assert_inrange()
  call assert_equal(0, assert_inrange(7, 7, 7))
  call assert_equal(0, assert_inrange(5, 7, 5))
  call assert_equal(0, assert_inrange(5, 7, 6))
  call assert_equal(0, assert_inrange(5, 7, 7))

  call assert_equal(1, assert_inrange(5, 7, 4))
  call assert_match("Expected range 5 - 7, but got 4", v:errors[0])
  call remove(v:errors, 0)
  call assert_equal(1, assert_inrange(5, 7, 8))
  call assert_match("Expected range 5 - 7, but got 8", v:errors[0])
  call remove(v:errors, 0)

  call assert_equal(0, 5->assert_inrange(5, 7))
  call assert_equal(0, 7->assert_inrange(5, 7))
  call assert_equal(1, 8->assert_inrange(5, 7))
  call assert_match("Expected range 5 - 7, but got 8", v:errors[0])
  call remove(v:errors, 0)

  call assert_fails('call assert_inrange(1, 1)', 'E119:')

  call assert_equal(0, assert_inrange(7.0, 7, 7))
  call assert_equal(0, assert_inrange(7, 7.0, 7))
  call assert_equal(0, assert_inrange(7, 7, 7.0))
  call assert_equal(0, assert_inrange(5, 7, 5.0))
  call assert_equal(0, assert_inrange(5, 7, 6.0))
  call assert_equal(0, assert_inrange(5, 7, 7.0))

  call assert_equal(1, assert_inrange(5, 7, 4.0))
  call assert_match("Expected range 5.0 - 7.0, but got 4.0", v:errors[0])
  call remove(v:errors, 0)
  call assert_equal(1, assert_inrange(5, 7, 8.0))
  call assert_match("Expected range 5.0 - 7.0, but got 8.0", v:errors[0])
  call remove(v:errors, 0)

  " Use a custom message
  call assert_equal(1, assert_inrange(5, 7, 8, "Higher"))
  call assert_match("Higher: Expected range 5 - 7, but got 8", v:errors[0])
  call remove(v:errors, 0)
  call assert_equal(1, assert_inrange(5, 7, 8.0, "Higher"))
  call assert_match("Higher: Expected range 5.0 - 7.0, but got 8.0", v:errors[0])
  call remove(v:errors, 0)

  " Invalid arguments
  call assert_fails("call assert_inrange([], 2, 3)", 'E1219:')
  call assert_fails("call assert_inrange(1, [], 3)", 'E1219:')
  call assert_fails("call assert_inrange(1, 2, [])", 'E1219:')
endfunc

func Test_assert_with_msg()
  call assert_equal('foo', 'bar', 'testing')
  call assert_match("testing: Expected 'foo' but got 'bar'", v:errors[0])
  call remove(v:errors, 0)
endfunc

func Test_override()
  call test_override('char_avail', 1)
  eval 1->test_override('redraw')
  call test_override('ALL', 0)
  call assert_fails("call test_override('xxx', 1)", 'E475:')
  call assert_fails("call test_override('redraw', 'yes')", 'E1210:')
endfunc

func Test_mouse_position()
  let save_mouse = &mouse
  set mouse=a
  new
  call setline(1, ['line one', 'line two'])
  call assert_equal([0, 1, 1, 0], getpos('.'))
  call test_setmouse(1, 5)
  call feedkeys("\<LeftMouse>", "xt")
  call assert_equal([0, 1, 5, 0], getpos('.'))
  call test_setmouse(2, 20)
  call feedkeys("\<LeftMouse>", "xt")
  call assert_equal([0, 2, 8, 0], getpos('.'))
  call test_setmouse(5, 1)
  call feedkeys("\<LeftMouse>", "xt")
  call assert_equal([0, 2, 1, 0], getpos('.'))
  call assert_fails('call test_setmouse("", 2)', 'E474:')
  call assert_fails('call test_setmouse(1, "")', 'E474:')
  bwipe!
  let &mouse = save_mouse
endfunc

func Test_user_is_happy()
  smile
  sleep 300m
endfunc

" Test for the test_alloc_fail() function
func Test_test_alloc_fail()
  call assert_fails('call test_alloc_fail([], 1, 1)', 'E474:')
  call assert_fails('call test_alloc_fail(10, [], 1)', 'E474:')
  call assert_fails('call test_alloc_fail(10, 1, [])', 'E474:')
  call assert_fails('call test_alloc_fail(999999, 1, 1)', 'E474:')
endfunc

" Test for the test_option_not_set() function
func Test_test_option_not_set()
  call assert_fails('call test_option_not_set("Xinvalidopt")', 'E475:')
endfunc

" Must be last.
func Test_zz_quit_detected()
  " Verify that if a test function ends Vim the test script detects this.
  quit
endfunc

" vim: shiftwidth=2 sts=2 expandtab