activeldap 1.0.0 → 1.0.1

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 (137) hide show
  1. data/CHANGES +10 -0
  2. data/README +3 -2
  3. data/data/locale/en/LC_MESSAGES/active-ldap.mo +0 -0
  4. data/data/locale/ja/LC_MESSAGES/active-ldap.mo +0 -0
  5. data/examples/al-admin/po/en/al-admin.po +1 -1
  6. data/examples/al-admin/po/ja/al-admin.po +1 -1
  7. data/examples/al-admin/po/nl/al-admin.po +1 -1
  8. data/examples/al-admin/vendor/plugins/exception_notification/lib/exception_notifier.rb +7 -8
  9. data/examples/al-admin/vendor/plugins/exception_notification/lib/exception_notifier_helper.rb +2 -1
  10. data/examples/al-admin/vendor/plugins/exception_notification/views/exception_notifier/_environment.rhtml +1 -1
  11. data/examples/al-admin/vendor/plugins/exception_notification/views/exception_notifier/_request.rhtml +2 -1
  12. data/lib/active_ldap.rb +9 -3
  13. data/lib/active_ldap/action_controller/ldap_benchmarking.rb +36 -0
  14. data/lib/active_ldap/adapter/jndi.rb +1 -1
  15. data/lib/active_ldap/adapter/jndi_connection.rb +2 -1
  16. data/lib/active_ldap/association/belongs_to_many.rb +10 -2
  17. data/lib/active_ldap/association/collection.rb +10 -0
  18. data/lib/active_ldap/association/has_many_utils.rb +13 -9
  19. data/lib/active_ldap/association/has_many_wrap.rb +10 -2
  20. data/lib/active_ldap/associations.rb +3 -3
  21. data/lib/active_ldap/base.rb +95 -32
  22. data/lib/active_ldap/connection.rb +1 -1
  23. data/lib/active_ldap/distinguished_name.rb +3 -0
  24. data/lib/active_ldap/entry_attribute.rb +2 -2
  25. data/lib/active_ldap/ldif.rb +2 -2
  26. data/lib/active_ldap/operations.rb +7 -3
  27. data/lib/active_ldap/user_password.rb +0 -1
  28. data/lib/active_ldap/validations.rb +2 -0
  29. data/po/en/active-ldap.po +1 -1
  30. data/po/ja/active-ldap.po +1 -1
  31. data/rails/plugin/active_ldap/init.rb +3 -34
  32. data/test-unit/History.txt +32 -0
  33. data/test-unit/Manifest.txt +70 -0
  34. data/test-unit/README.txt +32 -0
  35. data/test-unit/Rakefile +22 -0
  36. data/test-unit/bin/testrb +5 -0
  37. data/test-unit/lib/test/unit.rb +280 -0
  38. data/test-unit/lib/test/unit/assertionfailederror.rb +14 -0
  39. data/test-unit/lib/test/unit/assertions.rb +722 -0
  40. data/test-unit/lib/test/unit/attribute.rb +125 -0
  41. data/test-unit/lib/test/unit/autorunner.rb +250 -0
  42. data/test-unit/lib/test/unit/collector.rb +43 -0
  43. data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
  44. data/test-unit/lib/test/unit/collector/dir.rb +108 -0
  45. data/test-unit/lib/test/unit/collector/load.rb +135 -0
  46. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  47. data/test-unit/lib/test/unit/color.rb +61 -0
  48. data/test-unit/lib/test/unit/diff.rb +524 -0
  49. data/test-unit/lib/test/unit/error.rb +124 -0
  50. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  51. data/test-unit/lib/test/unit/failure.rb +110 -0
  52. data/test-unit/lib/test/unit/fixture.rb +185 -0
  53. data/test-unit/lib/test/unit/notification.rb +116 -0
  54. data/test-unit/lib/test/unit/omission.rb +129 -0
  55. data/test-unit/lib/test/unit/pending.rb +130 -0
  56. data/test-unit/lib/test/unit/priority.rb +146 -0
  57. data/test-unit/lib/test/unit/runner/console.rb +46 -0
  58. data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
  59. data/test-unit/lib/test/unit/testcase.rb +174 -0
  60. data/test-unit/lib/test/unit/testresult.rb +89 -0
  61. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  62. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  63. data/test-unit/lib/test/unit/ui/console/testrunner.rb +195 -0
  64. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +49 -0
  65. data/test-unit/lib/test/unit/ui/testrunner.rb +20 -0
  66. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  67. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  68. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  69. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  70. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  71. data/test-unit/lib/test/unit/version.rb +7 -0
  72. data/test-unit/sample/adder.rb +13 -0
  73. data/test-unit/sample/subtracter.rb +12 -0
  74. data/test-unit/sample/tc_adder.rb +18 -0
  75. data/test-unit/sample/tc_subtracter.rb +18 -0
  76. data/test-unit/sample/ts_examples.rb +7 -0
  77. data/test-unit/test/collector/test_descendant.rb +135 -0
  78. data/test-unit/test/collector/test_dir.rb +406 -0
  79. data/test-unit/test/collector/test_load.rb +333 -0
  80. data/test-unit/test/collector/test_objectspace.rb +98 -0
  81. data/test-unit/test/run-test.rb +13 -0
  82. data/test-unit/test/test_assertions.rb +693 -0
  83. data/test-unit/test/test_attribute.rb +86 -0
  84. data/{test-unit-ext → test-unit}/test/test_color.rb +3 -5
  85. data/{test-unit-ext → test-unit}/test/test_diff.rb +18 -16
  86. data/test-unit/test/test_emacs_runner.rb +60 -0
  87. data/test-unit/test/test_error.rb +26 -0
  88. data/test-unit/test/test_failure.rb +33 -0
  89. data/test-unit/test/test_fixture.rb +275 -0
  90. data/{test-unit-ext → test-unit}/test/test_notification.rb +7 -6
  91. data/test-unit/test/test_omission.rb +81 -0
  92. data/{test-unit-ext → test-unit}/test/test_pending.rb +15 -15
  93. data/{test-unit-ext → test-unit}/test/test_priority.rb +4 -3
  94. data/test-unit/test/test_testcase.rb +411 -0
  95. data/test-unit/test/test_testresult.rb +113 -0
  96. data/test-unit/test/test_testsuite.rb +129 -0
  97. data/test-unit/test/testunit_test_util.rb +12 -0
  98. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  99. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  100. data/test-unit/test/util/test_observable.rb +102 -0
  101. data/test-unit/test/util/test_procwrapper.rb +36 -0
  102. data/test/al-test-utils.rb +4 -4
  103. data/test/command.rb +1 -1
  104. data/test/run-test.rb +5 -4
  105. data/test/test_associations.rb +143 -9
  106. data/test/test_base.rb +25 -1
  107. data/test/test_dn.rb +2 -0
  108. data/test/test_find.rb +8 -1
  109. data/test/test_ldif.rb +51 -114
  110. data/test/test_reflection.rb +4 -8
  111. data/test/test_usermod-lang-add.rb +2 -1
  112. data/test/test_validation.rb +4 -3
  113. metadata +76 -31
  114. data/test-unit-ext/NEWS.en +0 -28
  115. data/test-unit-ext/NEWS.ja +0 -28
  116. data/test-unit-ext/README.en +0 -247
  117. data/test-unit-ext/README.ja +0 -246
  118. data/test-unit-ext/Rakefile +0 -111
  119. data/test-unit-ext/lib/test-unit-ext.rb +0 -16
  120. data/test-unit-ext/lib/test-unit-ext/always-show-result.rb +0 -28
  121. data/test-unit-ext/lib/test-unit-ext/assertions.rb +0 -40
  122. data/test-unit-ext/lib/test-unit-ext/attributes.rb +0 -129
  123. data/test-unit-ext/lib/test-unit-ext/backtrace-filter.rb +0 -17
  124. data/test-unit-ext/lib/test-unit-ext/color.rb +0 -59
  125. data/test-unit-ext/lib/test-unit-ext/colorized-runner.rb +0 -111
  126. data/test-unit-ext/lib/test-unit-ext/diff.rb +0 -516
  127. data/test-unit-ext/lib/test-unit-ext/long-display-for-emacs.rb +0 -25
  128. data/test-unit-ext/lib/test-unit-ext/notification.rb +0 -79
  129. data/test-unit-ext/lib/test-unit-ext/omission.rb +0 -96
  130. data/test-unit-ext/lib/test-unit-ext/pending.rb +0 -97
  131. data/test-unit-ext/lib/test-unit-ext/priority.rb +0 -158
  132. data/test-unit-ext/lib/test-unit-ext/version.rb +0 -3
  133. data/test-unit-ext/lib/test-unit-ext/xml-report.rb +0 -224
  134. data/test-unit-ext/test/run-test.rb +0 -14
  135. data/test-unit-ext/test/test_attributes.rb +0 -139
  136. data/test-unit-ext/test/test_omission.rb +0 -64
  137. data/test-unit-ext/test/test_xml_report.rb +0 -161
