ruby-lsp 0.17.1 → 0.17.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -107,16 +107,16 @@ module RubyIndexer
107
107
  RUBY
108
108
 
109
109
  result = @index.fuzzy_search("Bar")
110
- assert_equal(1, result.length)
111
- assert_equal(@index["Bar"].first, result.first)
110
+ assert_equal(3, result.length)
111
+ assert_equal(["Bar", "Backtrace", "Base"], result.map(&:name))
112
112
 
113
113
  result = @index.fuzzy_search("foobarsomeking")
114
- assert_equal(5, result.length)
115
- assert_equal(["Foo::Baz::Something", "Foo::Bar", "Foo::Baz", "Foo", "Bar"], result.map(&:name))
114
+ assert_equal(6, result.length)
115
+ assert_equal(["Foo::Baz::Something", "Foo::Bar", "Foo::Baz", "Foo", "Base", "Bar"], result.map(&:name))
116
116
 
117
117
  result = @index.fuzzy_search("FooBaz")
118
- assert_equal(4, result.length)
119
- assert_equal(["Foo::Baz", "Foo::Bar", "Foo", "Foo::Baz::Something"], result.map(&:name))
118
+ assert_equal(5, result.length)
119
+ assert_equal(["Foo::Baz", "Foo::Bar", "Foo", "Foo::Baz::Something", "Float"], result.map(&:name))
120
120
  end
121
121
 
122
122
  def test_index_single_ignores_directories
@@ -140,6 +140,8 @@ module RubyIndexer
140
140
  end
141
141
 
142
142
  def test_searching_for_entries_based_on_prefix
143
+ # For this test, it's easier if we don't include core classes and modules
144
+ @index = Index.new
143
145
  @index.index_single(IndexablePath.new("/fake", "/fake/path/foo.rb"), <<~RUBY)
144
146
  class Foo::Bar
145
147
  end
@@ -181,6 +183,9 @@ module RubyIndexer
181
183
 
182
184
  def test_resolving_aliases_to_non_existing_constants_with_conflicting_names
183
185
  @index.index_single(IndexablePath.new("/fake", "/fake/path/foo.rb"), <<~RUBY)
186
+ class Float
187
+ end
188
+
184
189
  module Foo
185
190
  class Float < self
186
191
  INFINITY = ::Float::INFINITY
@@ -315,7 +320,8 @@ module RubyIndexer
315
320
 
316
321
  def test_index_single_does_not_fail_for_non_existing_file
317
322
  @index.index_single(IndexablePath.new(nil, "/fake/path/foo.rb"))
318
- assert_empty(@index.instance_variable_get(:@entries))
323
+ entries_after_indexing = @index.instance_variable_get(:@entries).keys
324
+ assert_equal(@default_indexed_entries.keys, entries_after_indexing)
319
325
  end
320
326
 
321
327
  def test_linearized_ancestors_basic_ordering
@@ -339,9 +345,9 @@ module RubyIndexer
339
345
  "B",
340
346
  "A",
341
347
  "Foo",
342
- # "Object",
343
- # "Kernel",
344
- # "BasicObject",
348
+ "Object",
349
+ "Kernel",
350
+ "BasicObject",
345
351
  ],
346
352
  @index.linearized_ancestors_of("Foo"),
347
353
  )
@@ -351,9 +357,9 @@ module RubyIndexer
351
357
  "Bar",
352
358
  "B",
353
359
  "A",
354
- # "Object",
355
- # "Kernel",
356
- # "BasicObject",
360
+ "Object",
361
+ "Kernel",
362
+ "BasicObject",
357
363
  ],
358
364
  @index.linearized_ancestors_of("Bar"),
359
365
  )
@@ -401,9 +407,9 @@ module RubyIndexer
401
407
  "A",
402
408
  "C",
403
409
  "Bar",
404
- # "Object",
405
- # "Kernel",
406
- # "BasicObject",
410
+ "Object",
411
+ "Kernel",
412
+ "BasicObject",
407
413
  ],
408
414
  @index.linearized_ancestors_of("Foo"),
409
415
  )
@@ -432,9 +438,9 @@ module RubyIndexer
432
438
  "Foo",
433
439
  "B",
434
440
  "A",
435
- # "Object",
436
- # "Kernel",
437
- # "BasicObject",
441
+ "Object",
442
+ "Kernel",
443
+ "BasicObject",
438
444
  ],
