aboutsummaryrefslogtreecommitdiff
path: root/test/functional/provider/perl_spec.lua
blob: 8049f0f3e28a8275139207d5af87008d853b3500 (plain) (blame)
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
local helpers = require('test.functional.helpers')(after_each)
local eq, clear = helpers.eq, helpers.clear
local missing_provider = helpers.missing_provider
local command = helpers.command
local write_file = helpers.write_file
local eval = helpers.eval
local retry = helpers.retry
local meths = helpers.meths
local insert = helpers.insert
local expect = helpers.expect
local feed = helpers.feed

do
  clear()
  local reason = missing_provider('perl')
  if reason then
    pending(string.format("Missing perl host, or perl version is too old (%s)", reason), function() end)
    return
  end
end

before_each(function()
  clear()
end)

describe('legacy perl provider', function()
  it('feature test', function()
    eq(1, eval('has("perl")'))
  end)

  it(':perl command', function()
    command('perl $vim->vars->{set_by_perl} = [100, 0];')
    eq({100, 0}, eval('g:set_by_perl'))
  end)

  it(':perlfile command', function()
    local fname = 'perlfile.pl'
    write_file(fname, '$vim->command("let set_by_perlfile = 123")')
    command('perlfile perlfile.pl')
    eq(123, eval('g:set_by_perlfile'))
    os.remove(fname)
  end)

  it(':perldo command', function()
    -- :perldo 1; doesn't change $_,
    -- the buffer should not be changed
    command('normal :perldo 1;')
    eq(false, meths.get_option_value('modified', {}))
    -- insert some text
    insert('abc\ndef\nghi')
    expect([[
      abc
      def
      ghi]])
    -- go to top and select and replace the first two lines
    feed('ggvj:perldo $_ = reverse ($_)."$linenr"<CR>')
    expect([[
      cba1
      fed2
      ghi]])
  end)

  it('perleval()', function()
    eq({1, 2, {['key'] = 'val'}}, eval([[perleval('[1, 2, {"key" => "val"}]')]]))
  end)
end)

describe('perl provider', function()
  teardown(function ()
    os.remove('Xtest-perl-hello.pl')
    os.remove('Xtest-perl-hello-plugin.pl')
  end)

  it('works', function()
    local fname = 'Xtest-perl-hello.pl'
    write_file(fname, [[
      package main;
      use strict;
      use warnings;
      use Neovim::Ext;
      use Neovim::Ext::MsgPack::RPC;

      my $session = Neovim::Ext::MsgPack::RPC::socket_session($ENV{NVIM});
      my $nvim = Neovim::Ext::from_session($session);
      $nvim->command('let g:job_out = "hello"');
      1;
    ]])
    command('let g:job_id = jobstart(["perl", "'..fname..'"])')
    retry(nil, 3000, function() eq('hello', eval('g:job_out')) end)
  end)

  it('plugin works', function()
    local fname = 'Xtest-perl-hello-plugin.pl'
    write_file(fname, [[
      package TestPlugin;
      use strict;
      use warnings;
      use parent qw(Neovim::Ext::Plugin);

      __PACKAGE__->register;

      @{TestPlugin::commands} = ();
      @{TestPlugin::specs} = ();
      sub test_command :nvim_command('TestCommand')
      {
        my ($this) = @_;
        $this->nvim->command('let g:job_out = "hello-plugin"');
      }

      package main;
      use strict;
      use warnings;
      use Neovim::Ext;
      use Neovim::Ext::MsgPack::RPC;

      my $session = Neovim::Ext::MsgPack::RPC::socket_session($ENV{NVIM});
      my $nvim = Neovim::Ext::from_session($session);
      my $plugin = TestPlugin->new($nvim);
      $plugin->test_command();
      1;
    ]])
    command('let g:job_id = jobstart(["perl", "'..fname..'"])')
    retry(nil, 3000, function() eq('hello-plugin', eval('g:job_out')) end)
  end)
end)