@@ -1,6 +1,9 @@
1
- require 'test-unit-ext'
1
+ require 'test/unit'
2
+ require 'testunit_test_util'
2
3
 
3
4
  class TestNotification < Test::Unit::TestCase
5
+ include TestUnitTestUtil
6
+
4
7
  class TestCase < Test::Unit::TestCase
5
8
  class << self
6
9
  def suite
@@ -19,14 +22,12 @@ class TestNotification < Test::Unit::TestCase
19
22
  assert_equal("1 tests, 0 assertions, 0 failures, 0 errors, 0 pendings, " \
20
23
  "0 omissions, 2 notifications",
21
24
  result.to_s)
22
- assert_equal(["1st notify", "2nd notify. Reach here."],
23
- result.notifications.collect {|n| n.message})
25
+ assert_fault_messages(["1st notify", "2nd notify. Reach here."],
26
+ result.notifications)
24
27
  end
25
28
 
26
29
  private
27
30
  def run_test(name)
28
- result = Test::Unit::TestResult.new
29
- TestCase.new(name).run(result) {}
30
- result
31
+ super(TestCase, name)
31
32
  end
32
33
  end
@@ -0,0 +1,81 @@
1
+ require 'test/unit'
2
+ require 'testunit_test_util'
3
+
4
+ class TestUnitOmission < Test::Unit::TestCase
5
+ include TestUnitTestUtil
6
+
7
+ class TestCase < Test::Unit::TestCase
8
+ class << self
9
+ def suite
10
+ Test::Unit::TestSuite.new(name)
11
+ end
12
+ end
13
+
14
+ def test_omit
15
+ omit("1st omit")
16
+ omit("2nd omit. Should not be reached here.")
17
+ assert(true, "Should not be reached here too.")
18
+ end
19
+
20
+ def test_omit_with_condition
21
+ omit_if(false, "Never omit.")
22
+ omit_unless(true, "Never omit too.")
23
+ omit_if(true, "Should omit.")
24
+ omit("The last omit. Should not be reached here.")
25
+ end
26
+
27
+ def test_omit_with_block
28
+ omit("Omit block") do
29
+ flunk("Should not be reached here.")
30
+ end
31
+ assert(true, "Should be reached here.")
32
+ end
33
+
34
+ def test_omit_with_block_and_condition
35
+ omit_if(false, "Never omit.") do
36
+ assert(true, "Should be reached here.")
37
+ end
38
+ omit_if(true, "Should omit.") do
39
+ flunk("Never reached here.")
40
+ end
41
+ assert(true, "Should be reached here too.")
42
+ end
43
+ end
44
+
45
+ def test_omit
46
+ result = run_test("test_omit")
47
+ assert_equal("1 tests, 0 assertions, 0 failures, 0 errors, 0 pendings, " \
48
+ "1 omissions, 0 notifications",
49
+ result.to_s)
50
+ assert_fault_messages(["1st omit"], result.omissions)
51
+ end
52
+
53
+ def test_omit_with_condition
54
+ result = run_test("test_omit_with_condition")
55
+ assert_equal("1 tests, 0 assertions, 0 failures, 0 errors, 0 pendings, " \
56
+ "1 omissions, 0 notifications",
57
+ result.to_s)
58
+ assert_fault_messages(["Should omit."], result.omissions)
59
+ end
60
+
61
+ def test_omit_with_block
62
+ result = run_test("test_omit_with_block")
63
+ assert_equal("1 tests, 1 assertions, 0 failures, 0 errors, 0 pendings, " \
64
+ "1 omissions, 0 notifications",
65
+ result.to_s)
66
+ assert_fault_messages(["Omit block"], result.omissions)
67
+ end
68
+
69
+ def test_omit_with_condition_and_block
70
+ result = run_test("test_omit_with_block_and_condition")
71
+ assert_equal("1 tests, 1 assertions, 0 failures, 0 errors, 0 pendings, " \
72
+ "1 omissions, 0 notifications",
73
+ result.to_s)
74
+ assert_fault_messages(["Should omit."], result.omissions)
75
+ end
76
+
77
+ private
78
+ def run_test(name)
79
+ super(TestCase, name)
80
+ end
81
+ end
@@ -1,6 +1,9 @@
1
- require 'test-unit-ext'
1
+ require 'test/unit'
2
+ require 'testunit_test_util'
3
+
4
+ class TestUnitPending < Test::Unit::TestCase
5
+ include TestUnitTestUtil
2
6
 