439
445
  @index.linearized_ancestors_of("Foo"),
440
446
  )
@@ -444,9 +450,9 @@ module RubyIndexer
444
450
  "B",
445
451
  "A",
446
452
  "Bar",
447
- # "Object",
448
- # "Kernel",
449
- # "BasicObject",
453
+ "Object",
454
+ "Kernel",
455
+ "BasicObject",
450
456
  ],
451
457
  @index.linearized_ancestors_of("Bar"),
452
458
  )
@@ -493,9 +499,9 @@ module RubyIndexer
493
499
  [
494
500
  "A",
495
501
  "Foo",
496
- # "Object",
497
- # "Kernel",
498
- # "BasicObject",
502
+ "Object",
503
+ "Kernel",
504
+ "BasicObject",
499
505
  ],
500
506
  @index.linearized_ancestors_of("Foo"),
501
507
  )
@@ -505,9 +511,9 @@ module RubyIndexer
505
511
  "A",
506
512
  "Bar",
507
513
  "A",
508
- # "Object",
509
- # "Kernel",
510
- # "BasicObject",
514
+ "Object",
515
+ "Kernel",
516
+ "BasicObject",
511
517
  ],
512
518
  @index.linearized_ancestors_of("Bar"),
513
519
  )
@@ -519,15 +525,7 @@ module RubyIndexer
519
525
  end
520
526
  RUBY
521
527
 
522
- assert_equal(
523
- [
524
- "Foo",
525
- # "Object",
526
- # "Kernel",
527
- # "BasicObject",
528
- ],
529
- @index.linearized_ancestors_of("Foo"),
530
- )
528
+ assert_equal(["Foo"], @index.linearized_ancestors_of("Foo"))
531
529
  end
532
530
 
533
531
  def test_ancestors_linearization_complex_prepend_duplication
@@ -552,9 +550,9 @@ module RubyIndexer
552
550
  "B",
553
551
  "C",
554
552
  "Foo",
555
- # "Object",
556
- # "Kernel",
557
- # "BasicObject",
553
+ "Object",
554
+ "Kernel",
555
+ "BasicObject",
558
556
  ],
559
557
  @index.linearized_ancestors_of("Foo"),
560
558
  )
@@ -582,9 +580,9 @@ module RubyIndexer
582
580
  "C",
583
581
  "B",
584
582
  "A",
585
- # "Object",
586
- # "Kernel",
587
- # "BasicObject",
583
+ "Object",
584
+ "Kernel",
585
+ "BasicObject",
588
586
  ],
589
587
  @index.linearized_ancestors_of("Foo"),
590
588
  )
@@ -613,9 +611,9 @@ module RubyIndexer
613
611
  "Foo::Bar",
614
612
  "Foo::Baz",
615
613
  "Foo::Something",
616
- # "Object",
617
- # "Kernel",
618
- # "BasicObject",
614
+ "Object",
615
+ "Kernel",
616
+ "BasicObject",
619
617
  ],
620
618
  @index.linearized_ancestors_of("Foo::Bar"),
621
619
  )
@@ -623,9 +621,7 @@ module RubyIndexer
623
621
 
624
622
  def test_linearizing_ancestors_for_non_existing_namespaces
625
623
  index(<<~RUBY)
626
- module Kernel
627
- def Array(a); end
628
- end
624
+ def Bar(a); end
629
625
  RUBY
630
626
 
631
627
  assert_raises(Index::NonExistingNamespaceError) do
@@ -633,7 +629,7 @@ module RubyIndexer
633
629
  end
634
630
 
635
631
  assert_raises(Index::NonExistingNamespaceError) do
636
- @index.linearized_ancestors_of("Array")
632
+ @index.linearized_ancestors_of("Bar")
637
633
  end
638
634
  end
639
635
 
@@ -754,7 +750,7 @@ module RubyIndexer
754
750
  indexable_path = IndexablePath.new(nil, File.join(dir, "foo.rb"))
755
751
  @index.index_single(indexable_path)
756
752
 
