needle 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/benchmarks/instantiability.rb +26 -0
  2. data/benchmarks/instantiation.rb +33 -0
  3. data/benchmarks/interceptors.rb +42 -0
  4. data/benchmarks/interceptors2.rb +70 -0
  5. data/doc/README +3 -1
  6. data/doc/di-in-ruby.rdoc +201 -0
  7. data/doc/images/di_classdiagram.jpg +0 -0
  8. data/doc/manual/manual.yml +4 -0
  9. data/doc/manual/parts/01_alternatives.txt +11 -0
  10. data/doc/manual/parts/02_creating.txt +20 -0
  11. data/doc/manual/parts/02_namespaces.txt +1 -1
  12. data/doc/manual/parts/02_services.txt +15 -3
  13. data/doc/manual-html/chapter-1.html +34 -7
  14. data/doc/manual-html/chapter-2.html +43 -9
  15. data/doc/manual-html/chapter-3.html +6 -4
  16. data/doc/manual-html/chapter-4.html +6 -4
  17. data/doc/manual-html/chapter-5.html +6 -4
  18. data/doc/manual-html/chapter-6.html +6 -4
  19. data/doc/manual-html/chapter-7.html +6 -4
  20. data/doc/manual-html/index.html +19 -4
  21. data/lib/needle/container.rb +104 -66
  22. data/{test/tc_models.rb → lib/needle/lifecycle/deferred.rb} +14 -20
  23. data/lib/needle/lifecycle/initialize.rb +49 -0
  24. data/lib/needle/{models → lifecycle}/proxy.rb +16 -8
  25. data/lib/needle/lifecycle/singleton.rb +63 -0
  26. data/lib/needle/lifecycle/threaded.rb +58 -0
  27. data/lib/needle/pipeline/collection.rb +133 -0
  28. data/lib/needle/pipeline/element.rb +85 -0
  29. data/lib/needle/pipeline/interceptor.rb +46 -0
  30. data/lib/needle/registry.rb +48 -8
  31. data/lib/needle/service-point.rb +36 -39
  32. data/lib/needle/thread.rb +87 -0
  33. data/lib/needle/version.rb +1 -1
  34. data/{lib/needle/models/prototype.rb → test/lifecycle/tc_deferred.rb} +15 -17
  35. data/test/lifecycle/tc_initialize.rb +62 -0
  36. data/test/{models → lifecycle}/tc_proxy.rb +5 -5
  37. data/test/lifecycle/tc_singleton.rb +32 -0
  38. data/{lib/needle/models/prototype-deferred.rb → test/lifecycle/tc_threaded.rb} +24 -18
  39. data/test/models/model_test.rb +131 -0
  40. data/test/models/tc_prototype.rb +9 -30
  41. data/test/models/tc_prototype_deferred.rb +9 -31
  42. data/test/models/tc_prototype_deferred_initialize.rb +32 -0
  43. data/test/models/tc_prototype_initialize.rb +32 -0
  44. data/test/models/tc_singleton.rb +8 -29
  45. data/test/models/tc_singleton_deferred.rb +8 -30
  46. data/test/models/tc_singleton_deferred_initialize.rb +32 -0
  47. data/test/models/tc_singleton_initialize.rb +32 -0
  48. data/test/models/tc_threaded.rb +32 -0
  49. data/test/models/tc_threaded_deferred.rb +32 -0
  50. data/test/models/tc_threaded_deferred_initialize.rb +32 -0
  51. data/test/models/tc_threaded_initialize.rb +32 -0
  52. data/test/pipeline/tc_collection.rb +116 -0
  53. data/test/pipeline/tc_element.rb +72 -0
  54. data/test/tc_container.rb +77 -36
  55. data/test/tc_logger.rb +5 -0
  56. data/test/tc_registry.rb +39 -1
  57. data/test/tc_service_point.rb +43 -7
  58. metadata +39 -12
  59. data/lib/needle/models/singleton-deferred.rb +0 -57
  60. data/lib/needle/models/singleton.rb +0 -56
  61. data/lib/needle/models.rb +0 -44