3
- class TestPending < Test::Unit::TestCase
4
7
  class TestCase < Test::Unit::TestCase
5
8
  class << self
6
9
  def suite
@@ -10,21 +13,22 @@ class TestPending < Test::Unit::TestCase
10
13
 
11
14
  def test_pend
12
15
  pend("1st pend")
13
- pend("2nd pend. Not reached here.")
16
+ pend("2nd pend. Should not be reached here.")
17
+ assert(true, "Should not be reached here too.")
14
18
  end
15
19
 
16
20
  def test_pend_with_failure_in_block
17
21
  pend("Wait a minute") do
18
22
  raise "Not implemented yet"
19
23
  end
20
- assert(true, "Not reached here.")
24
+ assert(true, "Reached here.")
21
25
  end
22
26
 
23
27
  def test_pend_with_no_failure_in_block
24
28
  pend("Wait a minute") do
25
29
  "Nothing raised"
26
30
  end
27
- assert(true, "Reached here.")
31
+ assert(true, "Not reached here.")
28
32
  end
29
33
  end
30
34
 
@@ -33,17 +37,15 @@ class TestPending < Test::Unit::TestCase
33
37
  assert_equal("1 tests, 0 assertions, 0 failures, 0 errors, 1 pendings, " \
34
38
  "0 omissions, 0 notifications",
35
39
  result.to_s)
