22
33require 'repl_type_completor'
44require_relative './helper'
5+ require 'tmpdir'
56
67module TestReplTypeCompletor
78 class RequirePathsTest < TestCase
@@ -22,5 +23,48 @@ def test_require_relative_paths
2223 assert_not_include ReplTypeCompletor ::RequirePaths . require_relative_completions ( 'li' , project_root ) , 'lib/repl_type_completor/version'
2324 assert_include ReplTypeCompletor ::RequirePaths . require_relative_completions ( 'lib/' , project_root ) , 'lib/repl_type_completor/version'
2425 end
26+
27+ def clear_cache
28+ ReplTypeCompletor ::RequirePaths . instance_eval do
29+ remove_instance_variable ( :@gem_and_system_load_paths ) if defined? @gem_and_system_load_paths
30+ remove_instance_variable ( :@cache ) if defined? @cache
31+ end
32+ end
33+
34+ def test_require_paths_no_duplication
35+ # When base_dir/ base_dir/3.3.0 base_dir/3.3.0/arm64-darwin are in $LOAD_PATH,
36+ # "3.3.0/arm64-darwin/file", "arm64-darwin/file" and "file" will all require the same file.
37+ # Completion candidates should only include the shortest one.
38+ load_path_backup = $LOAD_PATH. dup
39+ dir0 = Dir . mktmpdir
40+ dir1 = File . join ( dir0 , '3.3.0' )
41+ dir2 = File . join ( dir1 , 'arm64-darwin' )
42+ dir3 = File . join ( dir1 , 'test_req_dir' )
43+ Dir . mkdir dir1
44+ Dir . mkdir dir2
45+ Dir . mkdir dir3
46+ File . write File . join ( dir0 , 'test_require_a.rb' ) , ''
47+ File . write File . join ( dir1 , 'test_require_a.rb' ) , ''
48+ File . write File . join ( dir2 , 'test_require_a.rb' ) , ''
49+ File . write File . join ( dir0 , 'test_require_b.rb' ) , ''
50+ File . write File . join ( dir1 , 'test_require_c.rb' ) , ''
51+ File . write File . join ( dir1 , 'arm64-darwin-foobar.rb' ) , ''
52+ File . write File . join ( dir2 , 'test_require_d.rb' ) , ''
53+ File . write File . join ( dir3 , 'test_require_e.rb' ) , ''
54+ $LOAD_PATH. push ( dir0 , dir1 , dir2 )
55+ clear_cache
56+
57+ files = %w[ test_req_dir/test_require_e test_require_a test_require_b test_require_c test_require_d ]
58+ assert_equal files , ReplTypeCompletor ::RequirePaths . require_completions ( 'test_req' ) . sort
59+ candidates = ReplTypeCompletor ::RequirePaths . require_completions ( '' )
60+ assert_include candidates , 'arm64-darwin-foobar'
61+ files . each do |path |
62+ assert_not_include candidates , "3.3.0/#{ path } "
63+ assert_not_include candidates , "3.3.0/arm64-darwin/#{ path } "
64+ assert_not_include candidates , "arm64-darwin/#{ path } "
65+ end
66+ ensure
67+ $LOAD_PATH. replace load_path_backup
68+ end
2569 end
2670end
0 commit comments