quarry 0.3.0 → 0.4.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.
- data/CHANGES +40 -3
- data/MANIFEST +290 -78
- data/README +51 -37
- data/RELEASE +12 -0
- data/VERSION +1 -1
- data/bin/quarry +117 -0
- data/bin/quarry-doc +26 -0
- data/bin/ruby-break +10 -0
- data/bin/{xact-ruby → ruby-xacto} +0 -0
- data/doc/assets/images/clipboard.jpg +0 -0
- data/doc/assets/images/clipboard2.png +0 -0
- data/doc/assets/images/darksilver.png +0 -0
- data/doc/assets/images/icon/book.jpg +0 -0
- data/doc/assets/images/icon/download.gif +0 -0
- data/doc/assets/images/icon/letter_r.png +0 -0
- data/doc/assets/images/icon/license.png +0 -0
- data/doc/assets/images/icon/software.png +0 -0
- data/doc/assets/images/icon/source.png +0 -0
- data/doc/assets/images/miner.jpg +0 -0
- data/doc/assets/images/rbrylmtrx.png +0 -0
- data/doc/assets/images/ruby.gif +0 -0
- data/doc/assets/images/runneth.png +0 -0
- data/doc/assets/images/silver.gif +0 -0
- data/doc/assets/images/test.jpg +0 -0
- data/doc/assets/jquery/jquery.js +1 -0
- data/doc/assets/jquery/jquery.tabs.js +1 -0
- data/doc/assets/rdoc_ad.html +12 -0
- data/doc/assets/styles/index.css +138 -0
- data/doc/guide/stubs.md +125 -0
- data/doc/index.html +285 -0
- data/doc/log/bstats/stats.html +39 -0
- data/doc/log/notes.xml +32 -0
- data/doc/log/stats.html +25 -0
- data/doc/log/stats.log +14 -0
- data/doc/log/syntax.log +0 -0
- data/doc/rdoc/classes/Assertion/False.html +151 -106
- data/doc/rdoc/classes/Assertion/True.html +128 -113
- data/doc/rdoc/classes/Assertion.html +147 -77
- data/doc/rdoc/classes/Kernel.html +84 -65
- data/doc/rdoc/classes/Method.html +123 -92
- data/doc/rdoc/classes/Object.html +468 -115
- data/doc/rdoc/classes/Quarry/Break.html +231 -0
- data/doc/rdoc/classes/Quarry/Command.html +443 -0
- data/doc/rdoc/classes/Quarry/Extract.html +215 -0
- data/doc/rdoc/classes/Quarry/MethodProbe.html +203 -145
- data/doc/rdoc/classes/Quarry/Mock/Delegator.html +179 -0
- data/doc/rdoc/classes/Quarry/Mock/Setter.html +175 -0
- data/doc/rdoc/classes/Quarry/Mock.html +211 -67
- data/doc/rdoc/classes/Quarry/Spec/Comment.html +237 -0
- data/doc/rdoc/classes/Quarry/Spec/Config.html +257 -0
- data/doc/rdoc/classes/Quarry/Spec/Context.html +154 -0
- data/doc/rdoc/classes/Quarry/Spec/Document.html +382 -0
- data/doc/rdoc/classes/Quarry/Spec/Header.html +195 -0
- data/doc/rdoc/classes/Quarry/Spec/Macro.html +166 -0
- data/doc/rdoc/classes/Quarry/Spec/Markup.html +279 -0
- data/doc/rdoc/classes/Quarry/Spec/Reporter/DotProgress.html +234 -0
- data/doc/rdoc/classes/Quarry/Spec/Reporter/Summary.html +294 -0
- data/doc/rdoc/classes/Quarry/Spec/Reporter/Verbatim.html +311 -0
- data/doc/rdoc/classes/Quarry/Spec/Runner.html +352 -0
- data/doc/rdoc/classes/Quarry/Spec/Step.html +190 -0
- data/doc/rdoc/classes/Quarry/Spec/Template.html +205 -0
- data/doc/rdoc/classes/Quarry/Stub/Delegator.html +179 -0
- data/doc/rdoc/classes/Quarry/Stub/Setter.html +175 -0
- data/doc/rdoc/classes/Quarry/Stub.html +224 -0
- data/doc/rdoc/classes/Quarry.html +153 -154
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/CHANGES.html +126 -76
- data/doc/rdoc/files/COPYING.html +84 -73
- data/doc/rdoc/files/README.html +135 -111
- data/doc/rdoc/files/RELEASE.html +122 -0
- data/doc/rdoc/files/VERSION.html +85 -74
- data/doc/rdoc/files/bin/quarry-doc.html +109 -0
- data/doc/rdoc/files/bin/quarry.html +109 -0
- data/doc/rdoc/files/bin/ruby-break.html +108 -0
- data/doc/rdoc/files/bin/ruby-xacto.html +101 -0
- data/doc/rdoc/files/lib/quarry/assert_rb.html +155 -0
- data/doc/rdoc/files/lib/quarry/break_rb.html +101 -0
- data/doc/rdoc/files/lib/quarry/extract_rb.html +108 -0
- data/doc/rdoc/files/lib/quarry/loadmonitor_rb.html +80 -71
- data/doc/rdoc/files/lib/quarry/spec/config_rb.html +101 -0
- data/doc/rdoc/files/lib/quarry/spec/context_rb.html +101 -0
- data/doc/rdoc/files/lib/quarry/spec/document_rb.html +111 -0
- data/doc/rdoc/files/lib/quarry/spec/markup_rb.html +108 -0
- data/doc/rdoc/files/lib/quarry/spec/reporter/dotprogress_rb.html +108 -0
- data/doc/rdoc/files/lib/quarry/spec/reporter/summary_rb.html +108 -0
- data/doc/rdoc/files/lib/quarry/spec/reporter/verbatim_rb.html +108 -0
- data/doc/rdoc/files/lib/quarry/spec/reporter_rb.html +109 -0
- data/doc/rdoc/files/lib/quarry/spec/runner_rb.html +109 -0
- data/doc/rdoc/files/lib/quarry/spec/step_rb.html +101 -0
- data/doc/rdoc/files/lib/quarry/spec/template_rhtml.html +228 -0
- data/doc/rdoc/files/lib/quarry/spec_rb.html +113 -0
- data/doc/rdoc/files/lib/quarry/stub/mock_rb.html +101 -0
- data/doc/rdoc/files/lib/quarry/stub/probe_rb.html +122 -0
- data/doc/rdoc/files/lib/quarry/stub/spec_txt.html +118 -0
- data/doc/rdoc/files/lib/quarry/stub/stub_rb.html +101 -0
- data/doc/rdoc/fr_class_index.html +48 -52
- data/doc/rdoc/fr_file_index.html +47 -57
- data/doc/rdoc/fr_method_index.html +109 -69
- data/doc/rdoc/index.html +12 -14
- data/doc/rdoc/rdoc-style.css +154 -121
- data/doc/ri/Assertion/False/cdesc-False.yaml +5 -3
- data/doc/ri/Assertion/True/cdesc-True.yaml +4 -2
- data/doc/ri/Assertion/True/message-c.yaml +2 -2
- data/doc/ri/Assertion/True/message-i.yaml +1 -1
- data/doc/ri/Assertion/True/method_missing-i.yaml +4 -3
- data/doc/ri/Assertion/cdesc-Assertion.yaml +24 -1
- data/doc/ri/Object/assert%21-i.yaml +7 -4
- data/doc/ri/Object/assert-i.yaml +3 -2
- data/doc/ri/Object/assert_raises%21-i.yaml +12 -0
- data/doc/ri/Object/assert_raises-i.yaml +15 -0
- data/doc/ri/Object/cdesc-Object.yaml +24 -2
- data/doc/ri/{Quarry/Design/Specification/outline-i.yaml → Object/mock-i.yaml} +4 -4
- data/doc/ri/Object/refute-i.yaml +13 -0
- data/doc/ri/Object/refute_raises-i.yaml +17 -0
- data/doc/ri/Object/remove-i.yaml +12 -0
- data/doc/ri/{Quarry/Design/check-c.yaml → Object/should-i.yaml} +4 -4
- data/doc/ri/Object/should_not-i.yaml +12 -0
- data/doc/ri/Object/should_not_raise-i.yaml +12 -0
- data/doc/ri/Object/should_raise-i.yaml +12 -0
- data/doc/ri/{Quarry/Mock/Object/mock-c.yaml → Object/stub-i.yaml} +5 -5
- data/doc/ri/{Module/cdesc-Module.yaml → Quarry/Break/cdesc-Break.yaml} +10 -8
- data/doc/ri/Quarry/Break/edit-i.yaml +11 -0
- data/doc/ri/Quarry/Break/new-c.yaml +11 -0
- data/doc/ri/Quarry/Extract/cdesc-Extract.yaml +26 -0
- data/doc/ri/Quarry/Extract/create_test-i.yaml +12 -0
- data/doc/ri/Quarry/Extract/extract_test_from_file-i.yaml +12 -0
- data/doc/ri/Quarry/Extract/test_extract-i.yaml +18 -0
- data/doc/ri/Quarry/Mock/Delegator/cdesc-Delegator.yaml +20 -0
- data/doc/ri/Quarry/{Design/Specification/Context → Mock/Delegator}/method_missing-i.yaml +2 -2
- data/doc/ri/Quarry/{Design/specification-c.yaml → Mock/Delegator/new-c.yaml} +3 -3
- data/doc/ri/{Module/method_added-i.yaml → Quarry/Mock/Setter/%3d%3d-i.yaml} +3 -3
- data/doc/ri/Quarry/Mock/Setter/cdesc-Setter.yaml +18 -0
- data/doc/ri/Quarry/Mock/Setter/new-c.yaml +10 -0
- data/doc/ri/Quarry/Mock/__table__-i.yaml +11 -0
- data/doc/ri/Quarry/Mock/cdesc-Mock.yaml +17 -7
- data/doc/ri/Quarry/Mock/method_missing-i.yaml +12 -0
- data/doc/ri/Quarry/{Design/outline-c.yaml → Mock/new-c.yaml} +2 -2
- data/doc/ri/Quarry/Spec/Comment/cdesc-Comment.yaml +33 -0
- data/doc/ri/Quarry/Spec/Comment/macro%3f-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Comment/new-c.yaml +10 -0
- data/doc/ri/Quarry/Spec/Comment/type-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Config/after-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Config/after_spec-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Config/before-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Config/before_spec-i.yaml +12 -0
- data/doc/ri/Quarry/{Design/Specification/Context/cdesc-Context.yaml → Spec/Config/cdesc-Config.yaml} +11 -9
- data/doc/ri/Quarry/{Mock/Object/mocks-c.yaml → Spec/Config/new-c.yaml} +2 -2
- data/doc/ri/Quarry/Spec/Context/cdesc-Context.yaml +21 -0
- data/doc/ri/Quarry/{Design/specifications-c.yaml → Spec/Context/new-c.yaml} +2 -2
- data/doc/ri/Quarry/Spec/Document/cdesc-Document.yaml +76 -0
- data/doc/ri/Quarry/Spec/Document/generate-i.yaml +12 -0
- data/doc/ri/Quarry/{Mock/Object/echo-c.yaml → Spec/Document/new-c.yaml} +4 -4
- data/doc/ri/Quarry/Spec/Document/quiet%3f-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Document/require_rdoc-i.yaml +11 -0
- data/doc/ri/Quarry/Spec/Document/save-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Document/template-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Header/cdesc-Header.yaml +30 -0
- data/doc/ri/Quarry/Spec/Header/new-c.yaml +10 -0
- data/doc/ri/Quarry/Spec/Macro/cdesc-Macro.yaml +22 -0
- data/doc/ri/Quarry/Spec/Macro/new-c.yaml +10 -0
- data/doc/ri/Quarry/Spec/Markup/cdesc-Markup.yaml +31 -0
- data/doc/ri/Quarry/Spec/Markup/description-i.yaml +11 -0
- data/doc/ri/Quarry/Spec/Markup/new-c.yaml +11 -0
- data/doc/ri/Quarry/Spec/Markup/parse-i.yaml +11 -0
- data/doc/ri/Quarry/Spec/Markup/parse_section-i.yaml +11 -0
- data/doc/ri/Quarry/Spec/Reporter/DotProgress/cdesc-DotProgress.yaml +21 -0
- data/doc/ri/Quarry/{Design/Specification/Context/specifications-i.yaml → Spec/Reporter/DotProgress/report_intro-i.yaml} +2 -2
- data/doc/ri/Quarry/Spec/Reporter/DotProgress/report_step-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/DotProgress/report_summary-i.yaml +16 -0
- data/doc/ri/Quarry/Spec/Reporter/Summary/cdesc-Summary.yaml +31 -0
- data/doc/ri/Quarry/Spec/Reporter/Summary/report_comment-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Summary/report_error-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Summary/report_fail-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Summary/report_header-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Summary/report_macro-i.yaml +10 -0
- data/doc/ri/Quarry/{Design/Specification/Context/before-i.yaml → Spec/Reporter/Summary/report_pass-i.yaml} +3 -3
- data/doc/ri/Quarry/Spec/Reporter/Verbatim/cdesc-Verbatim.yaml +29 -0
- data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_comment-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_error-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_fail-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_header-i.yaml +16 -0
- data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_macro-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_pass-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/cdesc-Reporter.yaml +20 -0
- data/doc/ri/Quarry/Spec/Runner/cdesc-Runner.yaml +47 -0
- data/doc/ri/Quarry/{Design/Specification → Spec/Runner}/check-i.yaml +3 -3
- data/doc/ri/Quarry/Spec/Runner/check_spec-i.yaml +12 -0
- data/doc/ri/Quarry/{Design/Specification → Spec/Runner}/new-c.yaml +2 -2
- data/doc/ri/Quarry/Spec/Runner/run_step-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Step/cdesc-Step.yaml +30 -0
- data/doc/ri/Quarry/Spec/Step/new-c.yaml +10 -0
- data/doc/ri/Quarry/Spec/Template/cdesc-Template.yaml +31 -0
- data/doc/ri/Quarry/Spec/Template/new-c.yaml +11 -0
- data/doc/ri/Quarry/{Design/Specification/Context/after-i.yaml → Spec/Template/parse_template-i.yaml} +3 -3
- data/doc/ri/Quarry/Spec/cdesc-Spec.yaml +15 -0
- data/doc/ri/Quarry/Stub/Delegator/cdesc-Delegator.yaml +20 -0
- data/doc/ri/Quarry/Stub/Delegator/method_missing-i.yaml +10 -0
- data/doc/ri/Quarry/Stub/Delegator/new-c.yaml +10 -0
- data/doc/ri/Quarry/Stub/Setter/%3d%3d-i.yaml +10 -0
- data/doc/ri/Quarry/Stub/Setter/cdesc-Setter.yaml +18 -0
- data/doc/ri/Quarry/Stub/Setter/new-c.yaml +10 -0
- data/doc/ri/Quarry/Stub/__table__-i.yaml +11 -0
- data/doc/ri/Quarry/Stub/cdesc-Stub.yaml +23 -0
- data/doc/ri/Quarry/Stub/method_missing-i.yaml +11 -0
- data/doc/ri/Quarry/Stub/new-c.yaml +10 -0
- data/doc/ri/Quarry/cdesc-Quarry.yaml +2 -3
- data/doc/ri/created.rid +1 -1
- data/doc/spec/stub.html +394 -0
- data/lib/quarry/assert.rb +198 -0
- data/lib/quarry/break.rb +51 -0
- data/lib/quarry/extract.rb +135 -0
- data/lib/quarry/loadmonitor.rb +6 -1
- data/lib/quarry/spec/config.rb +32 -0
- data/lib/quarry/spec/context.rb +19 -0
- data/lib/quarry/spec/document.rb +130 -0
- data/lib/quarry/spec/markup.rb +85 -0
- data/lib/quarry/spec/reporter/dotprogress.rb +66 -0
- data/lib/quarry/spec/reporter/summary.rb +74 -0
- data/lib/quarry/spec/reporter/verbatim.rb +87 -0
- data/lib/quarry/spec/reporter.rb +74 -0
- data/lib/quarry/spec/runner.rb +127 -0
- data/lib/quarry/spec/step.rb +78 -0
- data/lib/quarry/spec/template.rhtml +116 -0
- data/lib/quarry/spec.rb +7 -0
- data/lib/quarry/stub/mock.rb +94 -0
- data/lib/quarry/{methodprobe.rb → stub/probe.rb} +0 -0
- data/lib/quarry/stub/spec.txt +113 -0
- data/lib/quarry/stub/stub.rb +93 -0
- data/meta/abstract +5 -0
- data/meta/authors +1 -0
- data/meta/created +1 -0
- data/meta/homepage +1 -0
- data/meta/requires +1 -0
- data/meta/summary +1 -0
- data/spec/basic.rd +20 -0
- data/spec/complex.rd +50 -0
- data/spec/mock.rd +53 -0
- data/spec/stub.rd +61 -0
- data/{lib/quarry → work/consider}/document.rb +0 -0
- data/work/consider/fixture.rb +153 -0
- data/{lib/quarry → work/deprecated}/assert/must.rb +1 -0
- data/{lib/quarry → work/deprecated}/assert/should.rb +0 -0
- data/work/deprecated/build.rb +82 -0
- data/work/deprecated/mock/file.rb +11 -0
- data/work/deprecated/mock/mock.0.rb +77 -0
- data/work/deprecated/overlay.rb +64 -0
- data/work/deprecated/spec.rb +195 -0
- data/work/deprecated/stub/stub.0.rb +180 -0
- data/work/deprecated/stub/stub.1.rb +114 -0
- data/work/deprecated/stub/test_stub.rb +66 -0
- data/work/deprecated/test/case.rb +141 -0
- data/work/sandbox/assert.rb +100 -0
- data/work/sandbox/bug.rb +49 -0
- data/work/sandbox/build/announce.rb +213 -0
- data/work/sandbox/build/check.rb +109 -0
- data/work/sandbox/build/gem.rb +235 -0
- data/work/sandbox/build/make.rb +118 -0
- data/work/sandbox/build/manpage.rb +201 -0
- data/work/sandbox/build/notes.rb +214 -0
- data/work/sandbox/build/pack.rb +228 -0
- data/work/sandbox/build/rdoc.rb +289 -0
- data/work/sandbox/build/rubyforge.rb +91 -0
- data/work/sandbox/build/sign.rb +241 -0
- data/work/sandbox/build/stamp.rb +37 -0
- data/work/sandbox/build/stats.rb +154 -0
- data/work/sandbox/build/svn.rb +193 -0
- data/work/sandbox/build/test.rb +521 -0
- data/work/sandbox/design.rb +200 -0
- data/work/sandbox/iface_scanner.rb +102 -0
- data/work/sandbox/testunit/assertions/assert_has_keys.rb +38 -0
- data/work/sandbox/testunit/assertions/assert_has_only_keys.rb +38 -0
- data/work/sandbox/testunit/unit.rb +104 -0
- data/work/sandbox/unitspec.rb +54 -0
- data/work/sandbox/x_isotest.rb +532 -0
- metadata +318 -93
- data/METADATA +0 -22
- data/NEWS +0 -8
- data/bin/rubybreak +0 -3
- data/demo/spec/demo_check.rb +0 -21
- data/demo/spec/demo_outline.rb +0 -25
- data/demo/test/demo_run.rb +0 -21
- data/doc/manual.html2 +0 -1416
- data/doc/rdoc/classes/Module.html +0 -165
- data/doc/rdoc/classes/Quarry/Design/Specification/Context.html +0 -174
- data/doc/rdoc/classes/Quarry/Design/Specification.html +0 -265
- data/doc/rdoc/classes/Quarry/Design.html +0 -170
- data/doc/rdoc/classes/Quarry/Mock/Object.html +0 -276
- data/doc/rdoc/files/MANIFEST.html +0 -630
- data/doc/rdoc/files/METADATA.html +0 -92
- data/doc/rdoc/files/NEWS.html +0 -99
- data/doc/rdoc/files/bin/rubybreak.html +0 -96
- data/doc/rdoc/files/bin/xact-ruby.html +0 -92
- data/doc/rdoc/files/lib/quarry/assert/must_rb.html +0 -96
- data/doc/rdoc/files/lib/quarry/assert/should_rb.html +0 -96
- data/doc/rdoc/files/lib/quarry/assertion_rb.html +0 -96
- data/doc/rdoc/files/lib/quarry/breakout_rb.html +0 -144
- data/doc/rdoc/files/lib/quarry/design/spec_rb.html +0 -100
- data/doc/rdoc/files/lib/quarry/document_rb.html +0 -92
- data/doc/rdoc/files/lib/quarry/methodprobe_rb.html +0 -111
- data/doc/rdoc/files/lib/quarry/mock/object_rb.html +0 -123
- data/doc/rdoc/files/lib/quarry/mockery_rb.html +0 -115
- data/doc/ri/Module/doc-i.yaml +0 -16
- data/doc/ri/Quarry/Design/Specification/cdesc-Specification.yaml +0 -44
- data/doc/ri/Quarry/Design/cdesc-Design.yaml +0 -22
- data/doc/ri/Quarry/Mock/Object/cdesc-Object.yaml +0 -52
- data/doc/ri/Quarry/Mock/Object/keys-c.yaml +0 -12
- data/doc/ri/Quarry/Mock/Object/spin-c.yaml +0 -12
- data/doc/ri/Quarry/Mockery-i.yaml +0 -12
- data/lib/quarry/assertion.rb +0 -95
- data/lib/quarry/breakout.rb +0 -45
- data/lib/quarry/design/spec.rb +0 -197
- data/lib/quarry/mock/object.rb +0 -169
- data/lib/quarry/mockery.rb +0 -85
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
require 'quarry/assertion'
|
|
2
|
+
|
|
3
|
+
module Quarry
|
|
4
|
+
|
|
5
|
+
class << self
|
|
6
|
+
def specification(description, &specification)
|
|
7
|
+
Design.specification(description, &specification)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
alias_method :spec, :specification
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module Design
|
|
14
|
+
|
|
15
|
+
class << self
|
|
16
|
+
def specifications
|
|
17
|
+
@specifications ||= []
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def specification(description, &specification)
|
|
21
|
+
specifications << Spec.new(description, nil, &specification)
|
|
22
|
+
end
|
|
23
|
+
alias_method :spec, :specification
|
|
24
|
+
|
|
25
|
+
# TODO: make output compatible with unit_diff ?
|
|
26
|
+
|
|
27
|
+
def check
|
|
28
|
+
specifications.each do |specification|
|
|
29
|
+
Runner.new(specification).check
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def outline
|
|
34
|
+
specifications.each do |specification|
|
|
35
|
+
Runner.new(specification).outline
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# = Spec
|
|
41
|
+
#
|
|
42
|
+
class Spec
|
|
43
|
+
#undef_method *instance_methods.select{|m| m.to_s !~ /^(__|instance_|object_)/}
|
|
44
|
+
|
|
45
|
+
# Specification description.
|
|
46
|
+
attr :description
|
|
47
|
+
|
|
48
|
+
# Parent specification (if any).
|
|
49
|
+
attr :parent
|
|
50
|
+
|
|
51
|
+
#
|
|
52
|
+
attr :given
|
|
53
|
+
|
|
54
|
+
#
|
|
55
|
+
attr :before
|
|
56
|
+
|
|
57
|
+
#
|
|
58
|
+
attr :after
|
|
59
|
+
|
|
60
|
+
# Subspecifications
|
|
61
|
+
attr :specs
|
|
62
|
+
|
|
63
|
+
# Steps in specification proof.
|
|
64
|
+
attr :steps
|
|
65
|
+
|
|
66
|
+
#
|
|
67
|
+
def initialize(description, parent, &block)
|
|
68
|
+
#@relation = relation
|
|
69
|
+
@description = description
|
|
70
|
+
@parent = parent
|
|
71
|
+
|
|
72
|
+
@given = nil
|
|
73
|
+
@before = nil
|
|
74
|
+
@after = nil
|
|
75
|
+
|
|
76
|
+
@specs = []
|
|
77
|
+
@steps = []
|
|
78
|
+
|
|
79
|
+
instance_eval(&block)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
#
|
|
83
|
+
def given(&block)
|
|
84
|
+
block ? @given = block : @given
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
#
|
|
88
|
+
def before(&block)
|
|
89
|
+
block ? @before = block : @before
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
#
|
|
93
|
+
def after(&block)
|
|
94
|
+
block ? @after = block : @after
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def context(description, &block)
|
|
98
|
+
specs << Spec.new(description, self, &block)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
#
|
|
102
|
+
def prove(description, &block)
|
|
103
|
+
steps << Step.new(description, self, &block)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
alias_method :it, :prove
|
|
107
|
+
alias_method :its, :prove
|
|
108
|
+
|
|
109
|
+
#
|
|
110
|
+
#def method_missing(relation, *description, &specification)
|
|
111
|
+
# if description.size > 1
|
|
112
|
+
# super
|
|
113
|
+
# else
|
|
114
|
+
# specifications << Specification.new(relation, description.first, self, &specification)
|
|
115
|
+
# end
|
|
116
|
+
#end
|
|
117
|
+
end #class Context
|
|
118
|
+
|
|
119
|
+
#
|
|
120
|
+
class Step
|
|
121
|
+
attr :description
|
|
122
|
+
attr :parent
|
|
123
|
+
attr :code
|
|
124
|
+
|
|
125
|
+
def initialize(description, parent, &code)
|
|
126
|
+
@description = description
|
|
127
|
+
@parent = parent
|
|
128
|
+
@code = code
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end #module Desgin
|
|
133
|
+
|
|
134
|
+
end #module Quarry
|
|
135
|
+
|
|
136
|
+
#at_exit { Quarry::Design.check unless $no_autocheck }
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
=begin demo
|
|
140
|
+
|
|
141
|
+
Quarry::Design.specification "Example Specification" do
|
|
142
|
+
|
|
143
|
+
context "demonstrate basic assertions" do
|
|
144
|
+
|
|
145
|
+
specify "fail if should is false" do
|
|
146
|
+
4.assert == 3
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
specify "fail if should_not is true" do
|
|
150
|
+
4.assert! == 4
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
specify "fail on should raise" do
|
|
154
|
+
lambda{raise ArgumentError}.assert.raise? SyntaxError
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
$no_autocheck = true
|
|
162
|
+
|
|
163
|
+
Quarry::Design.outline
|
|
164
|
+
|
|
165
|
+
=end
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
if __FILE__ == $0
|
|
169
|
+
|
|
170
|
+
Quarry::Design.spec "Example Specification" do
|
|
171
|
+
|
|
172
|
+
it "demontrates basic assertions" do
|
|
173
|
+
|
|
174
|
+
it "eg. 4 == 3 fails" do
|
|
175
|
+
4.assert == 3
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
it "eg. 4 != 4 fails" do
|
|
179
|
+
4.assert! == 4
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
it "eg. raises an ArgumentError does not raise a SyntaxError" do
|
|
183
|
+
lambda{raise ArgumentError}.assert.raise? SyntaxError
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
$no_autocheck = true
|
|
191
|
+
|
|
192
|
+
Quarry::Design.outline
|
|
193
|
+
|
|
194
|
+
end
|
|
195
|
+
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
module Quarry
|
|
2
|
+
require 'ostruct'
|
|
3
|
+
|
|
4
|
+
# = Stub
|
|
5
|
+
#
|
|
6
|
+
# A straightfoward stubbing facility. Typically used in test cases.
|
|
7
|
+
# The Stub class offers a few constructors for quickly building
|
|
8
|
+
# of stubs.
|
|
9
|
+
#
|
|
10
|
+
# stat - Returns a static reponse.
|
|
11
|
+
# echo - Returns the arguments passed-in.
|
|
12
|
+
# spin - Returns a rotation of responses.
|
|
13
|
+
# keys - Returns an index of responses.
|
|
14
|
+
#
|
|
15
|
+
# Stub classes can be built from sratch or partially framed
|
|
16
|
+
# against other classes.
|
|
17
|
+
#
|
|
18
|
+
# === Usage
|
|
19
|
+
#
|
|
20
|
+
# class ContextStub < Stub
|
|
21
|
+
# stat :response_headers, {}
|
|
22
|
+
# spin :host_url, ['http://www.nitrohq.com','http://www.rubyforge.com']
|
|
23
|
+
# end
|
|
24
|
+
#
|
|
25
|
+
# ctx = ContextStub.new
|
|
26
|
+
# ctx.response_headers['location'] = url
|
|
27
|
+
# ctx.host_url #=> "http://www.nitrohq.com"
|
|
28
|
+
# ctx.host_url #=> "http://www.rubyforge.com"
|
|
29
|
+
#
|
|
30
|
+
# === Note
|
|
31
|
+
#
|
|
32
|
+
# Quarry doesn't have Mocks, and may never. You can combine
|
|
33
|
+
# Stubs and Assertions fairly effectively to do essentailly
|
|
34
|
+
# what Mocks do, without having to learn yet another DSL
|
|
35
|
+
# for describing object behaviors.
|
|
36
|
+
#
|
|
37
|
+
class Stub < OpenStruct
|
|
38
|
+
|
|
39
|
+
# Certain methods are not mocked:
|
|
40
|
+
# inspect (tricky)
|
|
41
|
+
# class (delegated)
|
|
42
|
+
# kind_of? (delegated)
|
|
43
|
+
# is_a? (delegated)
|
|
44
|
+
# instance_of? (delegated)
|
|
45
|
+
# method (works as-is)
|
|
46
|
+
# send (works as-is)
|
|
47
|
+
# respond_to? (works as-is)
|
|
48
|
+
# hash (no way to mock)
|
|
49
|
+
#
|
|
50
|
+
# __id__, __call__, etc. (not meant to be stubbed, ever!)
|
|
51
|
+
#
|
|
52
|
+
UnstubbedMethods = %r{^(
|
|
53
|
+
|inspect
|
|
54
|
+
|kind_of\?|is_a\?|instance_of\?|class
|
|
55
|
+
|method|send|respond_to\?
|
|
56
|
+
|hash
|
|
57
|
+
|__
|
|
58
|
+
)}x
|
|
59
|
+
|
|
60
|
+
class << self
|
|
61
|
+
attr :realclass
|
|
62
|
+
|
|
63
|
+
def stubbed_methods
|
|
64
|
+
self.methods(false)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Returns a static response.
|
|
68
|
+
def stat(sym, val)
|
|
69
|
+
define_method(sym){|*args| val}
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# This one is dumb.
|
|
73
|
+
# Responds with input.
|
|
74
|
+
def echo(sym)
|
|
75
|
+
define_method(sym){|*args| args}
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# This is probably dumb.
|
|
79
|
+
# Reponds with a rotation of reponses.
|
|
80
|
+
def spin( sym, arr )
|
|
81
|
+
define_method( sym ) { |*args| arr.push(arr.shift) ; arr[-1] }
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Responds according to a mapping of input parameters.
|
|
85
|
+
def keys( sym, hsh )
|
|
86
|
+
define_method( sym ) { |*args| hsh[args] }
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
alias :__class :class
|
|
91
|
+
|
|
92
|
+
# Delegate #class method.
|
|
93
|
+
def class # :nodoc:
|
|
94
|
+
return __class.realclass
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Delegate #instance_of? method.
|
|
98
|
+
def instance_of?(klass) # :nodoc:
|
|
99
|
+
self.class == klass
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Delegate #kind_of? method.
|
|
103
|
+
def kind_of?(klass) # :nodoc:
|
|
104
|
+
self.class <= klass
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Delegate #is_a? method.
|
|
108
|
+
alias_method :is_a?, :kind_of?
|
|
109
|
+
|
|
110
|
+
end # class Stub
|
|
111
|
+
|
|
112
|
+
### Factory method for automatically creating semi-functional
|
|
113
|
+
### stub classes given a real class. It looks like a constant
|
|
114
|
+
### for purposes of syntactic sugar.
|
|
115
|
+
###
|
|
116
|
+
### class MyStub < Stub(X)
|
|
117
|
+
### ...
|
|
118
|
+
### end
|
|
119
|
+
###
|
|
120
|
+
def self.Stub(realclass)
|
|
121
|
+
|
|
122
|
+
stubclass = Class.new(Stub)
|
|
123
|
+
|
|
124
|
+
stubclass.instance_eval{ @realclass = realclass }
|
|
125
|
+
|
|
126
|
+
# Provide an accessor to class instance var that holds the class
|
|
127
|
+
# object we're faking
|
|
128
|
+
class << stubclass
|
|
129
|
+
# The actual class being mocked
|
|
130
|
+
attr_reader :realclass
|
|
131
|
+
|
|
132
|
+
# Propagate the mocked class ivar to derivatives so it can be
|
|
133
|
+
# called like:
|
|
134
|
+
# class MockFoo < Mock(RealClass)
|
|
135
|
+
def inherited(subclass)
|
|
136
|
+
rc = self.realclass
|
|
137
|
+
subclass.instance_eval{ @realclass = rc }
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# Build method definitions for all the mocked class's instance
|
|
142
|
+
# methods, as well as those given to it by its superclasses, since
|
|
143
|
+
# we're not really inheriting from it.
|
|
144
|
+
imethods = realclass.instance_methods(true).collect do |name|
|
|
145
|
+
next if name =~ Quarry::Stub::UnstubbedMethods
|
|
146
|
+
|
|
147
|
+
# Figure out the argument list
|
|
148
|
+
arity = realclass.instance_method(name).arity
|
|
149
|
+
optargs = false
|
|
150
|
+
|
|
151
|
+
if arity < 0
|
|
152
|
+
optargs = true
|
|
153
|
+
arity = (arity+1).abs
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
args = []
|
|
157
|
+
arity.times{|n| args << "arg#{n+1}"}
|
|
158
|
+
args << "*optargs" if optargs
|
|
159
|
+
|
|
160
|
+
# Build a method definition. Some methods need special
|
|
161
|
+
# declarations.
|
|
162
|
+
argsj = args.join(',')
|
|
163
|
+
case name.intern
|
|
164
|
+
when :initialize
|
|
165
|
+
"def initialize(#{argsj}) ; super ; end"
|
|
166
|
+
else
|
|
167
|
+
"def #{name}(#{argsj}) ; self.send(#{name},#{argsj}) ; end"
|
|
168
|
+
#"def %s( %s ) ; self.__mockRegisterCall(%s) ; end" %
|
|
169
|
+
# [ name, argstr, [":#{name}", *args].join(',') ]
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Now add the instance methods to the stubclass class
|
|
174
|
+
stubclass.class_eval imethods.join( "\n" )
|
|
175
|
+
|
|
176
|
+
return stubclass
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
end
|
|
180
|
+
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
require 'quarry/stub/overlay'
|
|
2
|
+
|
|
3
|
+
module Quarry
|
|
4
|
+
|
|
5
|
+
=begin
|
|
6
|
+
class Stub
|
|
7
|
+
def initialize(object)
|
|
8
|
+
@instance_delegate = object
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def method_missing(s, *a, &b)
|
|
12
|
+
@instance_delegate.__send__(s, *a, &b)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
=end
|
|
16
|
+
|
|
17
|
+
# Quarry's Stubbing facility.
|
|
18
|
+
#
|
|
19
|
+
# obj = "hello"
|
|
20
|
+
#
|
|
21
|
+
# obj.stub.upcase == "HeLLo"
|
|
22
|
+
#
|
|
23
|
+
# obj.upcase #=> "HeLLo"
|
|
24
|
+
#
|
|
25
|
+
# obj.stubless!
|
|
26
|
+
#
|
|
27
|
+
# obj.upcase #=> "HELLO"
|
|
28
|
+
#
|
|
29
|
+
class Stub < Module
|
|
30
|
+
attr :object
|
|
31
|
+
|
|
32
|
+
def initialize(object)
|
|
33
|
+
super()
|
|
34
|
+
@object = object
|
|
35
|
+
@table = {}
|
|
36
|
+
@overlay = Overlay.new
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def __table__ ; @table ; end
|
|
40
|
+
|
|
41
|
+
def method_missing(meth, *args, &block)
|
|
42
|
+
table = @table
|
|
43
|
+
interface = [meth, args, block_given?]
|
|
44
|
+
|
|
45
|
+
table[interface] = nil
|
|
46
|
+
|
|
47
|
+
@overlay.define_method(meth) do |*args|
|
|
48
|
+
table[interface]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
@overlay.append_features((class << @object; self; end))
|
|
52
|
+
|
|
53
|
+
Setter.new(table, interface)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
class Setter
|
|
58
|
+
def initialize(table, interface)
|
|
59
|
+
@table = table
|
|
60
|
+
@interface = interface
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def ==(result)
|
|
64
|
+
@table[@interface] = result
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
#
|
|
71
|
+
class ::Object
|
|
72
|
+
|
|
73
|
+
def stub
|
|
74
|
+
@_stub ||= Stub.new(self)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def remove_stubs
|
|
78
|
+
stub.instance_eval do
|
|
79
|
+
@overlay.remove_features((class << @object; self; end))
|
|
80
|
+
end
|
|
81
|
+
#stub.__table__.each do |interface, result|
|
|
82
|
+
# meth = interface[0]
|
|
83
|
+
# stub.module_eval do
|
|
84
|
+
# remove_method(meth)
|
|
85
|
+
# end
|
|
86
|
+
#end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
if $0 == __FILE__
|
|
94
|
+
|
|
95
|
+
# Only one possible stub definition per object?
|
|
96
|
+
|
|
97
|
+
obj = "hello"
|
|
98
|
+
|
|
99
|
+
obj.stub.upcase == "HeLLo"
|
|
100
|
+
|
|
101
|
+
p obj.upcase #=> "HeLLo"
|
|
102
|
+
|
|
103
|
+
# We could always copy it.
|
|
104
|
+
|
|
105
|
+
obj2 = obj.copy
|
|
106
|
+
|
|
107
|
+
# Eek that means we need to copy stub too (FIXME: initialize_copy)
|
|
108
|
+
|
|
109
|
+
obj.remove_stubs
|
|
110
|
+
|
|
111
|
+
p obj.upcase #=> "HELLO"
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
require 'quarry/stub'
|
|
2
|
+
require 'test/unit'
|
|
3
|
+
|
|
4
|
+
class TC_Stub < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
class S < Quarry::Stub
|
|
7
|
+
stat :m, 10
|
|
8
|
+
echo :e
|
|
9
|
+
spin :s, [1,2,3]
|
|
10
|
+
keys :i, { [:foo] => 'Hello', [:boo] => 'Frog' }
|
|
11
|
+
|
|
12
|
+
def a(k) k+1 end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def setup
|
|
16
|
+
@s = S.new
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_stat
|
|
20
|
+
assert_equal(10, @s.m)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_echo
|
|
24
|
+
assert_equal([:hi], @s.e(:hi))
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_spin
|
|
28
|
+
assert_equal(1, @s.s)
|
|
29
|
+
assert_equal(2, @s.s)
|
|
30
|
+
assert_equal(3, @s.s)
|
|
31
|
+
assert_equal(1, @s.s)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_keys
|
|
35
|
+
assert_equal('Hello', @s.i(:foo))
|
|
36
|
+
assert_equal('Frog', @s.i(:boo))
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def assert_normal_method
|
|
40
|
+
assert_equal(2, @s.a(1))
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
class TC_Stub_Wrapper < Test::Unit::TestCase
|
|
45
|
+
|
|
46
|
+
class X
|
|
47
|
+
def a; "a"; end
|
|
48
|
+
def b; "b"; end
|
|
49
|
+
def c; "c"; end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
class XS < Quarry::Stub(X)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def setup
|
|
56
|
+
@xs = XS.new
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def test_responds
|
|
60
|
+
assert_equal(nil, @xs.a)
|
|
61
|
+
assert_equal(nil, @xs.b)
|
|
62
|
+
assert_equal(nil, @xs.c)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
#require 'facet/kernel/within?'
|
|
2
|
+
require 'quarry/assert'
|
|
3
|
+
|
|
4
|
+
at_exit { Quarry::Test.autotest unless $no_autotest }
|
|
5
|
+
|
|
6
|
+
module Quarry
|
|
7
|
+
module Test
|
|
8
|
+
|
|
9
|
+
# TODO: make output compatible with unit_diff ?
|
|
10
|
+
|
|
11
|
+
def self.autotest
|
|
12
|
+
::ObjectSpace.each_object(Suite) do |suite|
|
|
13
|
+
puts "Running test suite #{suite.description.upcase}:"
|
|
14
|
+
suite.cases.each do |kase|
|
|
15
|
+
puts "== #{kase.description.upcase}\n"
|
|
16
|
+
kase.units.each_with_index do |test, i|
|
|
17
|
+
kase.setup
|
|
18
|
+
begin
|
|
19
|
+
test.call
|
|
20
|
+
|
|
21
|
+
rescue Assertion => e
|
|
22
|
+
print "#{i+1}) #{test.description}"
|
|
23
|
+
print "\a FAIL! "
|
|
24
|
+
puts "[" + e.backtrace[2] + "]"
|
|
25
|
+
puts "#{e}\n" if $VERBOSE
|
|
26
|
+
|
|
27
|
+
rescue Exception => e
|
|
28
|
+
print "#{i+1}) #{test.description}"
|
|
29
|
+
print "\a ERROR! "
|
|
30
|
+
puts "[" + e.backtrace[2] + "]"
|
|
31
|
+
puts "#{e}\n" if $VERBOSE
|
|
32
|
+
#puts "#{klass}.#{meth}: #{e}"
|
|
33
|
+
ensure
|
|
34
|
+
kase.teardown
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#
|
|
42
|
+
|
|
43
|
+
def self.suites
|
|
44
|
+
@suites ||= []
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def self.suite(description, &testsuite)
|
|
48
|
+
suites << Suite.new(description, &testsuite)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# A test suite.
|
|
52
|
+
|
|
53
|
+
class Suite
|
|
54
|
+
attr :description
|
|
55
|
+
|
|
56
|
+
def initialize(description, &testsuite)
|
|
57
|
+
@description = description
|
|
58
|
+
@testsuite = testsuite
|
|
59
|
+
@testcases = []
|
|
60
|
+
|
|
61
|
+
instance_eval(&testsuite)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def cases
|
|
65
|
+
@testcases ||= []
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def test_case(description, &testcase)
|
|
69
|
+
cases << Case.new(description, &testcase)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# A test case.
|
|
74
|
+
|
|
75
|
+
class Case
|
|
76
|
+
attr :description
|
|
77
|
+
|
|
78
|
+
def initialize(description, &testcase)
|
|
79
|
+
@description = description
|
|
80
|
+
@testcase = testcase
|
|
81
|
+
@testunits = []
|
|
82
|
+
instance_eval(&testcase)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def units
|
|
86
|
+
@testunits ||= []
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def setup; end
|
|
90
|
+
|
|
91
|
+
def teardown; end
|
|
92
|
+
|
|
93
|
+
def test(description, &testunit)
|
|
94
|
+
units << Unit.new(description, &testunit)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# A test unit.
|
|
99
|
+
|
|
100
|
+
class Unit
|
|
101
|
+
attr :description
|
|
102
|
+
|
|
103
|
+
def initialize(description, &testunit)
|
|
104
|
+
@description = description
|
|
105
|
+
@testunit = testunit
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def call
|
|
109
|
+
@testunit.call
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
# EXAMPLE
|
|
118
|
+
|
|
119
|
+
if __FILE__ == $0
|
|
120
|
+
|
|
121
|
+
Quarry::Test.suite "example suite" do
|
|
122
|
+
|
|
123
|
+
test_case "example case" do
|
|
124
|
+
|
|
125
|
+
test "4 should equal 3" do
|
|
126
|
+
4.assert == 3
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
test "4 should not equal 4" do
|
|
130
|
+
4.assert_not == 4
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
test "raises syntax error" do
|
|
134
|
+
lambda{raise SyntaxError}.should.raise? SyntaxError
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
end
|