@@ -0,0 +1,87 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
4
+ # All rights reserved.
5
+ #
6
+ # This source file is distributed as part of the Needle dependency injection
7
+ # library for Ruby. This file (and the library as a whole) may be used only as
8
+ # allowed by either the BSD license, or the Ruby license (or, by association
9
+ # with the Ruby license, the GPL). See the "doc" subdirectory of the Needle
10
+ # distribution for the texts of these licenses.
11
+ # -----------------------------------------------------------------------------
12
+ # needle website : http://needle.rubyforge.org
13
+ # project website: http://rubyforge.org/projects/needle
14
+ # =============================================================================
15
+ #++
16
+
17
+ require 'thread'
18
+
19
+ module Needle
20
+
21
+ # A subclass of Mutex that allows clients to discover which thread has the
22
+ # mutex locked. This is necessary for (among other things) discovering
23
+ # cycles in the dependency graph of services.
24
+ class QueryableMutex < Mutex
25
+
26
+ # Checks to see if the current thread has the mutex locked, and if it
27
+ # does, raises an exception. Otherwise, locks the mutex and sets the
28
+ # locking thread to Thread.current.
29
+ def lock
30
+ if @locking_thread == Thread.current
31
+ raise ThreadError,
32
+ "an attempt was made to reacquire an existing lock " +
33
+ "(this could happen if you have a circular dependency on a service)"
34
+ end
35
+
36
+ while (Thread.critical = true; @locked)
37
+ @waiting.push Thread.current
38
+ Thread.stop
39
+ end
40
+ @locked = true
41
+ @locking_thread = Thread.current
42
+ Thread.critical = false
43
+ self
44
+ end
45
+
46
+ # Attempts to acquire the lock. Returns +true+ if the lock was acquired,
47
+ # and +false+ if the mutex was already locked.
48
+ def try_lock
49
+ result = false
50
+ Thread.critical = true
51
+ unless @locked
52
+ @locked = true
53
+ result = true
54
+ @locking_thread = Thread.current
55
+ end
56
+ Thread.critical = false
57
+ result
58
+ end
59
+
60
+ # Unlocks the mutex and sets the locking thread to +nil+.
61
+ def unlock
62
+ return unless @locked
63
+ Thread.critical = true
64
+ @locked = false
65
+ begin
66
+ t = @waiting.shift
67
+ t.wakeup if t
68
+ rescue ThreadError
69
+ retry
70
+ end
71
+ @locking_thread = nil
72
+ Thread.critical = false
73
+ begin
74
+ t.run if t
75
+ rescue ThreadError
76
+ end
77
+ self
78
+ end
79
+
80
+ # Return +true+ if the current thread has locked this mutex.
81
+ def self_locked?
82
+ @locking_thread == Thread.current
83
+ end
84
+
85
+ end
86
+
87
+ end
@@ -18,7 +18,7 @@ module Needle
18
18
  module Version
19
19
 
20
20
  MAJOR = 0
21
- MINOR = 5
21
+ MINOR = 6
22
22
  TINY = 0
23
23
 
24
24
  # The version of the Needle library in use.
@@ -14,26 +14,24 @@
14
14
  # =============================================================================
15
15
  #++
16
16
 
17
- module Needle
18
- module Models
17
+ $:.unshift "../../lib"
19
18
 
20
- # The definition of the "prototype" lifecycle service model. This will
21
- # result in immediate instantiation of the requested service, with a new
22
- # instance being returned every time #instance is invoked.
23
- class Prototype
19
+ require "needle/lifecycle/deferred"
20
+ require "test/unit"
24
21
 
25
- # Create a new instance of the Prototype service model.
26
- def initialize( container, opts={}, &callback )
27
- @container = container
28
- @callback = callback
29
- end
22
+ class TC_Lifecycle_Deferred < Test::Unit::TestCase
30
23
 
31
- # Invoke the callback that was given when the service model was
32
- # instantiated, passing the service model's container reference.
33
- def instance
34
- @callback.call( @container )
35
- end
36
- end
24
+ def test_instantiability
25
+ instantiated = false
26
+ element = Needle::Lifecycle::Deferred.new( nil )
27
+ element.succ = Proc.new { instantiated = true; Hash.new }
37
28
 
29
+ assert !instantiated
30
+ proto = element.call
31
+ assert !instantiated
32
+ proto[:test] = :value
33
+ assert instantiated
34
+ assert_equal :value, proto[:test]
38
35
  end
36
+
39
37
  end