36
- assert_equal(["1st pend"],
37
- result.pendings.collect {|pending| pending.message})
40
+ assert_fault_messages(["1st pend"], result.pendings)
38
41
  end
39
42
 
40
43
  def test_pend_with_failure_in_block
41
44
  result = run_test("test_pend_with_failure_in_block")
42
- assert_equal("1 tests, 0 assertions, 0 failures, 0 errors, 1 pendings, " \
45
+ assert_equal("1 tests, 1 assertions, 0 failures, 0 errors, 1 pendings, " \
43
46
  "0 omissions, 0 notifications",
44
47
  result.to_s)
45
- assert_equal(["Wait a minute"],
46
- result.pendings.collect {|pending| pending.message})
48
+ assert_fault_messages(["Wait a minute"], result.pendings)
47
49
  end
48
50
 
49
51
  def test_pend_with_no_failure_in_block
@@ -51,14 +53,12 @@ class TestPending < Test::Unit::TestCase
51
53
  assert_equal("1 tests, 1 assertions, 1 failures, 0 errors, 0 pendings, " \
52
54
  "0 omissions, 0 notifications",
53
55
  result.to_s)
54
- assert_equal(["Pending block should not be passed: Wait a minute."],
55
- result.failures.collect {|failure| failure.message})
56
+ assert_fault_messages(["Pending block should not be passed: Wait a minute."],
57
+ result.failures)
56
58
  end
57
59
 
58
60
  private
59
61
  def run_test(name)
60
- result = Test::Unit::TestResult.new
61
- TestCase.new(name).run(result) {}
62
- result
62
+ super(TestCase, name)
63
63
  end
64
64
  end
@@ -1,6 +1,6 @@
1
- require 'test-unit-ext'
1
+ require 'test/unit'
2
2
 
3
- class TestPriority < Test::Unit::TestCase
3
+ class TestUnitPriority < Test::Unit::TestCase
4
4
  class TestCase < Test::Unit::TestCase
5
5
  class << self
6
6
  def suite
@@ -78,10 +78,11 @@ class TestPriority < Test::Unit::TestCase
78
78
  end
79
79
 
80
80
  def assert_need_to_run(test_name, expected, delta)
81
+ test = TestCase.new(test_name)
81
82
  n = 1000
82
83
  n_need_to_run = 0
83
84
  n.times do |i|
84
- n_need_to_run +=1 if TestCase.need_to_run?(test_name)
85
+ n_need_to_run +=1 if Test::Unit::Priority::Checker.need_to_run?(test)
85
86
  end
86
87
  assert_in_delta(expected, n_need_to_run.to_f / n, delta)
87
88
  end
@@ -0,0 +1,411 @@
1
+ # Author:: Nathaniel Talbott.
2
+ # Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
3
+ # License:: Ruby license.
4
+
5
+ require 'test/unit'
6
+
7
+ module Test
8
+ module Unit
9
+ class TC_TestCase < TestCase
10
+ def test_creation
11
+ tc = Class.new(TestCase) do
12
+ def test_with_arguments(arg1, arg2)
13
+ end
14
+ end
15
+
16
+ caught = true
17
+ catch(:invalid_test) do
18
+ tc.new(:test_with_arguments)
19
+ caught = false
20
+ end
21
+ check("Should have caught an invalid test when there are arguments", caught)
22
+
23
+ caught = true
24
+ catch(:invalid_test) do
25
+ tc.new(:non_existent_test)
26
+ caught = false
27
+ end
28
+ check("Should have caught an invalid test when the method does not exist", caught)
29
+ end
30
+
31
+ def setup
32
+ @tc_failure_error = Class.new(TestCase) do
33
+ def test_failure
34
+ assert_block("failure") { false }
35
+ end
36
+ def test_error
37
+ 1 / 0
38
+ end
39
+ def test_nested_failure
40
+ nested
41
+ end
42
+ def nested
43
+ assert_block("nested"){false}
44
+ end
45
+ def return_passed?
46
+ return passed?
47
+ end
48
+ end
49
+
50
+ def @tc_failure_error.name
51
+ "TC_FailureError"
52
+ end
53
+ end
54
+
55
+ def test_add_failed_assertion
56
+ test_case = @tc_failure_error.new(:test_failure)
57
+ check("passed? should start out true", test_case.return_passed?)
58
+ result = TestResult.new
59
+ called = false
60
+ result.add_listener(TestResult::FAULT) {
61
+ | fault |
62
+ check("Should have a Failure", fault.instance_of?(Failure))
63
+ check("The Failure should have the correct message", "failure" == fault.message)
64
+ check("The Failure should have the correct test_name (was <#{fault.test_name}>)", fault.test_name == "test_failure(TC_FailureError)")
65
+ r = /\A.*#{Regexp.escape(File.basename(__FILE__))}:\d+:in `test_failure'\Z/
66
+
67
+ location = fault.location
68
+ check("The location should be an array", location.kind_of?(Array))
69
+ check("The location should have two lines (was: <#{location.inspect}>)", location.size == 2)
70
+ check("The Failure should have the correct location (was <#{location[0].inspect}>, expected <#{r.inspect}>)", r =~ location[0])
71
+ called = true
72
+ }
73
+ progress = []
74
+ test_case.run(result) { |*arguments| progress << arguments }
75
+ check("The failure should have triggered the listener", called)
76
+ check("The failure should have set passed?", !test_case.return_passed?)
77
+ check("The progress block should have been updated correctly", [[TestCase::STARTED, test_case.name], [TestCase::FINISHED, test_case.name]] == progress)
78
+ end
79
+
80
+ def test_add_failure_nested
81
+ test_case = @tc_failure_error.new(:test_nested_failure)
82
+ check("passed? should start out true", test_case.return_passed?)
83
+
84
+ result = TestResult.new
85
+ called = false
86
+ result.add_listener(TestResult::FAULT) {
87
+ | fault |
88
+ check("Should have a Failure", fault.instance_of?(Failure))
89
+ check("The Failure should have the correct message", "nested" == fault.message)
90
+ check("The Failure should have the correct test_name (was <#{fault.test_name}>)", fault.test_name == "test_nested_failure(TC_FailureError)")
91
+ r =
92
+
93
+ location = fault.location
94
+ check("The location should be an array", location.kind_of?(Array))
95
+ check("The location should have the correct number of lines (was: <#{location.inspect}>)", location.size == 3)
96
+ check("The Failure should have the correct location (was <#{location[0].inspect}>)", /\A.*#{Regexp.escape(File.basename(__FILE__))}:\d+:in `nested'\Z/ =~ location[0])
97
+ check("The Failure should have the correct location (was <#{location[1].inspect}>)", /\A.*#{Regexp.escape(File.basename(__FILE__))}:\d+:in `test_nested_failure'\Z/ =~ location[1])
98
+ called = true
99
+ }
100
+ test_case.run(result){}
101
+ check("The failure should have triggered the listener", called)
102
+ end
103
+
104
+ def test_add_error
105
+ test_case = @tc_failure_error.new(:test_error)
106
+ check("passed? should start out true", test_case.return_passed?)
107
+ result = TestResult.new
108
+ called = false
109
+ result.add_listener(TestResult::FAULT) {
110
+ | fault |
111
+ check("Should have a TestError", fault.instance_of?(Error))
112
+ check("The Error should have the correct message", "ZeroDivisionError: divided by 0" == fault.message)
113
+ check("The Error should have the correct test_name", "test_error(TC_FailureError)" == fault.test_name)
114
+ check("The Error should have the correct exception", fault.exception.instance_of?(ZeroDivisionError))
115
+ called = true
116
+ }
117
+ test_case.run(result) {}
118
+ check("The error should have triggered the listener", called)
119
+ check("The error should have set passed?", !test_case.return_passed?)
120
+ end
121
+
122
+ def test_no_tests
123
+ suite = TestCase.suite
124
+ check("Should have a test suite", suite.instance_of?(TestSuite))
125
+ check("Should have one test", suite.size == 1)
126
+ check("Should have the default test", suite.tests.first.name == "default_test(Test::Unit::TestCase)")
127
+
128
+ result = TestResult.new
129
+ suite.run(result) {}
130
+ check("Should have had one test run", result.run_count == 1)
131
+ check("Should have had one test failure", result.failure_count == 1)
132
+ check("Should have had no errors", result.error_count == 0)
133
+ end
134
+
135
+ def test_suite
136
+ tc = Class.new(TestCase) do
137
+ def test_succeed
138
+ assert_block {true}
139
+ end
140
+ def test_fail
141
+ assert_block {false}
142
+ end
143
+ def test_error
144
+ 1/0
145
+ end
146
+ def dont_run
147
+ assert_block {true}
148
+ end
149
+ def test_dont_run(argument)
150
+ assert_block {true}
151
+ end
152
+ def test
153
+ assert_block {true}
154
+ end
155
+ end
156
+
157
+ suite = tc.suite
158
+ check("Should have a test suite", suite.instance_of?(TestSuite))
159
+ check("Should have three tests", suite.size == 3)
160
+
161
+ result = TestResult.new
162
+ suite.run(result) {}
163
+ check("Should have had three test runs", result.run_count == 3)
164
+ check("Should have had one test failure", result.failure_count == 1)
165
+ check("Should have had one test error", result.error_count == 1)
166
+ end
167
+
168
+
169
+ def test_setup_teardown
170
+ tc = Class.new(TestCase) do
171
+ attr_reader(:setup_called, :teardown_called)
172
+ def initialize(test)
173
+ super(test)
174
+ @setup_called = false
175
+ @teardown_called = false
176
+ end
177
+ def setup
178
+ @setup_called = true
179
+ end
180
+ def teardown
181
+ @teardown_called = true
182
+ end
183
+ def test_succeed
184
+ assert_block {true}
185
+ end
186
+ def test_fail
187
+ assert_block {false}
188
+ end
189
+ def test_error
190
+ raise "Error!"
191
+ end
192
+ end
193
+ result = TestResult.new
194
+
195
+ test = tc.new(:test_succeed)
196
+ test.run(result) {}
197
+ check("Should have called setup the correct number of times", test.setup_called)
198
+ check("Should have called teardown the correct number of times", test.teardown_called)
199
+
200
+ test = tc.new(:test_fail)
201
+ test.run(result) {}
202
+ check("Should have called setup the correct number of times", test.setup_called)
203
+ check("Should have called teardown the correct number of times", test.teardown_called)
204
+
205
+ test = tc.new(:test_error)
206
+ test.run(result) {}
207
+ check("Should have called setup the correct number of times", test.setup_called)
208
+ check("Should have called teardown the correct number of times", test.teardown_called)
209
+
210
+ check("Should have had two test runs", result.run_count == 3)
211
+ check("Should have had a test failure", result.failure_count == 1)
212
+ check("Should have had a test error", result.error_count == 1)
213
+ end
214
+
215
+ def test_assertion_failed_not_called
216
+ tc = Class.new(TestCase) do
217
+ def test_thing
218
+ raise AssertionFailedError.new
219
+ end
220
+ end
221
+
222
+ suite = tc.suite
223
+ check("Should have one test", suite.size == 1)
224
+ result = TestResult.new
225
+ suite.run(result) {}
226
+ check("Should have had one test run", result.run_count == 1)
227
+ check("Should have had one assertion failure", result.failure_count == 1)
228
+ check("Should not have any assertion errors but had #{result.error_count}", result.error_count == 0)
229
+ end
230
+
231
+ def test_equality
232
+ tc1 = Class.new(TestCase) do
233
+ def test_1
234
+ end
235
+ def test_2
236
+ end
237
+ end
238
+
239
+ tc2 = Class.new(TestCase) do
240
+ def test_1
241
+ end
242
+ end
243
+
244
+ test1 = tc1.new('test_1')
245
+ test2 = tc1.new('test_1')
246
+ check("Should be equal", test1 == test2)
247
+ check("Should be equal", test2 == test1)
248
+
249
+ test1 = tc1.new('test_2')
250
+ check("Should not be equal", test1 != test2)
251
+ check("Should not be equal", test2 != test1)
252
+
253
+ test2 = tc1.new('test_2')
254
+ check("Should be equal", test1 == test2)
255
+ check("Should be equal", test2 == test1)
256
+
257
+ test1 = tc1.new('test_1')
258
+ test2 = tc2.new('test_1')
259
+ check("Should not be equal", test1 != test2)
260
+ check("Should not be equal", test2 != test1)
261
+
262
+
263
+ check("Should not be equal", test1 != Object.new)
264
+ check("Should not be equal", Object.new != test1)
265
+ end
266
+
267
+ def test_re_raise_exception
268
+ test_case = Class.new(TestCase) do
269
+ def test_raise_interrupt
270
+ raise Interrupt
271
+ end
272
+ end
273
+
274
+ test = test_case.new("test_raise_interrupt")
275
+ begin
276
+ test.run(TestResult.new) {}
277
+ check("Should not be reached", false)
278
+ rescue Exception
279
+ check("Interrupt exception should be re-raised", $!.class == Interrupt)
280
+ end
281
+ end
282
+
283
+ def test_startup_shutdown
284
+ called = []
285
+ test_case = Class.new(TestCase) do
286
+ @@called = called
287
+ class << self
288
+ def startup
289
+ @@called << :startup
290
+ end
291
+
292
+ def shutdown
293
+ @@called << :shutdown
294
+ end
295
+ end
296
+
297
+ def setup
298
+ @@called << :setup
299
+ end
300
+
301
+ def teardown
302
+ @@called << :teardown
303
+ end
304
+
305
+ def test1
306
+ end
307
+
308
+ def test2
309
+ end
310
+ end
311
+
312
+ test_suite = test_case.suite
313
+ test_suite.run(TestResult.new) {}
314
+ check("startup/shutdown should be called once per test case" +
315
+ ": #{called.inspect}",
316
+ called == [:startup,
317
+ :setup, :teardown,
318
+ :setup, :teardown,
319
+ :shutdown])
320
+ end
321
+
322
+ def test_error_on_startup
323
+ test_case = Class.new(TestCase) do
324
+ class << self
325
+ def startup
326
+ raise "from startup"
327
+ end
328
+ end
329
+
330
+ def test_nothing
331
+ end
332
+ end
333
+
334
+ test_suite = test_case.suite
335
+ result = TestResult.new
336
+ test_suite.run(result) {}
337
+ check("Should record an error on startup: #{result}",
338
+ result.error_count == 1)
339
+ end
340
+
341
+ def test_pass_through_error_on_startup
342
+ test_case = Class.new(TestCase) do
343
+ class << self
344
+ def startup
345
+ raise Interrupt
346
+ end
347
+ end
348
+
349
+ def test_nothing
350
+ end
351
+ end
352
+
353
+ test_suite = test_case.suite
354
+ begin
355
+ test_suite.run(TestResult.new) {}
356
+ check("Should not be reached", false)
357
+ rescue Exception
358
+ check("Interrupt should be passed through: #{$!}",
359
+ Interrupt === $!)
360
+ end
361
+ end
362
+
363
+ def test_error_on_shutdown
364
+ test_case = Class.new(TestCase) do
365
+ class << self
366
+ def shutdown
367
+ raise "from shutdown"
368
+ end
369
+ end
370
+
371
+ def test_nothing
372
+ end
373
+ end
374
+
375
+ test_suite = test_case.suite
376
+ result = TestResult.new
377
+ test_suite.run(result) {}
378
+ check("Should record an error on shutdown: #{result}",
379
+ result.error_count == 1)
380
+ end
381
+
382
+ def test_pass_through_error_on_shutdown
383
+ test_case = Class.new(TestCase) do
384
+ class << self
385
+ def shutdown
386
+ raise Interrupt
387
+ end
388
+ end
389
+
390
+ def test_nothing
391
+ end
392
+ end
393
+
394
+ test_suite = test_case.suite
395
+ begin
396
+ test_suite.run(TestResult.new) {}
397
+ check("Should not be reached", false)
398
+ rescue Exception
399
+ check("Interrupt should be passed through: #{$!}",
400
+ Interrupt === $!)
401
+ end
402
+ end
403
+
404
+ private
405
+ def check(message, passed)
406
+ add_assertion
407
+ raise AssertionFailedError.new(message) unless passed
408
+ end
409
+ end
410
+ end
411
+ end