summaryrefslogtreecommitdiff
path: root/mnv/src/testdir/test_pyx3.mnv
blob: ffd0508aa2a61ef87d84817983a1dd001420d8ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
" Test for pyx* commands and functions with Python 3.

set pyx=3
CheckFeature python3

let s:py2pattern = '^2\.[0-7]\.\d\+'
let s:py3pattern = '^3\.\d\+\.\d\+'


func Test_has_pythonx()
  call assert_true(has('pythonx'))
endfunc


func Test_pyx()
  redir => var
  pyx << trim EOF
    import sys
    print(sys.version)
  EOF
  redir END
  call assert_match(s:py3pattern, split(var)[0])
endfunc


func Test_pyxdo()
  pyx import sys
  enew
  pyxdo return sys.version.split("\n")[0]
  call assert_match(s:py3pattern, split(getline('.'))[0])
endfunc


func Test_pyxeval()
  pyx import sys
  call assert_match(s:py3pattern, split(pyxeval('sys.version'))[0])
endfunc

" Test for pyxeval with locals
func Test_python_pyeval_locals()
  let str = 'a string'
  let num = 0xbadb33f
  let d = {'a': 1, 'b': 2, 'c': str}
  let l = [ str, num, d ]

  let locals = #{
        \ s: str,
        \ n: num,
        \ d: d,
        \ l: l,
        \ }

  " check basics
  call assert_equal('a string', pyxeval('s', locals))
  call assert_equal(0xbadb33f, pyxeval('n', locals))
  call assert_equal(d, pyxeval('d', locals))
  call assert_equal(l, pyxeval('l', locals))

  py3 << trim EOF
  def __UpdateDict(d, upd):
    d.update(upd)
    return d

  def __ExtendList(l, *args):
    l.extend(*args)
    return l
  EOF

  " check assign to dict member works like bindeval
  call assert_equal(3, pyxeval('__UpdateDict( d, {"c": 3} )["c"]', locals))
  call assert_equal(3, d['c'])

  " check append lo list
  call assert_equal(4, pyxeval('len(__ExtendList(l, ["new item"]))', locals))
  call assert_equal("new item", l[-1])

  " check calling a function
  let StrLen = function('strlen')
  call assert_equal(3, pyxeval('f("abc")', {'f': StrLen}))
endfunc

func Test_pyxfile()
  " No special comments nor shebangs
  redir => var
  pyxfile pyxfile/pyx.py
  redir END
  call assert_match(s:py3pattern, split(var)[0])

  " Python 3 special comment
  redir => var
  pyxfile pyxfile/py3_magic.py
  redir END
  call assert_match(s:py3pattern, split(var)[0])

  " Python 3 shebang
  redir => var
  pyxfile pyxfile/py3_shebang.py
  redir END
  call assert_match(s:py3pattern, split(var)[0])

  if has('python')
    " Python 2 special comment
    redir => var
    pyxfile pyxfile/py2_magic.py
    redir END
    call assert_match(s:py2pattern, split(var)[0])

    " Python 2 shebang
    redir => var
    pyxfile pyxfile/py2_shebang.py
    redir END
    call assert_match(s:py2pattern, split(var)[0])
  endif
endfunc

func Test_Catch_Exception_Message()
  try
    pyx raise RuntimeError( 'TEST' )
  catch /.*/
    call assert_match( '^MNV(.*):RuntimeError: TEST$', v:exception )
  endtry
endfunc

" Test for various heredoc syntaxes
func Test_pyx3_heredoc()
  pyx << END
result='A'
END
  pyx <<
result+='B'
.
  pyx << trim END
    result+='C'
  END
  pyx << trim
    result+='D'
  .
  pyx << trim eof
    result+='E'
  eof
  pyx << trimm
result+='F'
trimm
  call assert_equal('ABCDEF', pyxeval('result'))
endfunc

" mnv: shiftwidth=2 sts=2 expandtab