757
- assert_equal(["Bar", "Foo"], @index.linearized_ancestors_of("Bar"))
753
+ assert_equal(["Bar", "Foo", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Bar"))
758
754
 
759
755
  # Remove include to invalidate the ancestor tree
760
756
  File.write(File.join(dir, "foo.rb"), <<~RUBY)
@@ -767,7 +763,7 @@ module RubyIndexer
767
763
 
768
764
  @index.handle_change(indexable_path)
769
765
  assert_empty(@index.instance_variable_get(:@ancestors))
770
- assert_equal(["Bar"], @index.linearized_ancestors_of("Bar"))
766
+ assert_equal(["Bar", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Bar"))
771
767
  end
772
768
  end
773
769
  end
@@ -788,7 +784,7 @@ module RubyIndexer
788
784
  indexable_path = IndexablePath.new(nil, File.join(dir, "foo.rb"))
789
785
  @index.index_single(indexable_path)
790
786
 
791
- assert_equal(["Bar", "Foo"], @index.linearized_ancestors_of("Bar"))
787
+ assert_equal(["Bar", "Foo", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Bar"))
792
788
 
793
789
  # Remove include to invalidate the ancestor tree
794
790
  File.write(File.join(dir, "foo.rb"), <<~RUBY)
@@ -804,7 +800,7 @@ module RubyIndexer
804
800
 
805
801
  @index.handle_change(indexable_path)
806
802
  refute_empty(@index.instance_variable_get(:@ancestors))
807
- assert_equal(["Bar", "Foo"], @index.linearized_ancestors_of("Bar"))
803
+ assert_equal(["Bar", "Foo", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Bar"))
808
804
  end
809
805
  end
810
806
  end
@@ -824,7 +820,7 @@ module RubyIndexer
824
820
  indexable_path = IndexablePath.new(nil, File.join(dir, "foo.rb"))
825
821
  @index.index_single(indexable_path)
826
822
 
827
- assert_equal(["Bar", "Foo"], @index.linearized_ancestors_of("Bar"))
823
+ assert_equal(["Bar", "Foo", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Bar"))
828
824
 
829
825
  # Remove include to invalidate the ancestor tree
830
826
  File.write(File.join(dir, "foo.rb"), <<~RUBY)
@@ -837,9 +833,345 @@ module RubyIndexer
837
833
 
838
834
  @index.handle_change(indexable_path)
839
835
  assert_empty(@index.instance_variable_get(:@ancestors))
840
- assert_equal(["Bar"], @index.linearized_ancestors_of("Bar"))
836
+ assert_equal(["Bar", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Bar"))
841
837
  end
842
838
  end
843
839
  end
840
+
841
+ def test_resolving_inherited_constants
842
+ index(<<~RUBY)
843
+ module Foo
844
+ CONST = 1
845
+ end
846
+
847
+ module Baz
848
+ CONST = 2
849
+ end
850
+
851
+ module Qux
852
+ include Foo
853
+ end
854
+
855
+ module Namespace
856
+ CONST = 3
857
+
858
+ include Baz
859
+
860
+ class Bar
861
+ include Qux
862
+ end
863
+ end
864
+
865
+ CONST = 4
866
+ RUBY
867
+
868
+ entry = T.must(@index.resolve("CONST", ["Namespace", "Bar"])&.first)
869
+ assert_equal(14, entry.location.start_line)
870
+ end
871
+
872
+ def test_resolving_inherited_alised_namespace
873
+ index(<<~RUBY)
874
+ module Bar
875
+ TARGET = 123
876
+ end
877
+
878
+ module Foo
879
+ CONST = Bar
880
+ end
881
+
882
+ module Namespace
883
+ class Bar
884
+ include Foo
885
+ end
886
+ end
887
+ RUBY
888
+
889
+ entry = T.must(@index.resolve("Foo::CONST::TARGET", [])&.first)
890
+ assert_equal(2, entry.location.start_line)
891
+
892
+ entry = T.must(@index.resolve("Namespace::Bar::CONST::TARGET", [])&.first)
893
+ assert_equal(2, entry.location.start_line)
894
+ end
895
+
896
+ def test_resolving_same_constant_from_different_scopes
897
+ index(<<~RUBY)
898
+ module Namespace
899
+ CONST = 123
900
+
901
+ class Parent
902
+ CONST = 321
903
+ end
904
+
905
+ class Child < Parent
906
+ end
907
+ end
908
+ RUBY
909
+
910
+ entry = T.must(@index.resolve("CONST", ["Namespace", "Child"])&.first)
911
+ assert_equal(2, entry.location.start_line)
912
+
913
+ entry = T.must(@index.resolve("Namespace::Child::CONST", [])&.first)
914
+ assert_equal(5, entry.location.start_line)
915
+ end
916
+
917
+ def test_resolving_prepended_constants
918
+ index(<<~RUBY)
919
+ module Included
920
+ CONST = 123
921
+ end
922
+
923
+ module Prepended
924
+ CONST = 321
925
+ end
926
+
927
+ class Foo
928
+ include Included
929
+ prepend Prepended
930
+ end
931
+
932
+ class Bar
933
+ CONST = 456
934
+ include Included
935
+ prepend Prepended
936
+ end
937
+ RUBY
938
+
939
+ entry = T.must(@index.resolve("CONST", ["Foo"])&.first)
940
+ assert_equal(6, entry.location.start_line)
941
+
942
+ entry = T.must(@index.resolve("Foo::CONST", [])&.first)
943
+ assert_equal(6, entry.location.start_line)
944
+
945
+ entry = T.must(@index.resolve("Bar::CONST", [])&.first)
946
+ assert_equal(15, entry.location.start_line)
947
+ end
948
+
949
+ def test_resolving_constants_favors_ancestors_over_top_level
950
+ index(<<~RUBY)
951
+ module Value1
952
+ CONST = 1
953
+ end
954
+
955
+ module Value2
956
+ CONST = 2
957
+ end
958
+
959
+ CONST = 3
960
+ module First
961
+ include Value1
962
+
963
+ module Second
964
+ include Value2
965
+ end
966
+ end
967
+ RUBY
968
+
969
+ entry = T.must(@index.resolve("CONST", ["First", "Second"])&.first)
970
+ assert_equal(6, entry.location.start_line)
971
+ end
972
+
973
+ def test_resolving_circular_alias
974
+ index(<<~RUBY)
975
+ module Namespace
976
+ FOO = BAR
977
+ BAR = FOO
978
+ end
979
+ RUBY
980
+
981
+ foo_entry = T.must(@index.resolve("FOO", ["Namespace"])&.first)
982
+ assert_equal(2, foo_entry.location.start_line)
983
+ assert_instance_of(Entry::Alias, foo_entry)
984
+
985
+ bar_entry = T.must(@index.resolve("BAR", ["Namespace"])&.first)
986
+ assert_equal(3, bar_entry.location.start_line)
987
+ assert_instance_of(Entry::Alias, bar_entry)
988
+ end
989
+
990
+ def test_resolving_circular_alias_three_levels
991
+ index(<<~RUBY)
992
+ module Namespace
993
+ FOO = BAR
994
+ BAR = BAZ
995
+ BAZ = FOO
996
+ end
997
+ RUBY
998
+
999
+ foo_entry = T.must(@index.resolve("FOO", ["Namespace"])&.first)
1000
+ assert_equal(2, foo_entry.location.start_line)
1001
+ assert_instance_of(Entry::Alias, foo_entry)
1002
+
1003
+ bar_entry = T.must(@index.resolve("BAR", ["Namespace"])&.first)
1004
+ assert_equal(3, bar_entry.location.start_line)
1005
+ assert_instance_of(Entry::Alias, bar_entry)
1006
+
1007
+ baz_entry = T.must(@index.resolve("BAZ", ["Namespace"])&.first)
1008
+ assert_equal(4, baz_entry.location.start_line)
1009
+ assert_instance_of(Entry::Alias, baz_entry)
1010
+ end
1011
+
1012
+ def test_resolving_top_level_compact_reference
1013
+ index(<<~RUBY)
1014
+ class Foo::Bar
1015
+ end
1016
+ RUBY
1017
+
1018
+ foo_entry = T.must(@index.resolve("Foo::Bar", [])&.first)
1019
+ assert_equal(1, foo_entry.location.start_line)
1020
+ assert_instance_of(Entry::Class, foo_entry)
1021
+ end
1022
+
1023
+ def test_resolving_references_with_redundant_namespaces
1024
+ index(<<~RUBY)
1025
+ module Bar
1026
+ CONST = 1
1027
+ end
1028
+
1029
+ module A
1030
+ CONST = 2
1031
+
1032
+ module B
1033
+ CONST = 3
1034
+
1035
+ class Foo
1036
+ include Bar
1037
+ end
1038
+
1039
+ A::B::Foo::CONST
1040
+ end
1041
+ end
1042
+ RUBY
1043
+
1044
+ foo_entry = T.must(@index.resolve("A::B::Foo::CONST", ["A", "B"])&.first)
1045
+ assert_equal(2, foo_entry.location.start_line)
1046
+ end
1047
+
1048
+ def test_resolving_qualified_references
1049
+ index(<<~RUBY)
1050
+ module Namespace
1051
+ class Entry
1052
+ CONST = 1
1053
+ end
1054
+ end
1055
+
1056
+ module Namespace
1057
+ class Index
1058
+ end
1059
+ end
1060
+ RUBY
1061
+
1062
+ foo_entry = T.must(@index.resolve("Entry::CONST", ["Namespace", "Index"])&.first)
1063
+ assert_equal(3, foo_entry.location.start_line)
1064
+ end
1065
+
1066
+ def test_resolving_unqualified_references
1067
+ index(<<~RUBY)
1068
+ module Foo
1069
+ CONST = 1
1070
+ end
1071
+
1072
+ module Namespace
1073
+ CONST = 2
1074
+
1075
+ class Index
1076
+ include Foo
1077
+ end
1078
+ end
1079
+ RUBY
1080
+
1081
+ foo_entry = T.must(@index.resolve("CONST", ["Namespace", "Index"])&.first)
1082
+ assert_equal(6, foo_entry.location.start_line)
1083
+ end
1084
+
1085
+ def test_resolving_references_with_only_top_level_declaration
1086
+ index(<<~RUBY)
1087
+ CONST = 1
1088
+
1089
+ module Foo; end
1090
+
1091
+ module Namespace
1092
+ class Index
1093
+ include Foo
1094
+ end
1095
+ end
1096
+ RUBY
1097
+
1098
+ foo_entry = T.must(@index.resolve("CONST", ["Namespace", "Index"])&.first)
1099
+ assert_equal(1, foo_entry.location.start_line)
1100
+ end
1101
+
1102
+ def test_instance_variables_completions_from_different_owners_with_conflicting_names
1103
+ index(<<~RUBY)
1104
+ class Foo
1105
+ def initialize
1106
+ @bar = 1
1107
+ end
1108
+ end
1109
+
1110
+ class Bar
1111
+ def initialize
1112
+ @bar = 2
1113
+ end
1114
+ end
1115
+ RUBY
1116
+
1117
+ entry = T.must(@index.instance_variable_completion_candidates("@", "Bar")&.first)
1118
+ assert_equal("@bar", entry.name)
1119
+ assert_equal("Bar", T.must(entry.owner).name)
1120
+ end
1121
+
1122
+ def test_resolving_a_qualified_reference
1123
+ index(<<~RUBY)
1124
+ class Base
1125
+ module Third
1126
+ CONST = 1
1127
+ end
1128
+ end
1129
+
1130
+ class Foo
1131
+ module Third
1132
+ CONST = 2
1133
+ end
1134
+
1135
+ class Second < Base
1136
+ end
1137
+ end
1138
+ RUBY
1139
+
1140
+ foo_entry = T.must(@index.resolve("Third::CONST", ["Foo"])&.first)
1141
+ assert_equal(9, foo_entry.location.start_line)
1142
+ end
1143
+
1144
+ def test_resolving_unindexed_constant_with_no_nesting
1145
+ assert_nil(@index.resolve("RSpec", []))
1146
+ end
1147
+
1148
+ def test_object_superclass_resolution
1149
+ @index.index_single(IndexablePath.new(nil, "/fake/path/foo.rb"), <<~RUBY)
1150
+ module Foo
1151
+ class Object; end
1152
+
1153
+ class Bar; end
1154
+ class Baz < Object; end
1155
+ end
1156
+ RUBY
1157
+
1158
+ assert_equal(["Foo::Bar", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Foo::Bar"))
1159
+ assert_equal(
1160
+ ["Foo::Baz", "Foo::Object", "Object", "Kernel", "BasicObject"],
1161
+ @index.linearized_ancestors_of("Foo::Baz"),
1162
+ )
1163
+ end
1164
+
1165
+ def test_top_level_object_superclass_resolution
1166
+ @index.index_single(IndexablePath.new(nil, "/fake/path/foo.rb"), <<~RUBY)
1167
+ module Foo
1168
+ class Object; end
1169
+
1170
+ class Bar < ::Object; end
1171
+ end
1172
+ RUBY
1173
+
1174
+ assert_equal(["Foo::Bar", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Foo::Bar"))
1175
+ end
844
1176
  end
845
1177
  end
@@ -378,5 +378,25 @@ module RubyIndexer
378
378
  entry = T.must(@index["third"]&.first)
379
379
  assert_equal("Foo", T.must(entry.owner).name)
380
380
  end
381
+
382
+ def test_keeps_track_of_aliases
383
+ index(<<~RUBY)
384
+ class Foo
385
+ alias whatever to_s
386
+ alias_method :foo, :to_a
387
+ alias_method "bar", "to_a"
388
+
389
+ # These two are not indexed because they are dynamic or incomplete
390
+ alias_method baz, :to_a
391
+ alias_method :baz
392
+ end
393
+ RUBY
394
+
395
+ assert_entry("whatever", Entry::UnresolvedMethodAlias, "/fake/path/foo.rb:1-8:1-16")
396
+ assert_entry("foo", Entry::UnresolvedMethodAlias, "/fake/path/foo.rb:2-15:2-19")
397
+ assert_entry("bar", Entry::UnresolvedMethodAlias, "/fake/path/foo.rb:3-15:3-20")
398
+ # Foo plus 3 valid aliases
399
+ assert_equal(4, @index.instance_variable_get(:@entries).length - @default_indexed_entries.length)
400
+ end
381
401
  end
382
402
  end
@@ -0,0 +1,42 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ require_relative "test_case"
5
+
6
+ module RubyIndexer
7
+ class RBSIndexerTest < TestCase
8
+ def test_index_core_classes
9
+ entries = @index["Array"]
10
+ refute_nil(entries)
11
+ assert_equal(1, entries.length)
12
+ entry = entries.first
13
+ assert_match(%r{/gems/rbs-.*/core/array.rbs}, entry.file_path)
14
+ assert_equal("array.rbs", entry.file_name)
15
+ assert_equal("Object", entry.parent_class)
16
+ assert_equal(1, entry.mixin_operations.length)
17
+ enumerable_include = entry.mixin_operations.first
18
+ assert_equal("Enumerable", enumerable_include.module_name)
19
+
20
+ # Using fixed positions would be fragile, so let's just check some basics.
21
+ assert_operator(entry.location.start_line, :>, 0)
22
+ assert_operator(entry.location.end_line, :>, entry.location.start_line)
23
+ assert_equal(0, entry.location.start_column)
24
+ assert_operator(entry.location.end_column, :>, 0)
25
+ end
26
+
27
+ def test_index_core_modules
28
+ entries = @index["Kernel"]
29
+ refute_nil(entries)
30
+ assert_equal(1, entries.length)
31
+ entry = entries.first
32
+ assert_match(%r{/gems/rbs-.*/core/kernel.rbs}, entry.file_path)
33
+ assert_equal("kernel.rbs", entry.file_name)
34
+
35
+ # Using fixed positions would be fragile, so let's just check some basics.
36
+ assert_operator(entry.location.start_line, :>, 0)
37
+ assert_operator(entry.location.end_line, :>, entry.location.start_line)
38
+ assert_equal(0, entry.location.start_column)
39
+ assert_operator(entry.location.end_column, :>, 0)
40
+ end
41
+ end
42
+ end
@@ -7,6 +7,8 @@ module RubyIndexer
7
7
  class TestCase < Minitest::Test
8
8
  def setup
9
9
  @index = Index.new
10
+ RBSIndexer.new(@index).index_ruby_core
11
+ @default_indexed_entries = @index.instance_variable_get(:@entries).dup
10
12
  end
11
13
 
12
14
  private
@@ -17,6 +19,7 @@ module RubyIndexer
17
19
 
18
20
  def assert_entry(expected_name, type, expected_location, visibility: nil)
19
21
  entries = @index[expected_name]
22
+ refute_nil(entries, "Expected #{expected_name} to be indexed")
20
23
  refute_empty(entries, "Expected #{expected_name} to be indexed")
21
24
 
22
25
  entry = entries.first
@@ -41,6 +44,10 @@ module RubyIndexer
41
44
  assert_empty(@index.instance_variable_get(:@entries), "Expected nothing to be indexed")
42
45
  end
43
46
 
47
+ def assert_no_indexed_entries
48
+ assert_equal(@default_indexed_entries, @index.instance_variable_get(:@entries))
49
+ end
50
+
44
51
  def assert_no_entry(entry)
45
52
  refute(@index.instance_variable_get(:@entries).key?(entry), "Expected '#{entry}' to not be indexed")
46
53
  end