@@ -0,0 +1,62 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
4
+ # All rights reserved.
5
+ #
6
+ # This source file is distributed as part of the Needle dependency injection
7
+ # library for Ruby. This file (and the library as a whole) may be used only as
8
+ # allowed by either the BSD license, or the Ruby license (or, by association
9
+ # with the Ruby license, the GPL). See the "doc" subdirectory of the Needle
10
+ # distribution for the texts of these licenses.
11
+ # -----------------------------------------------------------------------------
12
+ # needle website : http://needle.rubyforge.org
13
+ # project website: http://rubyforge.org/projects/needle
14
+ # =============================================================================
15
+ #++
16
+
17
+ $:.unshift "../../lib"
18
+
19
+ require "needle/lifecycle/initialize"
20
+ require "test/unit"
21
+
22
+ class TC_Lifecycle_Initialize < Test::Unit::TestCase
23
+
24
+ class MockNoInit
25
+ end
26
+
27
+ class MockInit
28
+ attr_reader :value
29
+
30
+ def initialize_service
31
+ @value = :initialize
32
+ end
33
+
34
+ def custom_init
35
+ @value = :custom
36
+ end
37
+ end
38
+
39
+ def test_no_initialize
40
+ element = Needle::Lifecycle::Initialize.new( nil )
41
+ element.succ = Proc.new { MockNoInit.new }
42
+ result = nil
43
+ assert_nothing_raised { result = element.call }
44
+ assert_instance_of MockNoInit, result
45
+ end
46
+
47
+ def test_initialize
48
+ element = Needle::Lifecycle::Initialize.new( nil )
49
+ element.succ = Proc.new { MockInit.new }
50
+ result = element.call
51
+ assert_equal :initialize, result.value
52
+ end
53
+
54
+ def test_custom_initialize
55
+ element = Needle::Lifecycle::Initialize.new( nil, nil, nil,
56
+ :init_method => :custom_init )
57
+ element.succ = Proc.new { MockInit.new }
58
+ result = element.call
59
+ assert_equal :custom, result.value
60
+ end
61
+
62
+ end
@@ -16,13 +16,13 @@
16
16
 
17
17
  $:.unshift "../../lib"
18
18
 
19
- require "needle/models/proxy"
19
+ require "needle/lifecycle/proxy"
20
20
  require "test/unit"
21
21
 
22
- class TC_ModelsProxy < Test::Unit::TestCase
22
+ class TC_LifecycleProxy < Test::Unit::TestCase
23
23
 
24
24
  def test_fail
25
- proxy = Needle::Models::Proxy.new( nil ) { Bogus.new }
25
+ proxy = Needle::Lifecycle::Proxy.new( nil ) { Bogus.new }
26
26
  assert_raise( NameError ) do
27
27
  proxy.hello
28
28
  end
@@ -33,7 +33,7 @@ class TC_ModelsProxy < Test::Unit::TestCase
33
33
 
34
34
  def test_succeed
35
35
  instantiated = false
36
- proxy = Needle::Models::Proxy.new( nil ) { instantiated = true; Hash.new }
36
+ proxy = Needle::Lifecycle::Proxy.new( nil ) { instantiated = true; Hash.new }
37
37
  assert !instantiated
38
38
  proxy[:test] = :value
39
39
  assert instantiated
@@ -41,7 +41,7 @@ class TC_ModelsProxy < Test::Unit::TestCase
41
41
  end
42
42
 
43
43
  def test_container
44
- proxy = Needle::Models::Proxy.new( :container ) do |c|
44
+ proxy = Needle::Lifecycle::Proxy.new( nil, :container ) do |c|
45
45
  assert_equal :container, c
46
46
  Hash.new
47
47
  end
