@@ -691,6 +691,234 @@ def test_circular_constant_alias_target
691691 end
692692 end
693693
694+ def test_method_visibility_defaults_to_public
695+ with_context do |context |
696+ context . write! ( "file1.rb" , <<~RUBY )
697+ class Foo
698+ def bare; end
699+ end
700+ RUBY
701+
702+ graph = Rubydex ::Graph . new
703+ graph . index_all ( context . glob ( "**/*.rb" ) )
704+ graph . resolve
705+
706+ assert_equal ( :public , graph [ "Foo#bare()" ] . visibility )
707+ end
708+ end
709+
710+ def test_method_visibility_via_scope_flag
711+ with_context do |context |
712+ context . write! ( "file1.rb" , <<~RUBY )
713+ class Foo
714+ private
715+
716+ def hidden; end
717+
718+ protected
719+
720+ def guarded; end
721+
722+ public
723+
724+ def visible; end
725+ end
726+ RUBY
727+
728+ graph = Rubydex ::Graph . new
729+ graph . index_all ( context . glob ( "**/*.rb" ) )
730+ graph . resolve
731+
732+ assert_equal ( :private , graph [ "Foo#hidden()" ] . visibility )
733+ assert_equal ( :protected , graph [ "Foo#guarded()" ] . visibility )
734+ assert_equal ( :public , graph [ "Foo#visible()" ] . visibility )
735+ end
736+ end
737+
738+ def test_method_visibility_via_retroactive_call
739+ with_context do |context |
740+ context . write! ( "file1.rb" , <<~RUBY )
741+ class Foo
742+ def hidden; end
743+ private :hidden
744+
745+ def guarded; end
746+ protected :guarded
747+ end
748+ RUBY
749+
750+ graph = Rubydex ::Graph . new
751+ graph . index_all ( context . glob ( "**/*.rb" ) )
752+ graph . resolve
753+
754+ assert_equal ( :private , graph [ "Foo#hidden()" ] . visibility )
755+ assert_equal ( :protected , graph [ "Foo#guarded()" ] . visibility )
756+ end
757+ end
758+
759+ def test_constant_visibility_defaults_to_public
760+ with_context do |context |
761+ context . write! ( "file1.rb" , <<~RUBY )
762+ class Foo
763+ BAR = 1
764+ end
765+ RUBY
766+
767+ graph = Rubydex ::Graph . new
768+ graph . index_all ( context . glob ( "**/*.rb" ) )
769+ graph . resolve
770+
771+ assert_equal ( :public , graph [ "Foo::BAR" ] . visibility )
772+ end
773+ end
774+
775+ def test_constant_visibility_via_private_constant
776+ with_context do |context |
777+ context . write! ( "file1.rb" , <<~RUBY )
778+ class Foo
779+ BAR = 1
780+ private_constant :BAR
781+ end
782+ RUBY
783+
784+ graph = Rubydex ::Graph . new
785+ graph . index_all ( context . glob ( "**/*.rb" ) )
786+ graph . resolve
787+
788+ assert_equal ( :private , graph [ "Foo::BAR" ] . visibility )
789+ end
790+ end
791+
792+ def test_constant_alias_visibility
793+ with_context do |context |
794+ context . write! ( "file1.rb" , <<~RUBY )
795+ class Foo
796+ BAR = 1
797+ ALIAS = BAR
798+ private_constant :ALIAS
799+ end
800+ RUBY
801+
802+ graph = Rubydex ::Graph . new
803+ graph . index_all ( context . glob ( "**/*.rb" ) )
804+ graph . resolve
805+
806+ assert_equal ( :private , graph [ "Foo::ALIAS" ] . visibility )
807+ end
808+ end
809+
810+ def test_class_and_module_visibility_via_private_constant
811+ with_context do |context |
812+ context . write! ( "file1.rb" , <<~RUBY )
813+ class Outer
814+ class Inner; end
815+ module Helpers; end
816+ private_constant :Inner, :Helpers
817+ end
818+ RUBY
819+
820+ graph = Rubydex ::Graph . new
821+ graph . index_all ( context . glob ( "**/*.rb" ) )
822+ graph . resolve
823+
824+ assert_equal ( :private , graph [ "Outer::Inner" ] . visibility )
825+ assert_equal ( :private , graph [ "Outer::Helpers" ] . visibility )
826+ end
827+ end
828+
829+ def test_visibility_is_undefined_for_declarations_without_visibility
830+ with_context do |context |
831+ context . write! ( "file1.rb" , <<~RUBY )
832+ class Foo
833+ @@class_var = 1
834+
835+ def initialize
836+ @ivar = 1
837+ end
838+
839+ class << self; end
840+ end
841+
842+ $global = 1
843+ RUBY
844+
845+ graph = Rubydex ::Graph . new
846+ graph . index_all ( context . glob ( "**/*.rb" ) )
847+ graph . resolve
848+
849+ refute_respond_to ( graph [ "Foo::<Foo>" ] , :visibility )
850+ refute_respond_to ( graph [ "Foo\# @ivar" ] , :visibility )
851+ refute_respond_to ( graph [ "Foo\# @@class_var" ] , :visibility )
852+ refute_respond_to ( graph [ "$global" ] , :visibility )
853+ end
854+ end
855+
856+ def test_inline_module_function_visibility
857+ with_context do |context |
858+ context . write! ( "file1.rb" , <<~RUBY )
859+ module Foo
860+ module_function
861+
862+ def bar; end
863+ end
864+ RUBY
865+
866+ graph = Rubydex ::Graph . new
867+ graph . index_all ( context . glob ( "**/*.rb" ) )
868+ graph . resolve
869+
870+ assert_equal ( :private , graph [ "Foo#bar()" ] . visibility )
871+ assert_equal ( :public , graph [ "Foo::<Foo>#bar()" ] . visibility )
872+ end
873+ end
874+
875+ def test_visibility_predicates
876+ with_context do |context |
877+ context . write! ( "file1.rb" , <<~RUBY )
878+ class Foo
879+ def visible; end
880+
881+ def hidden; end
882+ private :hidden
883+
884+ def guarded; end
885+ protected :guarded
886+
887+ BAR = 1
888+ PRIVATE_BAR = 2
889+ private_constant :PRIVATE_BAR
890+ end
891+ RUBY
892+
893+ graph = Rubydex ::Graph . new
894+ graph . index_all ( context . glob ( "**/*.rb" ) )
895+ graph . resolve
896+
897+ visible = graph [ "Foo#visible()" ]
898+ assert_predicate ( visible , :public? )
899+ refute_predicate ( visible , :private? )
900+ refute_predicate ( visible , :protected? )
901+
902+ hidden = graph [ "Foo#hidden()" ]
903+ assert_predicate ( hidden , :private? )
904+ refute_predicate ( hidden , :public? )
905+ refute_predicate ( hidden , :protected? )
906+
907+ guarded = graph [ "Foo#guarded()" ]
908+ assert_predicate ( guarded , :protected? )
909+ refute_predicate ( guarded , :public? )
910+ refute_predicate ( guarded , :private? )
911+
912+ bar = graph [ "Foo::BAR" ]
913+ assert_predicate ( bar , :public? )
914+ refute_predicate ( bar , :private? )
915+
916+ private_bar = graph [ "Foo::PRIVATE_BAR" ]
917+ assert_predicate ( private_bar , :private? )
918+ refute_predicate ( private_bar , :public? )
919+ end
920+ end
921+
694922 def test_constant_alias_with_multiple_definitions_returns_one_resolved_target
695923 with_context do |context |
696924 context . write! ( "file1.rb" , <<~RUBY )
0 commit comments