summaryrefslogtreecommitdiff
path: root/test/irb/test_completion.rb
blob: 4bc3fc7783e5214d133aea91a80d852aacb06062 (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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# frozen_string_literal: false
require "test/unit"
require "irb"

module TestIRB
  class TestCompletion < Test::Unit::TestCase
    def setup
      # make sure require completion candidates are not cached
      IRB::InputCompletor.class_variable_set(:@@files_from_load_path, nil)
    end

    def test_nonstring_module_name
      begin
        require "irb/completion"
        bug5938 = '[ruby-core:42244]'
        bundle_exec = ENV.key?('BUNDLE_GEMFILE') ? ['-rbundler/setup'] : []
        cmds = bundle_exec + %W[-W0 -rirb -rirb/completion -e IRB.setup(__FILE__)
         -e IRB.conf[:MAIN_CONTEXT]=IRB::Irb.new.context
         -e module\sFoo;def\sself.name;//;end;end
         -e IRB::InputCompletor::CompletionProc.call("[1].first.")
         -- -f --]
        status = assert_in_out_err(cmds, "", //, [], bug5938)
        assert(status.success?, bug5938)
      rescue LoadError
        pend "cannot load irb/completion"
      end
    end

    def test_complete_numeric
      assert_include(IRB::InputCompletor.retrieve_completion_data("1r.positi", bind: binding), "1r.positive?")
      assert_empty(IRB::InputCompletor.retrieve_completion_data("1i.positi", bind: binding))
    end

    def test_complete_symbol
      %w"UTF-16LE UTF-7".each do |enc|
        "K".force_encoding(enc).to_sym
      rescue
      end
      _ = :aiueo
      assert_include(IRB::InputCompletor.retrieve_completion_data(":a", bind: binding), ":aiueo")
      assert_empty(IRB::InputCompletor.retrieve_completion_data(":irb_unknown_symbol_abcdefg", bind: binding))
    end

    def test_complete_invalid_three_colons
      assert_empty(IRB::InputCompletor.retrieve_completion_data(":::A", bind: binding))
      assert_empty(IRB::InputCompletor.retrieve_completion_data(":::", bind: binding))
    end

    def test_complete_absolute_constants_with_special_characters
      assert_empty(IRB::InputCompletor.retrieve_completion_data("::A:", bind: binding))
      assert_empty(IRB::InputCompletor.retrieve_completion_data("::A.", bind: binding))
      assert_empty(IRB::InputCompletor.retrieve_completion_data("::A(", bind: binding))
      assert_empty(IRB::InputCompletor.retrieve_completion_data("::A)", bind: binding))
    end

    def test_complete_symbol_failure
      assert_nil(IRB::InputCompletor::PerfectMatchedProc.(":aiueo", bind: binding))
    end

    def test_complete_reserved_words
      candidates = IRB::InputCompletor.retrieve_completion_data("de", bind: binding)
      %w[def defined?].each do |word|
        assert_include candidates, word
      end

      candidates = IRB::InputCompletor.retrieve_completion_data("__", bind: binding)
      %w[__ENCODING__ __LINE__ __FILE__].each do |word|
        assert_include candidates, word
      end
    end

    def test_complete_predicate?
      candidates = IRB::InputCompletor.retrieve_completion_data("1.posi", bind: binding)
      assert_include candidates, '1.positive?'

      namespace = IRB::InputCompletor.retrieve_completion_data("1.positive?", bind: binding, doc_namespace: true)
      assert_equal "Integer.positive?", namespace
    end

    def test_complete_require
      candidates = IRB::InputCompletor::CompletionProc.("'irb", "require ", "")
      %w['irb/init 'irb/ruby-lex].each do |word|
        assert_include candidates, word
      end
      # Test cache
      candidates = IRB::InputCompletor::CompletionProc.("'irb", "require ", "")
      %w['irb/init 'irb/ruby-lex].each do |word|
        assert_include candidates, word
      end
    end

    def test_complete_require_with_pathname_in_load_path
      temp_dir = Dir.mktmpdir
      File.write(File.join(temp_dir, "foo.rb"), "test")
      test_path = Pathname.new(temp_dir)
      $LOAD_PATH << test_path

      candidates = IRB::InputCompletor::CompletionProc.("'foo", "require ", "")
      assert_equal ["'foo"], candidates
    ensure
      $LOAD_PATH.pop if test_path
      FileUtils.remove_entry(temp_dir) if temp_dir
    end

    def test_complete_require_with_string_convertable_in_load_path
      temp_dir = Dir.mktmpdir
      File.write(File.join(temp_dir, "foo.rb"), "test")
      object = Object.new
      object.define_singleton_method(:to_s) { temp_dir }
      $LOAD_PATH << object

      candidates = IRB::InputCompletor::CompletionProc.("'foo", "require ", "")
      assert_equal ["'foo"], candidates
    ensure
      $LOAD_PATH.pop if object
      FileUtils.remove_entry(temp_dir) if temp_dir
    end

    def test_complete_require_with_malformed_object_in_load_path
      object = Object.new
      def object.to_s; raise; end
      $LOAD_PATH << object

      assert_empty IRB::InputCompletor::CompletionProc.("'foo", "require ", "")
    ensure
      $LOAD_PATH.pop if object
    end

    def test_complete_require_library_name_first
      pend 'Need to use virtual library paths'
      candidates = IRB::InputCompletor::CompletionProc.("'csv", "require ", "")
      assert_equal "'csv", candidates.first
    end

    def test_complete_require_relative
      candidates = Dir.chdir(__dir__ + "/../..") do
        IRB::InputCompletor::CompletionProc.("'lib/irb", "require_relative ", "")
      end
      %w['lib/irb/init 'lib/irb/ruby-lex].each do |word|
        assert_include candidates, word
      end
      # Test cache
      candidates = Dir.chdir(__dir__ + "/../..") do
        IRB::InputCompletor::CompletionProc.("'lib/irb", "require_relative ", "")
      end
      %w['lib/irb/init 'lib/irb/ruby-lex].each do |word|
        assert_include candidates, word
      end
    end

    def test_complete_variable
      str_example = ''
      str_example.clear # suppress "assigned but unused variable" warning
      assert_include(IRB::InputCompletor.retrieve_completion_data("str_examp", bind: binding), "str_example")
      assert_equal(IRB::InputCompletor.retrieve_completion_data("str_example", bind: binding, doc_namespace: true), "String")
      assert_equal(IRB::InputCompletor.retrieve_completion_data("str_example.to_s", bind: binding, doc_namespace: true), "String.to_s")
    end

    def test_complete_class_method
      assert_include(IRB::InputCompletor.retrieve_completion_data("String.new", bind: binding), "String.new")
      assert_equal(IRB::InputCompletor.retrieve_completion_data("String.new", bind: binding, doc_namespace: true), "String.new")
    end
  end
end