@@ -0,0 +1,32 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
4
+ # All rights reserved.
5
+ #
6
+ # This source file is distributed as part of the Needle dependency injection
7
+ # library for Ruby. This file (and the library as a whole) may be used only as
8
+ # allowed by either the BSD license, or the Ruby license (or, by association
9
+ # with the Ruby license, the GPL). See the "doc" subdirectory of the Needle
10
+ # distribution for the texts of these licenses.
11
+ # -----------------------------------------------------------------------------
12
+ # needle website : http://needle.rubyforge.org
13
+ # project website: http://rubyforge.org/projects/needle
14
+ # =============================================================================
15
+ #++
16
+
17
+ $:.unshift "../../lib"
18
+
19
+ require "needle/lifecycle/singleton"
20
+ require "test/unit"
21
+
22
+ class TC_Lifecycle_Singleton < Test::Unit::TestCase
23
+
24
+ def test_multiplicity
25
+ element = Needle::Lifecycle::Singleton.new( nil )
26
+ element.succ = Proc.new { Hash.new }
27
+ p1 = element.call
28
+ p2 = element.call
29
+ assert_same p1, p2
30
+ end
31
+
32
+ end
@@ -14,28 +14,34 @@
14
14
  # =============================================================================
15
15
  #++
16
16
 
17
- require 'needle/models/proxy'
17
+ $:.unshift "../../lib"
18
18
 
19
- module Needle
20
- module Models
19
+ require "needle/lifecycle/threaded"
20
+ require "test/unit"
21
21
 
22
- # The definition of the "prototype-deferred" lifecycle service model.
23
- # This will result in deferred instantiation of the requested service,
24
- # with a new instance being returned every time #instance is invoked.
25
- class PrototypeDeferred
22
+ class TC_Lifecycle_Threaded < Test::Unit::TestCase
26
23
 
27
- # Create a new PrototypeDeferred service model.
28
- def initialize( container, opts={}, &callback )
29
- @container = container
30
- @callback = callback
31
- end
24
+ def setup
25
+ mock = Struct.new( :fullname ).new( "test" )
26
+ @counter = 0
27
+ @element = Needle::Lifecycle::Threaded.new( mock )
28
+ @element.succ = Proc.new { @counter += 1 }
29
+ end
32
30
 
33
- # Return a new Proxy instance that wraps the container and callback
34
- # references given when the service model was instantiated.
35
- def instance
36
- Proxy.new( @container, &@callback )
37
- end
38
- end
31
+ def test_single_thread
32
+ @element.call
33
+ @element.call
34
+ @element.call
35
+ assert_equal 1, @counter
36
+ end
39
37
 
38
+ def test_multi_thread
39
+ threads = []
40
+ threads << Thread.new { @element.call }
41
+ threads << Thread.new { @element.call }
42
+ threads << Thread.new { @element.call }
43
+ threads.each { |t| t.join }
44
+ assert_equal 3, @counter
40
45
  end
46
+
41
47
  end
