needle 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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