Last active
August 29, 2015 14:03
-
-
Save tooky/5673afd4599b02aef0eb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'minitest/autorun' | |
class Foo | |
attr_accessor :a | |
def initialize | |
@a = :unchanged | |
end | |
# call 'a' with explicit 'self' as receiver | |
def b; self.a; end | |
def b=(v); self.a = v; end | |
# call 'a' with implicit 'self' as receiver | |
def c; a; end | |
def c=(v); a = v; end | |
def value | |
@a | |
end | |
end | |
class ProtectedFoo < Foo | |
protected :a, :a= | |
end | |
class PrivateFoo < Foo | |
private :a, :a= | |
end | |
class PublicVisibilityTest < Minitest::Test | |
def setup | |
@foo = Foo.new | |
end | |
def test_reader_explicit_receiver_succeeds | |
assert_equal :unchanged, @foo.a | |
end | |
def test_writer_explicit_receiver_succeeds | |
@foo.a = 4 | |
assert_equal 4, @foo.value | |
end | |
def test_reader_explicit_self_receiver_succeeds | |
assert_equal :unchanged, @foo.b | |
end | |
def test_writer_explicit_self_receiver_succeeds | |
@foo.b = 4 | |
assert_equal 4, @foo.value | |
end | |
def test_reader_implicit_self_receiver_succeeds | |
assert_equal :unchanged, @foo.c | |
end | |
def test_writer_implicit_self_receiver_succeeds_but_does_nothing | |
@foo.c = 4 | |
assert_equal :unchanged, @foo.value | |
end | |
end | |
class ProtectedVisibilityTest < Minitest::Test | |
def setup | |
@foo = ProtectedFoo.new | |
end | |
def test_reader_explicit_receiver_fails | |
assert_raises(NoMethodError) do | |
@foo.a | |
end | |
end | |
def test_writer_explicit_receiver_fails | |
assert_raises(NoMethodError) do | |
@foo.a = 4 | |
end | |
assert_equal :unchanged, @foo.value | |
end | |
def test_reader_explicit_self_receiver_succeeds | |
assert_equal :unchanged, @foo.b | |
end | |
def test_writer_explicit_self_receiver_succeeds | |
@foo.b = 4 | |
assert_equal 4, @foo.value | |
end | |
def test_reader_implicit_self_receiver_succeeds | |
assert_equal :unchanged, @foo.c | |
end | |
def test_writer_implicit_self_receiver_succeeds_but_does_nothing | |
@foo.c = 4 | |
assert_equal :unchanged, @foo.value | |
end | |
end | |
class PrivateVisibilityTest < Minitest::Test | |
def setup | |
@foo = PrivateFoo.new | |
end | |
def test_reader_explicit_receiver_fails | |
assert_raises(NoMethodError) do | |
@foo.a | |
end | |
end | |
def test_writer_explicit_receiver_fails | |
assert_raises(NoMethodError) do | |
@foo.a = 4 | |
end | |
assert_equal :unchanged, @foo.value | |
end | |
def test_reader_explicit_self_receiver_fails | |
assert_raises(NoMethodError) do | |
@foo.b | |
end | |
end | |
def test_writer_explicit_self_receiver_fails | |
assert_raises(NoMethodError) do | |
@foo.b = 4 | |
end | |
assert_equal :unchanged, @foo.value | |
end | |
def test_reader_implicit_self_receiver_succeeds | |
assert_equal :unchanged, @foo.c | |
end | |
def test_writer_implicit_self_receiver_succeeds_but_does_nothing | |
@foo.c = 4 | |
assert_equal :unchanged, @foo.value | |
end | |
end | |
# Run options: --seed 18945 | |
# | |
# Running: | |
# | |
# ................F. | |
# | |
# Finished in 0.002823s, 6376.1955 runs/s, 7084.6617 assertions/s. | |
# | |
# 1) Failure: | |
# PrivateVisibilityTest#test_writer_explicit_self_receiver_fails [visibility_test.rb:126]: | |
# NoMethodError expected but nothing was raised. | |
# | |
# 18 runs, 20 assertions, 1 failures, 0 errors, 0 skips |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I'm not a fan of that warning. I avoid it by doing what you showed in the thread and specifically naming what I want to be
private
. I'm not sure why the warning exists, sorry.