@@ -0,0 +1,131 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
4
+ # All rights reserved.
5
+ #
6
+ # This source file is distributed as part of the Needle dependency injection
7
+ # library for Ruby. This file (and the library as a whole) may be used only as
8
+ # allowed by either the BSD license, or the Ruby license (or, by association
9
+ # with the Ruby license, the GPL). See the "doc" subdirectory of the Needle
10
+ # distribution for the texts of these licenses.
11
+ # -----------------------------------------------------------------------------
12
+ # needle website : http://needle.rubyforge.org
13
+ # project website: http://rubyforge.org/projects/needle
14
+ # =============================================================================
15
+ #++
16
+
17
+ $:.unshift "../../lib"
18
+
19
+ require "needle"
20
+ require "test/unit"
21
+
22
+ class ModelTest_MockService
23
+ attr_reader :init_result
24
+
25
+ def initialize
26
+ @init_result = :none
27
+ end
28
+
29
+ def initialize_service
30
+ @init_result = :initialized
31
+ end
32
+
33
+ end
34
+
35
+ module ModelTest
36
+
37
+ def self.append_features( base )
38
+ super
39
+ base.extend ClassFeatures
40
+ end
41
+
42
+ module ClassFeatures
43
+ attr_reader :model
44
+
45
+ def use( model )
46
+ @model = model
47
+ end
48
+
49
+ def assert_prototype
50
+ define_method( :test_multiplicity ) do
51
+ o1 = @registry[ :test ]
52
+ o2 = @registry[ :test ]
53
+ assert_not_same o1, o2
54
+ end
55
+ end
56
+
57
+ def assert_singleton
58
+ define_method( :test_multiplicity ) do
59
+ o1 = @registry[ :test ]
60
+ o2 = @registry[ :test ]
61
+ assert_same o1, o2
62
+ end
63
+ end
64
+
65
+ def assert_threaded
66
+ define_method( :extra_setup ) do
67
+ cache = Thread.current[:threaded_services]
68
+ cache.delete "[].test" if cache
69
+ end
70
+
71
+ define_method( :test_multiplicity_singlethread ) do
72
+ @registry[ :test ].init_result
73
+ @registry[ :test ].init_result
74
+ @registry[ :test ].init_result
75
+ assert_equal 1, @count
76
+ end
77
+
78
+ define_method( :test_multiplicity_multithread ) do
79
+ threads = []
80
+ threads << Thread.new { @registry[ :test ].init_result }
81
+ threads << Thread.new { @registry[ :test ].init_result }
82
+ threads << Thread.new { @registry[ :test ].init_result }
83
+ threads.each { |t| t.join }
84
+ assert_equal 3, @count
85
+ end
86
+ end
87
+
88
+ def assert_immediate
89
+ define_method( :test_laziness ) do
90
+ @registry[ :test ]
91
+ assert_equal 1, @count
92
+ end
93
+ end
94
+
95
+ def assert_deferred
96
+ define_method( :test_laziness ) do
97
+ o = @registry[ :test ]
98
+ assert_equal 0, @count
99
+ o.init_result
100
+ assert_equal 1, @count
101
+ end
102
+ end
103
+
104
+ def assert_no_init
105
+ define_method( :test_initialize ) do
106
+ o = @registry[ :test ]
107
+ assert_equal :none, o.init_result
108
+ end
109
+ end
110
+
111
+ def assert_init
112
+ define_method( :test_initialize ) do
113
+ o = @registry[ :test ]
114
+ assert_equal :initialized, o.init_result
115
+ end
116
+ end
117
+ end
118
+
119
+ def setup
120
+ @count = 0
121
+ @registry = Needle::Registry.new do |r|
122
+ r.register :test, :model => self.class.model do
123
+ @count += 1
124
+ ModelTest_MockService.new
125
+ end
126
+ end
127
+
128
+ extra_setup if respond_to?( :extra_setup )
129
+ end
130
+
131
+ end
@@ -16,38 +16,17 @@
16
16
 
17
17
  $:.unshift "../../lib"
18
18
 
19
- require "needle/models/prototype"
19
+ require "needle"
20
20
  require "test/unit"
21
+ require File.join( File.dirname( __FILE__ ), "model_test" )
21
22
 
22
- class TC_ModelsPrototype < Test::Unit::TestCase
23
+ class TC_Model_Prototype < Test::Unit::TestCase
24
+ include ModelTest
23
25
 
24
- def test_instance
25
- instantiated = false
26
- model = Needle::Models::Prototype.new( nil ) {
27
- instantiated = true
28
- Hash.new
29
- }
30
-
31
- assert !instantiated
32
- proto = model.instance
33
- assert instantiated
34
- proto[:test] = :value
35
- assert_equal :value, proto[:test]
36
- end
37
-
38
- def test_container
39
- model = Needle::Models::Prototype.new( :container ) { |c|
40
- assert_equal :container, c
41
- Hash.new
42
- }
43
- model.instance
44
- end
45
-
46
- def test_model
47
- model = Needle::Models::Prototype.new( nil ) { Hash.new }
48
- p1 = model.instance
49
- p2 = model.instance
50
- assert_not_same p1, p2
51
- end
26
+ use :prototype
52
27
 
28
+ assert_prototype
29
+ assert_immediate
30
+ assert_no_init
31
+
53
32
  end
@@ -16,39 +16,17 @@
16
16
 
17
17
  $:.unshift "../../lib"
18
18
 
19
- require "needle/models/prototype-deferred"
19
+ require "needle"
20
20
  require "test/unit"
21
+ require File.join( File.dirname( __FILE__ ), "model_test" )
21
22
 
22
- class TC_ModelsPrototypeDeferred < Test::Unit::TestCase
23
+ class TC_Model_Prototype_Deferred < Test::Unit::TestCase
24
+ include ModelTest
23
25
 
