1 require 'runit/cui/testrunner' 2 require 'runit/testcase' 3 4 # A unit test suite for public, protected, private, and secret instance 5 # methods. 6 # 7 # TODO: Write tests for class methods. 8 # 9 10 class Foo 11 include RUNIT::Assert 12 public 13 def public_foo 14 return :foo 15 end 16 17 protected 18 def protected_foo 19 return :foo 20 end 21 22 private 23 def private_foo 24 return :foo 25 end 26 27 secret 28 def secret_foo 29 return :foo 30 end 31 32 public 33 def public_self_test 34 self.public_foo 35 end 36 37 def protected_self_test 38 self.protected_foo 39 end 40 41 def private_self_test 42 assert_exception(NoMethodError) do 43 self.private_foo 44 end 45 end 46 47 def secret_self_test 48 assert_exception(NoMethodError) do 49 self.secret_foo 50 end 51 end 52 53 def public_test 54 public_foo 55 end 56 57 def protected_test 58 protected_foo 59 end 60 61 def private_test 62 private_foo 63 end 64 65 def secret_test 66 secret_foo 67 end 68 end 69 70 class Bar < Foo 71 def bar_public_self_test 72 self.public_foo 73 end 74 75 def bar_protected_self_test 76 self.protected_foo 77 end 78 79 def bar_private_self_test 80 assert_exception(NoMethodError) do 81 self.private_foo 82 end 83 end 84 85 def bar_secret_self_test 86 assert_exception(NoMethodError) do 87 self.secret_foo 88 end 89 end 90 91 def bar_public_test 92 public_foo 93 end 94 95 def bar_protected_test 96 protected_foo 97 end 98 99 def bar_private_test 100 private_foo 101 end 102 103 def bar_secret_test 104 assert_exception(NoMethodError) do 105 secret_foo 106 end 107 end 108 end 109 110 class SafeMethodTest < RUNIT::TestCase 111 def test_public_access 112 f = Foo.new 113 114 f.public_foo(); 115 116 assert_exception(NoMethodError) do 117 f.protected_foo() 118 end 119 120 assert_exception(NoMethodError) do 121 f.private_foo() 122 end 123 124 assert_exception(NoMethodError) do 125 f.secret_foo() 126 end 127 end 128 129 def test_same_class_access 130 f = Foo.new 131 f.public_methods.each do |m| 132 if m =~ /_test/ then 133 f.__send__(m) 134 end 135 end 136 end 137 138 def test_subclass_access 139 b = Bar.new 140 b.public_methods.each do |m| 141 if m =~ /_test/ then 142 b.__send__(m) 143 end 144 end 145 end 146 147 def test_instance_methods 148 foo_pub_im = Foo.public_instance_methods 149 foo_prot_im = Foo.protected_instance_methods 150 foo_priv_im = Foo.private_instance_methods 151 foo_secr_im = Foo.secret_instance_methods 152 assert_not_nil foo_pub_im.index("public_foo") 153 assert_not_nil foo_prot_im.index("protected_foo") 154 assert_not_nil foo_secr_im.index("secret_foo") 155 assert_nil foo_secr_im.index("public_foo") 156 end 157 158 def test_subclass_instance_methods 159 bar_pub_im = Bar.public_instance_methods 160 bar_prot_im = Bar.protected_instance_methods 161 bar_priv_im = Bar.private_instance_methods 162 bar_secr_im = Bar.secret_instance_methods 163 assert_nil bar_pub_im.index("public_foo") 164 assert_nil bar_prot_im.index("protected_foo") 165 assert_nil bar_secr_im.index("secret_foo") 166 assert_nil bar_secr_im.index("public_foo") 167 end 168 169 def test_methods 170 f = Foo.new 171 foo_pub = f.public_methods 172 foo_prot = f.protected_methods 173 foo_priv = f.private_methods 174 foo_secr = f.secret_methods 175 assert_not_nil foo_pub.index("public_foo") 176 assert_not_nil foo_prot.index("protected_foo") 177 assert_not_nil foo_secr.index("secret_foo") 178 assert_nil foo_secr.index("public_foo") 179 end 180 181 def test_subclass_methods 182 b = Bar.new 183 bar_pub = b.public_methods 184 bar_prot = b.protected_methods 185 bar_priv = b.private_methods 186 bar_secr = b.secret_methods 187 assert_not_nil bar_pub.index("public_foo") 188 assert_not_nil bar_prot.index("protected_foo") 189 assert_not_nil bar_secr.index("secret_foo") 190 assert_nil bar_secr.index("public_foo") 191 end 192 end 193 194 RUNIT::CUI::TestRunner.run(SafeMethodTest.suite)