naught 0.0.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +2 -0
- data/.rubocop.yml +74 -0
- data/.travis.yml +20 -2
- data/Changelog.md +8 -2
- data/Gemfile +24 -2
- data/README.markdown +30 -7
- data/Rakefile +11 -2
- data/lib/naught.rb +1 -1
- data/lib/naught/basic_object.rb +17 -0
- data/lib/naught/conversions.rb +55 -0
- data/lib/naught/null_class_builder.rb +33 -21
- data/lib/naught/null_class_builder/command.rb +3 -3
- data/lib/naught/null_class_builder/commands/define_explicit_conversions.rb +3 -7
- data/lib/naught/null_class_builder/commands/define_implicit_conversions.rb +7 -2
- data/lib/naught/null_class_builder/commands/impersonate.rb +2 -3
- data/lib/naught/null_class_builder/commands/mimic.rb +4 -7
- data/lib/naught/null_class_builder/commands/pebble.rb +3 -5
- data/lib/naught/null_class_builder/commands/predicates_return.rb +1 -2
- data/lib/naught/null_class_builder/commands/singleton.rb +1 -1
- data/lib/naught/null_class_builder/commands/traceable.rb +3 -2
- data/lib/naught/version.rb +1 -1
- data/naught.gemspec +11 -16
- data/spec/base_object_spec.rb +2 -2
- data/spec/basic_null_object_spec.rb +3 -3
- data/spec/blackhole_spec.rb +4 -4
- data/spec/explicit_conversions_spec.rb +23 -0
- data/spec/functions/actual_spec.rb +4 -4
- data/spec/functions/just_spec.rb +7 -7
- data/spec/functions/maybe_spec.rb +7 -7
- data/spec/functions/null_spec.rb +6 -6
- data/spec/implicit_conversions_spec.rb +5 -5
- data/spec/mimic_spec.rb +30 -35
- data/spec/naught/null_object_builder/command_spec.rb +1 -1
- data/spec/naught/null_object_builder_spec.rb +5 -5
- data/spec/naught_spec.rb +29 -23
- data/spec/pebble_spec.rb +13 -11
- data/spec/predicate_spec.rb +18 -14
- data/spec/singleton_null_object_spec.rb +4 -4
- data/spec/spec_helper.rb +4 -4
- data/spec/support/convertable_null.rb +2 -2
- data/spec/support/jruby.rb +3 -0
- data/spec/support/rubinius.rb +3 -0
- data/spec/support/ruby_18.rb +3 -0
- metadata +21 -82
- data/lib/naught/null_class_builder/conversions_module.rb +0 -57
- data/spec/conversions_spec.rb +0 -20
@@ -8,11 +8,11 @@ module Naught
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def call
|
11
|
-
|
12
|
-
|
11
|
+
fail NotImplementedError,
|
12
|
+
'Method #call should be overriden in child classes'
|
13
13
|
end
|
14
14
|
|
15
|
-
def defer(options={}, &block)
|
15
|
+
def defer(options = {}, &block)
|
16
16
|
@builder.defer(options, &block)
|
17
17
|
end
|
18
18
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'forwardable'
|
1
2
|
require 'naught/null_class_builder/command'
|
2
3
|
|
3
4
|
module Naught::NullClassBuilder::Commands
|
@@ -5,13 +6,8 @@ module Naught::NullClassBuilder::Commands
|
|
5
6
|
def call
|
6
7
|
defer do |subject|
|
7
8
|
subject.module_eval do
|
8
|
-
|
9
|
-
|
10
|
-
def to_f; 0.0; end
|
11
|
-
def to_c; 0.to_c; end
|
12
|
-
def to_r; 0.to_r; end
|
13
|
-
def to_a; []; end
|
14
|
-
def to_h; {}; end
|
9
|
+
extend Forwardable
|
10
|
+
def_delegators :nil, :to_a, :to_c, :to_f, :to_h, :to_i, :to_r, :to_s
|
15
11
|
end
|
16
12
|
end
|
17
13
|
end
|
@@ -1,9 +1,8 @@
|
|
1
1
|
module Naught::NullClassBuilder::Commands
|
2
2
|
class Impersonate < Naught::NullClassBuilder::Commands::Mimic
|
3
|
-
def initialize(builder, class_to_impersonate, options={})
|
3
|
+
def initialize(builder, class_to_impersonate, options = {})
|
4
4
|
super
|
5
|
-
|
6
|
-
builder.base_class = class_to_impersonate
|
5
|
+
builder.base_class = class_to_impersonate
|
7
6
|
end
|
8
7
|
end
|
9
8
|
end
|
@@ -1,17 +1,18 @@
|
|
1
|
+
require 'naught/basic_object'
|
1
2
|
require 'naught/null_class_builder/command'
|
2
3
|
|
3
4
|
module Naught::NullClassBuilder::Commands
|
4
5
|
class Mimic < Naught::NullClassBuilder::Command
|
5
6
|
attr_reader :class_to_mimic, :include_super
|
6
7
|
|
7
|
-
def initialize(builder, class_to_mimic, options={})
|
8
|
+
def initialize(builder, class_to_mimic, options = {})
|
8
9
|
super(builder)
|
9
10
|
|
10
11
|
@class_to_mimic = class_to_mimic
|
11
12
|
@include_super = options.fetch(:include_super) { true }
|
12
13
|
|
13
14
|
builder.base_class = root_class_of(class_to_mimic)
|
14
|
-
builder.inspect_proc =
|
15
|
+
builder.inspect_proc = lambda { "<null:#{class_to_mimic}>" }
|
15
16
|
builder.interface_defined = true
|
16
17
|
end
|
17
18
|
|
@@ -26,11 +27,7 @@ module Naught::NullClassBuilder::Commands
|
|
26
27
|
private
|
27
28
|
|
28
29
|
def root_class_of(klass)
|
29
|
-
|
30
|
-
Object
|
31
|
-
else
|
32
|
-
BasicObject
|
33
|
-
end
|
30
|
+
klass.ancestors.include?(Object) ? Object : Naught::BasicObject
|
34
31
|
end
|
35
32
|
|
36
33
|
def methods_to_stub
|
@@ -4,8 +4,7 @@ module Naught
|
|
4
4
|
class NullClassBuilder
|
5
5
|
module Commands
|
6
6
|
class Pebble < ::Naught::NullClassBuilder::Command
|
7
|
-
|
8
|
-
def initialize(builder, output=$stdout)
|
7
|
+
def initialize(builder, output = $stdout)
|
9
8
|
@builder = builder
|
10
9
|
@output = output
|
11
10
|
end
|
@@ -15,18 +14,17 @@ module Naught
|
|
15
14
|
subject.module_exec(@output) do |output|
|
16
15
|
|
17
16
|
define_method(:method_missing) do |method_name, *args, &block|
|
18
|
-
pretty_args = args.
|
17
|
+
pretty_args = args.collect(&:inspect).join(', ').gsub("\"", "'")
|
19
18
|
output.puts "#{method_name}(#{pretty_args}) from #{parse_caller}"
|
20
19
|
self
|
21
20
|
end
|
22
21
|
|
23
|
-
private
|
24
|
-
|
25
22
|
def parse_caller
|
26
23
|
caller = Kernel.caller(2).first
|
27
24
|
method_name = caller.match(/\`([\w\s]+(\(\d+\s\w+\))?[\w\s]*)/)
|
28
25
|
method_name ? method_name[1] : caller
|
29
26
|
end
|
27
|
+
private :parse_caller
|
30
28
|
end
|
31
29
|
end
|
32
30
|
end
|
@@ -20,8 +20,7 @@ module Naught::NullClassBuilder::Commands
|
|
20
20
|
subject.module_exec(@predicate_return_value) do |return_value|
|
21
21
|
if subject.method_defined?(:method_missing)
|
22
22
|
original_method_missing = instance_method(:method_missing)
|
23
|
-
define_method(:method_missing) do
|
24
|
-
|method_name, *args, &block|
|
23
|
+
define_method(:method_missing) do |method_name, *args, &block|
|
25
24
|
if method_name.to_s.end_with?('?')
|
26
25
|
return_value
|
27
26
|
else
|
@@ -3,7 +3,7 @@ require 'naught/null_class_builder/command'
|
|
3
3
|
module Naught::NullClassBuilder::Commands
|
4
4
|
class Singleton < Naught::NullClassBuilder::Command
|
5
5
|
def call
|
6
|
-
defer(class
|
6
|
+
defer(:class => true) do |subject|
|
7
7
|
require 'singleton'
|
8
8
|
subject.module_eval do
|
9
9
|
include ::Singleton
|
@@ -7,8 +7,9 @@ module Naught::NullClassBuilder::Commands
|
|
7
7
|
subject.module_eval do
|
8
8
|
attr_reader :__file__, :__line__
|
9
9
|
|
10
|
-
def initialize(options={})
|
11
|
-
|
10
|
+
def initialize(options = {})
|
11
|
+
range = (RUBY_VERSION.to_f == 1.9 && RUBY_PLATFORM != 'java') ? 4 : 3
|
12
|
+
backtrace = options.fetch(:caller) { Kernel.caller(range) }
|
12
13
|
@__file__, line, _ = backtrace[0].split(':')
|
13
14
|
@__line__ = line.to_i
|
14
15
|
end
|
data/lib/naught/version.rb
CHANGED
data/naught.gemspec
CHANGED
@@ -4,24 +4,19 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'naught/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'naught'
|
8
8
|
spec.version = Naught::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Avdi Grimm']
|
10
|
+
spec.email = ['avdi@avdi.org']
|
11
11
|
spec.description = %q{Naught is a toolkit for building Null Objects}
|
12
|
-
spec.summary =
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
12
|
+
spec.summary = spec.description
|
13
|
+
spec.homepage = 'https://github.com/avdi/naught'
|
14
|
+
spec.license = 'MIT'
|
15
15
|
|
16
|
-
spec.files = `git ls-files`.split(
|
17
|
-
spec.executables = spec.files.grep(
|
18
|
-
spec.test_files = spec.files.grep(
|
19
|
-
spec.require_paths = [
|
16
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
17
|
+
spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(/^(test|spec|features)\//)
|
19
|
+
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency "rake"
|
23
|
-
spec.add_development_dependency "rspec", "~> 2.14"
|
24
|
-
spec.add_development_dependency "guard"
|
25
|
-
spec.add_development_dependency "guard-rspec"
|
26
|
-
spec.add_development_dependency "guard-bundler"
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
27
22
|
end
|
data/spec/base_object_spec.rb
CHANGED
@@ -11,7 +11,7 @@ describe 'null object with a custom base class' do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'respond to base class methods' do
|
14
|
-
expect(null.methods).to
|
14
|
+
expect(null.methods).to be_an Array
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'respond to unknown methods' do
|
@@ -23,7 +23,7 @@ describe 'null object with a custom base class' do
|
|
23
23
|
Naught.build do |b|
|
24
24
|
default_base_class = b.base_class
|
25
25
|
end
|
26
|
-
expect(default_base_class).to eq(BasicObject)
|
26
|
+
expect(default_base_class).to eq(Naught::BasicObject)
|
27
27
|
end
|
28
28
|
|
29
29
|
describe 'singleton null object' do
|
@@ -11,7 +11,7 @@ describe 'basic null object' do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'accepts any arguments for any messages' do
|
14
|
-
null.foobaz(1,2,3)
|
14
|
+
null.foobaz(1, 2, 3)
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'reports that it responds to any message' do
|
@@ -21,7 +21,7 @@ describe 'basic null object' do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'can be inspected' do
|
24
|
-
expect(null.inspect).to eq(
|
24
|
+
expect(null.inspect).to eq('<null>')
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'knows its own class' do
|
@@ -32,4 +32,4 @@ describe 'basic null object' do
|
|
32
32
|
expect(null_class.get.class).to be(null_class)
|
33
33
|
end
|
34
34
|
|
35
|
-
end
|
35
|
+
end
|
data/spec/blackhole_spec.rb
CHANGED
@@ -2,15 +2,15 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe 'black hole null object' do
|
4
4
|
subject(:null) { null_class.new }
|
5
|
-
let(:null_class)
|
5
|
+
let(:null_class) do
|
6
6
|
Naught.build do |b|
|
7
7
|
b.black_hole
|
8
8
|
end
|
9
|
-
|
9
|
+
end
|
10
10
|
|
11
11
|
it 'returns self from arbitray method calls' do
|
12
12
|
expect(null.info).to be(null)
|
13
13
|
expect(null.foobaz).to be(null)
|
14
|
-
expect(null <<
|
14
|
+
expect(null << 'bar').to be(null)
|
15
15
|
end
|
16
|
-
end
|
16
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe 'explicitly convertable null object' do
|
4
|
+
let(:null_class) do
|
5
|
+
Naught.build do |b|
|
6
|
+
b.define_explicit_conversions
|
7
|
+
end
|
8
|
+
end
|
9
|
+
subject(:null) { null_class.new }
|
10
|
+
|
11
|
+
it 'defines common explicit conversions to return zero values' do
|
12
|
+
expect(null.to_s).to eq('')
|
13
|
+
expect(null.to_a).to eq([])
|
14
|
+
expect(null.to_i).to eq(0)
|
15
|
+
expect(null.to_f).to eq(0.0)
|
16
|
+
if RUBY_VERSION >= '2.0'
|
17
|
+
expect(null.to_h).to eq({})
|
18
|
+
elsif RUBY_VERSION >= '1.9'
|
19
|
+
expect(null.to_c).to eq(Complex(0))
|
20
|
+
expect(null.to_r).to eq(Rational(0))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -10,13 +10,13 @@ describe 'Actual()' do
|
|
10
10
|
|
11
11
|
specify 'given anything else, returns the input unchanged' do
|
12
12
|
expect(Actual(false)).to be(false)
|
13
|
-
str =
|
13
|
+
str = 'hello'
|
14
14
|
expect(Actual(str)).to be(str)
|
15
15
|
expect(Actual(nil)).to be_nil
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'also works with blocks' do
|
19
|
-
expect(Actual{ConvertableNull.new}).to be_nil
|
20
|
-
expect(Actual{
|
19
|
+
expect(Actual { ConvertableNull.new }).to be_nil
|
20
|
+
expect(Actual { 'foo' }).to eq('foo')
|
21
21
|
end
|
22
|
-
end
|
22
|
+
end
|
data/spec/functions/just_spec.rb
CHANGED
@@ -5,18 +5,18 @@ describe 'Just()' do
|
|
5
5
|
|
6
6
|
specify 'passes non-nullish values through' do
|
7
7
|
expect(Just(false)).to be(false)
|
8
|
-
str =
|
8
|
+
str = 'hello'
|
9
9
|
expect(Just(str)).to be(str)
|
10
10
|
end
|
11
11
|
|
12
12
|
specify 'rejects nullish values' do
|
13
|
-
expect{Just(nil)}.to raise_error(ArgumentError)
|
14
|
-
expect{Just(
|
15
|
-
expect{Just(ConvertableNull.get)}.to raise_error(ArgumentError)
|
13
|
+
expect { Just(nil) }.to raise_error(ArgumentError)
|
14
|
+
expect { Just('') }.to raise_error(ArgumentError)
|
15
|
+
expect { Just(ConvertableNull.get) }.to raise_error(ArgumentError)
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'also works with blocks' do
|
19
|
-
expect{Just{nil}.class}.to raise_error(ArgumentError)
|
20
|
-
expect(Just{
|
19
|
+
expect { Just { nil }.class }.to raise_error(ArgumentError)
|
20
|
+
expect(Just { 'foo' }).to eq('foo')
|
21
21
|
end
|
22
|
-
end
|
22
|
+
end
|
@@ -13,23 +13,23 @@ describe 'Maybe()' do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
specify 'given anything in null_equivalents, return a null object' do
|
16
|
-
expect(Maybe(
|
16
|
+
expect(Maybe('').class).to be(ConvertableNull)
|
17
17
|
end
|
18
18
|
|
19
19
|
specify 'given anything else, returns the input unchanged' do
|
20
20
|
expect(Maybe(false)).to be(false)
|
21
|
-
str =
|
21
|
+
str = 'hello'
|
22
22
|
expect(Maybe(str)).to be(str)
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'generates null objects with useful trace info' do
|
26
|
-
null = Maybe()
|
27
|
-
expect(null.__line__).to eq(line)
|
26
|
+
null, line = Maybe(), __LINE__
|
28
27
|
expect(null.__file__).to eq(__FILE__)
|
28
|
+
expect(null.__line__).to eq(line)
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'also works with blocks' do
|
32
|
-
expect(Maybe{nil}.class).to eq(ConvertableNull)
|
33
|
-
expect(Maybe{
|
32
|
+
expect(Maybe { nil }.class).to eq(ConvertableNull)
|
33
|
+
expect(Maybe { 'foo' }).to eq('foo')
|
34
34
|
end
|
35
|
-
end
|
35
|
+
end
|
data/spec/functions/null_spec.rb
CHANGED
@@ -17,18 +17,18 @@ describe 'Null()' do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
specify 'given anything in null_equivalents, return a null object' do
|
20
|
-
expect(Null(
|
20
|
+
expect(Null('').class).to be(ConvertableNull)
|
21
21
|
end
|
22
22
|
|
23
23
|
specify 'given anything else, raises an ArgumentError' do
|
24
|
-
expect{Null(false)}.to raise_error(ArgumentError)
|
25
|
-
expect{Null(
|
24
|
+
expect { Null(false) }.to raise_error(ArgumentError)
|
25
|
+
expect { Null('hello') }.to raise_error(ArgumentError)
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'generates null objects with useful trace info' do
|
29
|
-
null = Null()
|
30
|
-
expect(null.__line__).to eq(line)
|
29
|
+
null, line = Null(), __LINE__
|
31
30
|
expect(null.__file__).to eq(__FILE__)
|
31
|
+
expect(null.__line__).to eq(line)
|
32
32
|
end
|
33
33
|
|
34
|
-
end
|
34
|
+
end
|
@@ -2,24 +2,24 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe 'implicitly convertable null object' do
|
4
4
|
subject(:null) { null_class.new }
|
5
|
-
let(:null_class)
|
5
|
+
let(:null_class) do
|
6
6
|
Naught.build do |b|
|
7
7
|
b.define_implicit_conversions
|
8
8
|
end
|
9
|
-
|
9
|
+
end
|
10
10
|
it 'implicitly splats the same way an empty array does' do
|
11
11
|
a, b = null
|
12
12
|
expect(a).to be_nil
|
13
13
|
expect(b).to be_nil
|
14
14
|
end
|
15
15
|
it 'is implicitly convertable to String' do
|
16
|
-
expect(
|
16
|
+
expect(instance_eval(null)).to be_nil
|
17
17
|
end
|
18
18
|
it 'implicitly converts to an empty array' do
|
19
19
|
expect(null.to_ary).to eq([])
|
20
20
|
end
|
21
21
|
it 'implicitly converts to an empty string' do
|
22
|
-
expect(null.to_str).to eq(
|
22
|
+
expect(null.to_str).to eq('')
|
23
23
|
end
|
24
24
|
|
25
|
-
end
|
25
|
+
end
|
data/spec/mimic_spec.rb
CHANGED
@@ -3,27 +3,39 @@ require 'logger'
|
|
3
3
|
|
4
4
|
describe 'null object mimicking a class' do
|
5
5
|
class User
|
6
|
-
def login
|
6
|
+
def login
|
7
|
+
'bob'
|
8
|
+
end
|
7
9
|
end
|
8
10
|
|
9
11
|
module Authorizable
|
10
|
-
def authorized_for?(object)
|
12
|
+
def authorized_for?(object)
|
13
|
+
true
|
14
|
+
end
|
11
15
|
end
|
12
16
|
|
13
17
|
class LibraryPatron < User
|
14
18
|
include Authorizable
|
15
19
|
|
16
|
-
def member
|
17
|
-
|
18
|
-
|
20
|
+
def member?
|
21
|
+
true
|
22
|
+
end
|
23
|
+
|
24
|
+
def name
|
25
|
+
'Bob'
|
26
|
+
end
|
27
|
+
|
28
|
+
def notify_of_overdue_books(titles)
|
29
|
+
puts 'Notifying...'
|
30
|
+
end
|
19
31
|
end
|
20
32
|
|
21
33
|
subject(:null) { mimic_class.new }
|
22
|
-
let(:mimic_class)
|
34
|
+
let(:mimic_class) do
|
23
35
|
Naught.build do |b|
|
24
36
|
b.mimic LibraryPatron
|
25
37
|
end
|
26
|
-
|
38
|
+
end
|
27
39
|
it 'responds to all methods defined on the target class' do
|
28
40
|
expect(null.member?).to be_nil
|
29
41
|
expect(null.name).to be_nil
|
@@ -31,7 +43,7 @@ describe 'null object mimicking a class' do
|
|
31
43
|
end
|
32
44
|
|
33
45
|
it 'does not respond to methods not defined on the target class' do
|
34
|
-
expect{null.foobar}.to raise_error(NoMethodError)
|
46
|
+
expect { null.foobar }.to raise_error(NoMethodError)
|
35
47
|
end
|
36
48
|
|
37
49
|
it 'reports which messages it does and does not respond to' do
|
@@ -41,7 +53,7 @@ describe 'null object mimicking a class' do
|
|
41
53
|
expect(null).not_to respond_to(:foobar)
|
42
54
|
end
|
43
55
|
it 'has an informative inspect string' do
|
44
|
-
expect(null.inspect).to eq(
|
56
|
+
expect(null.inspect).to eq('<null:LibraryPatron>')
|
45
57
|
end
|
46
58
|
|
47
59
|
it 'excludes Object methods from being mimicked' do
|
@@ -55,11 +67,11 @@ describe 'null object mimicking a class' do
|
|
55
67
|
end
|
56
68
|
|
57
69
|
describe 'with include_super: false' do
|
58
|
-
let(:mimic_class)
|
70
|
+
let(:mimic_class) do
|
59
71
|
Naught.build do |b|
|
60
|
-
b.mimic LibraryPatron, include_super
|
72
|
+
b.mimic LibraryPatron, :include_super => false
|
61
73
|
end
|
62
|
-
|
74
|
+
end
|
63
75
|
|
64
76
|
it 'excludes inherited methods' do
|
65
77
|
expect(null).to_not respond_to(:authorized_for?)
|
@@ -70,53 +82,36 @@ end
|
|
70
82
|
|
71
83
|
describe 'using mimic with black_hole' do
|
72
84
|
subject(:null) { mimic_class.new }
|
73
|
-
let(:mimic_class)
|
85
|
+
let(:mimic_class) do
|
74
86
|
Naught.build do |b|
|
75
87
|
b.mimic Logger
|
76
88
|
b.black_hole
|
77
89
|
end
|
78
|
-
|
90
|
+
end
|
79
91
|
|
80
92
|
def self.it_behaves_like_a_black_hole_mimic
|
81
93
|
it 'returns self from mimicked methods' do
|
82
94
|
expect(null.info).to equal(null)
|
83
95
|
expect(null.error).to equal(null)
|
84
|
-
expect(null <<
|
96
|
+
expect(null << 'test').to equal(null)
|
85
97
|
end
|
86
98
|
|
87
99
|
it 'does not respond to methods not defined on the target class' do
|
88
|
-
expect{null.foobar}.to raise_error(NoMethodError)
|
100
|
+
expect { null.foobar }.to raise_error(NoMethodError)
|
89
101
|
end
|
90
102
|
end
|
91
103
|
|
92
104
|
it_behaves_like_a_black_hole_mimic
|
93
105
|
|
94
106
|
describe '(reverse order)' do
|
95
|
-
let(:mimic_class)
|
107
|
+
let(:mimic_class) do
|
96
108
|
Naught.build do |b|
|
97
109
|
b.black_hole
|
98
110
|
b.mimic Logger
|
99
111
|
end
|
100
|
-
|
112
|
+
end
|
101
113
|
|
102
114
|
it_behaves_like_a_black_hole_mimic
|
103
115
|
end
|
104
116
|
|
105
117
|
end
|
106
|
-
|
107
|
-
describe 'mimicking a non-Object-derived class' do
|
108
|
-
class MinimalClass < BasicObject
|
109
|
-
end
|
110
|
-
|
111
|
-
subject(:null) { mimic_class.new }
|
112
|
-
let(:mimic_class) {
|
113
|
-
Naught.build do |b|
|
114
|
-
b.mimic MinimalClass
|
115
|
-
end
|
116
|
-
}
|
117
|
-
|
118
|
-
it 'generates a BasicObject-derived null class' do
|
119
|
-
expect(BasicObject).to be === null
|
120
|
-
expect(Object).not_to be === null
|
121
|
-
end
|
122
|
-
end
|