24
- def test_instance
25
- instantiated = false
26
- model = Needle::Models::PrototypeDeferred.new( nil ) {
27
- instantiated = true
28
- Hash.new
29
- }
30
-
31
- assert !instantiated
32
- proto = model.instance
33
- assert !instantiated
34
- proto[:test] = :value
35
- assert instantiated
36
- assert_equal :value, proto[:test]
37
- end
38
-
39
- def test_container
40
- model = Needle::Models::PrototypeDeferred.new( :container ) { |c|
41
- assert_equal :container, c
42
- Hash.new
43
- }
44
- model.instance[:test] = :value
45
- end
46
-
47
- def test_model
48
- model = Needle::Models::PrototypeDeferred.new( nil ) { Hash.new }
49
- p1 = model.instance
50
- p2 = model.instance
51
- assert_not_same p1, p2
52
- end
26
+ use :prototype_deferred
53
27
 
28
+ assert_prototype
29
+ assert_deferred
30
+ assert_no_init
31
+
54
32
  end
@@ -0,0 +1,32 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
4
+ # All rights reserved.
5
+ #
6
+ # This source file is distributed as part of the Needle dependency injection
7
+ # library for Ruby. This file (and the library as a whole) may be used only as
8
+ # allowed by either the BSD license, or the Ruby license (or, by association
9
+ # with the Ruby license, the GPL). See the "doc" subdirectory of the Needle
10
+ # distribution for the texts of these licenses.
11
+ # -----------------------------------------------------------------------------
12
+ # needle website : http://needle.rubyforge.org
13
+ # project website: http://rubyforge.org/projects/needle
14
+ # =============================================================================
15
+ #++
16
+
17
+ $:.unshift "../../lib"
18
+
19
+ require "needle"
20
+ require "test/unit"
21
+ require File.join( File.dirname( __FILE__ ), "model_test" )
22
+
23
+ class TC_Model_Prototype_Deferred_Initialize < Test::Unit::TestCase
24
+ include ModelTest
25
+
26
+ use :prototype_deferred_initialize
27
+
28
+ assert_prototype
29
+ assert_deferred
30
+ assert_init
31
+
32
+ end
@@ -0,0 +1,32 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
4
+ # All rights reserved.
5
+ #
6
+ # This source file is distributed as part of the Needle dependency injection
7
+ # library for Ruby. This file (and the library as a whole) may be used only as
8
+ # allowed by either the BSD license, or the Ruby license (or, by association
9
+ # with the Ruby license, the GPL). See the "doc" subdirectory of the Needle
10
+ # distribution for the texts of these licenses.
11
+ # -----------------------------------------------------------------------------
12
+ # needle website : http://needle.rubyforge.org
13
+ # project website: http://rubyforge.org/projects/needle
14
+ # =============================================================================
15
+ #++
16
+
17
+ $:.unshift "../../lib"
18
+
19
+ require "needle"
20
+ require "test/unit"
21
+ require File.join( File.dirname( __FILE__ ), "model_test" )
22
+
23
+ class TC_Model_Prototype_Initialize < Test::Unit::TestCase
24
+ include ModelTest
25
+
26
+ use :prototype_initialize
27
+
28
+ assert_prototype
29
+ assert_immediate
30
+ assert_init
31
+
32
+ end
@@ -16,38 +16,17 @@
16
16
 
17
17
  $:.unshift "../../lib"
18
18
 
19
- require "needle/models/singleton"
19
+ require "needle"
20
20
  require "test/unit"
21
+ require File.join( File.dirname( __FILE__ ), "model_test" )
21
22
 
22
- class TC_ModelsSingleton < Test::Unit::TestCase
23
+ class TC_Model_Singleton < Test::Unit::TestCase
24
+ include ModelTest
23
25
 
24
- def test_instance
25
- instantiated = false
26
- model = Needle::Models::Singleton.new( nil ) {
27
- instantiated = true
28
- Hash.new
29
- }
26
+ use :singleton
30
27
 
31
- assert !instantiated
32
- proto = model.instance
33
- assert instantiated
34
- proto[:test] = :value
35
- assert_equal :value, proto[:test]
36
- end
37
-
38
- def test_container
39
- model = Needle::Models::Singleton.new( :container ) { |c|
40
- assert_equal :container, c
41
- Hash.new
42
- }
43
- model.instance
44
- end
45
-
46
- def test_model
47
- model = Needle::Models::Singleton.new( nil ) { Hash.new }
48
- p1 = model.instance
49
- p2 = model.instance
50
- assert_same p1, p2
51
- end
28
+ assert_singleton
29
+ assert_immediate
30
+ assert_no_init
52
31
 
53
32
  end