quarry 0.3.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 +6 -0
- data/COPYING +344 -0
- data/MANIFEST +151 -0
- data/METADATA +22 -0
- data/NEWS +8 -0
- data/README +75 -0
- data/VERSION +1 -0
- data/bin/rubybreak +3 -0
- data/bin/xact-ruby +6 -0
- data/demo/spec/demo_check.rb +21 -0
- data/demo/spec/demo_outline.rb +25 -0
- data/demo/test/demo_run.rb +21 -0
- data/doc/manual.html2 +1416 -0
- data/doc/rdoc/classes/Assertion.html +101 -0
- data/doc/rdoc/classes/Assertion/False.html +132 -0
- data/doc/rdoc/classes/Assertion/True.html +137 -0
- data/doc/rdoc/classes/Kernel.html +86 -0
- data/doc/rdoc/classes/Method.html +137 -0
- data/doc/rdoc/classes/Module.html +165 -0
- data/doc/rdoc/classes/Object.html +154 -0
- data/doc/rdoc/classes/Quarry.html +177 -0
- data/doc/rdoc/classes/Quarry/Design.html +170 -0
- data/doc/rdoc/classes/Quarry/Design/Specification.html +265 -0
- data/doc/rdoc/classes/Quarry/Design/Specification/Context.html +174 -0
- data/doc/rdoc/classes/Quarry/MethodProbe.html +267 -0
- data/doc/rdoc/classes/Quarry/Mock.html +89 -0
- data/doc/rdoc/classes/Quarry/Mock/Object.html +276 -0
- data/doc/rdoc/created.rid +1 -0
- data/doc/rdoc/files/CHANGES.html +100 -0
- data/doc/rdoc/files/COPYING.html +457 -0
- data/doc/rdoc/files/MANIFEST.html +630 -0
- data/doc/rdoc/files/METADATA.html +92 -0
- data/doc/rdoc/files/NEWS.html +99 -0
- data/doc/rdoc/files/README.html +171 -0
- data/doc/rdoc/files/VERSION.html +96 -0
- data/doc/rdoc/files/bin/rubybreak.html +96 -0
- data/doc/rdoc/files/bin/xact-ruby.html +92 -0
- data/doc/rdoc/files/lib/quarry/assert/must_rb.html +96 -0
- data/doc/rdoc/files/lib/quarry/assert/should_rb.html +96 -0
- data/doc/rdoc/files/lib/quarry/assertion_rb.html +96 -0
- data/doc/rdoc/files/lib/quarry/breakout_rb.html +144 -0
- data/doc/rdoc/files/lib/quarry/design/spec_rb.html +100 -0
- data/doc/rdoc/files/lib/quarry/document_rb.html +92 -0
- data/doc/rdoc/files/lib/quarry/loadmonitor_rb.html +92 -0
- data/doc/rdoc/files/lib/quarry/methodprobe_rb.html +111 -0
- data/doc/rdoc/files/lib/quarry/mock/object_rb.html +123 -0
- data/doc/rdoc/files/lib/quarry/mockery_rb.html +115 -0
- data/doc/rdoc/fr_class_index.html +60 -0
- data/doc/rdoc/fr_file_index.html +65 -0
- data/doc/rdoc/fr_method_index.html +77 -0
- data/doc/rdoc/index.html +26 -0
- data/doc/rdoc/rdoc-style.css +175 -0
- data/doc/ri/Assertion/False/assert-i.yaml +10 -0
- data/doc/ri/Assertion/False/cdesc-False.yaml +19 -0
- data/doc/ri/Assertion/False/message-i.yaml +10 -0
- data/doc/ri/Assertion/True/assert-i.yaml +11 -0
- data/doc/ri/Assertion/True/cdesc-True.yaml +24 -0
- data/doc/ri/Assertion/True/message-c.yaml +11 -0
- data/doc/ri/Assertion/True/message-i.yaml +11 -0
- data/doc/ri/Assertion/True/method_missing-i.yaml +11 -0
- data/doc/ri/Assertion/True/new-c.yaml +11 -0
- data/doc/ri/Assertion/cdesc-Assertion.yaml +17 -0
- data/doc/ri/Kernel/cdesc-Kernel.yaml +15 -0
- data/doc/ri/Method/cdesc-Method.yaml +18 -0
- data/doc/ri/Method/migration-i.yaml +12 -0
- data/doc/ri/Method/signature-i.yaml +12 -0
- data/doc/ri/Module/cdesc-Module.yaml +21 -0
- data/doc/ri/Module/doc-i.yaml +16 -0
- data/doc/ri/Module/method_added-i.yaml +10 -0
- data/doc/ri/Object/assert%21-i.yaml +14 -0
- data/doc/ri/Object/assert-i.yaml +14 -0
- data/doc/ri/Object/cdesc-Object.yaml +20 -0
- data/doc/ri/Quarry/Design/Specification/Context/after-i.yaml +10 -0
- data/doc/ri/Quarry/Design/Specification/Context/before-i.yaml +10 -0
- data/doc/ri/Quarry/Design/Specification/Context/cdesc-Context.yaml +24 -0
- data/doc/ri/Quarry/Design/Specification/Context/method_missing-i.yaml +10 -0
- data/doc/ri/Quarry/Design/Specification/Context/specifications-i.yaml +10 -0
- data/doc/ri/Quarry/Design/Specification/cdesc-Specification.yaml +44 -0
- data/doc/ri/Quarry/Design/Specification/check-i.yaml +12 -0
- data/doc/ri/Quarry/Design/Specification/new-c.yaml +12 -0
- data/doc/ri/Quarry/Design/Specification/outline-i.yaml +12 -0
- data/doc/ri/Quarry/Design/cdesc-Design.yaml +22 -0
- data/doc/ri/Quarry/Design/check-c.yaml +12 -0
- data/doc/ri/Quarry/Design/outline-c.yaml +10 -0
- data/doc/ri/Quarry/Design/specification-c.yaml +10 -0
- data/doc/ri/Quarry/Design/specifications-c.yaml +10 -0
- data/doc/ri/Quarry/MethodProbe/cdesc-MethodProbe.yaml +46 -0
- data/doc/ri/Quarry/MethodProbe/duckcall-c.yaml +10 -0
- data/doc/ri/Quarry/MethodProbe/initialize_copy-i.yaml +10 -0
- data/doc/ri/Quarry/MethodProbe/method_missing-i.yaml +10 -0
- data/doc/ri/Quarry/MethodProbe/new-c.yaml +10 -0
- data/doc/ri/Quarry/Mock/Object/cdesc-Object.yaml +52 -0
- data/doc/ri/Quarry/Mock/Object/echo-c.yaml +12 -0
- data/doc/ri/Quarry/Mock/Object/keys-c.yaml +12 -0
- data/doc/ri/Quarry/Mock/Object/mock-c.yaml +12 -0
- data/doc/ri/Quarry/Mock/Object/mocks-c.yaml +10 -0
- data/doc/ri/Quarry/Mock/Object/spin-c.yaml +12 -0
- data/doc/ri/Quarry/Mock/cdesc-Mock.yaml +15 -0
- data/doc/ri/Quarry/Mockery-i.yaml +12 -0
- data/doc/ri/Quarry/cdesc-Quarry.yaml +17 -0
- data/doc/ri/created.rid +1 -0
- data/lib/quarry/assert/must.rb +8 -0
- data/lib/quarry/assert/should.rb +9 -0
- data/lib/quarry/assertion.rb +95 -0
- data/lib/quarry/breakout.rb +45 -0
- data/lib/quarry/design/spec.rb +197 -0
- data/lib/quarry/document.rb +35 -0
- data/lib/quarry/loadmonitor.rb +14 -0
- data/lib/quarry/methodprobe.rb +216 -0
- data/lib/quarry/mock/object.rb +169 -0
- data/lib/quarry/mockery.rb +85 -0
- metadata +214 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
--- !ruby/object:RI::MethodDescription
|
|
2
|
+
aliases: []
|
|
3
|
+
|
|
4
|
+
block_params:
|
|
5
|
+
comment:
|
|
6
|
+
- !ruby/struct:SM::Flow::P
|
|
7
|
+
body: Responds according to a mapping of input parameters.
|
|
8
|
+
full_name: Quarry::Mock::Object::keys
|
|
9
|
+
is_singleton: true
|
|
10
|
+
name: keys
|
|
11
|
+
params: ( sym, hsh )
|
|
12
|
+
visibility: public
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
--- !ruby/object:RI::MethodDescription
|
|
2
|
+
aliases: []
|
|
3
|
+
|
|
4
|
+
block_params:
|
|
5
|
+
comment:
|
|
6
|
+
- !ruby/struct:SM::Flow::P
|
|
7
|
+
body: Mock a static repsonse.
|
|
8
|
+
full_name: Quarry::Mock::Object::mock
|
|
9
|
+
is_singleton: true
|
|
10
|
+
name: mock
|
|
11
|
+
params: ( sym, val )
|
|
12
|
+
visibility: public
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
--- !ruby/object:RI::MethodDescription
|
|
2
|
+
aliases: []
|
|
3
|
+
|
|
4
|
+
block_params:
|
|
5
|
+
comment:
|
|
6
|
+
- !ruby/struct:SM::Flow::P
|
|
7
|
+
body: Reponds with a rotation of reponses.
|
|
8
|
+
full_name: Quarry::Mock::Object::spin
|
|
9
|
+
is_singleton: true
|
|
10
|
+
name: spin
|
|
11
|
+
params: ( sym, arr )
|
|
12
|
+
visibility: public
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
--- !ruby/object:RI::MethodDescription
|
|
2
|
+
aliases: []
|
|
3
|
+
|
|
4
|
+
block_params:
|
|
5
|
+
comment:
|
|
6
|
+
- !ruby/struct:SM::Flow::P
|
|
7
|
+
body: Factory method for creating semi-functional mock object classes given the class which is to be mocked. It looks like a constant for purposes of syntactic sugar.
|
|
8
|
+
full_name: Quarry#Mockery
|
|
9
|
+
is_singleton: false
|
|
10
|
+
name: Mockery
|
|
11
|
+
params: ( realclass )
|
|
12
|
+
visibility: public
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
--- !ruby/object:RI::ClassDescription
|
|
2
|
+
attributes: []
|
|
3
|
+
|
|
4
|
+
class_methods: []
|
|
5
|
+
|
|
6
|
+
comment: []
|
|
7
|
+
|
|
8
|
+
constants: []
|
|
9
|
+
|
|
10
|
+
full_name: Quarry
|
|
11
|
+
includes: []
|
|
12
|
+
|
|
13
|
+
instance_methods:
|
|
14
|
+
- !ruby/object:RI::MethodSummary
|
|
15
|
+
name: Mockery
|
|
16
|
+
name: Quarry
|
|
17
|
+
superclass:
|
data/doc/ri/created.rid
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Thu, 21 Aug 2008 13:19:31 -0400
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Copyright (c) 2008 Tiger Ops
|
|
2
|
+
|
|
3
|
+
class Object
|
|
4
|
+
# Assert a operational relationship.
|
|
5
|
+
#
|
|
6
|
+
# 4.assert == 3 #=> Assertion Error
|
|
7
|
+
#
|
|
8
|
+
def assert
|
|
9
|
+
return Assertion::True.new(self)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Assert not an operational relationship.
|
|
13
|
+
#
|
|
14
|
+
# 4.assert! == 4 #=> Assertion Error
|
|
15
|
+
#
|
|
16
|
+
def assert!
|
|
17
|
+
return Assertion::False.new(self)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Assertion object is a special subclass of Exception,
|
|
22
|
+
# used to raise assertion errors.
|
|
23
|
+
#
|
|
24
|
+
class Assertion < Exception
|
|
25
|
+
|
|
26
|
+
#
|
|
27
|
+
class True
|
|
28
|
+
#
|
|
29
|
+
def self.message(msg,&block)
|
|
30
|
+
@messages ||= {}
|
|
31
|
+
if block
|
|
32
|
+
@messages[msg] = block
|
|
33
|
+
else
|
|
34
|
+
@messages[msg]
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
hide = instance_methods.reject { |m| m.to_s =~ /^__/ }
|
|
39
|
+
hide.each { |m| protected m }
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
#
|
|
44
|
+
def initialize(delegate)
|
|
45
|
+
@delegate = delegate
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
def assert(assertion, msg="failed assertion (no message given)")
|
|
50
|
+
raise Assertion, msg unless assertion
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
#
|
|
54
|
+
message(:==){ |*a| "Expected #{a[0].inspect} to be equal to #{a[1].inspect}" }
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
def method_missing( sym, *a, &b )
|
|
58
|
+
case sym
|
|
59
|
+
when :raise?, :raises?
|
|
60
|
+
begin
|
|
61
|
+
@delegate.call #yield
|
|
62
|
+
assert false, "Expected #{a[0]} to be raised"
|
|
63
|
+
rescue Exception => e
|
|
64
|
+
assert a[0] === e, "Expected #{a[0]} to be raised, but got #{e.class}"
|
|
65
|
+
return e
|
|
66
|
+
end
|
|
67
|
+
else
|
|
68
|
+
msg = message(@delegate, sym, *a, &b)
|
|
69
|
+
assert(@delegate.send(sym, *a, &b ), msg)
|
|
70
|
+
#assert( @delegate.send(sym, *a, &b ), self.class.message(sym)[@delegate, *a] )
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
#
|
|
75
|
+
def message( obj, sym, *a, &b )
|
|
76
|
+
"#{sym}\n< #{obj.inspect}\n---\n> #{a.collect{|x| x.inspect}.join(',')}"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
#
|
|
82
|
+
class False < True
|
|
83
|
+
message(:==){ |*a| "Expected #{a[0].inspect} not to be equal to #{a[1].inspect}" }
|
|
84
|
+
|
|
85
|
+
def assert(assertion, msg="failed assertion (no message given)")
|
|
86
|
+
raise Assertion, msg if assertion
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def message( obj, sym, *a, &b )
|
|
90
|
+
"#{obj.inspect} should not #{sym} #{a.collect{|x| x.inspect}.join(',')}"
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
end
|
|
95
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require 'facets/core/string/margin' # TODO get rid of.
|
|
2
|
+
|
|
3
|
+
def breakout( error )
|
|
4
|
+
|
|
5
|
+
file, line = *error.exception.backtrace[0].split(':')
|
|
6
|
+
line = line.to_i
|
|
7
|
+
|
|
8
|
+
puts error
|
|
9
|
+
|
|
10
|
+
e = "# DEBUG " + error.to_s
|
|
11
|
+
e.gsub!("`","'")
|
|
12
|
+
|
|
13
|
+
e = Regexp.escape(e)
|
|
14
|
+
|
|
15
|
+
case ed = ENV['EDITOR']
|
|
16
|
+
when 'vi', 'vim', 'gvim'
|
|
17
|
+
cmd = %[
|
|
18
|
+
|#{ed} -e -s #{file} <<-EOS
|
|
19
|
+
|:#{line}
|
|
20
|
+
|a
|
|
21
|
+
|#{e}
|
|
22
|
+
|.
|
|
23
|
+
|:.,+#{e.size}
|
|
24
|
+
|EOS
|
|
25
|
+
].margin
|
|
26
|
+
else
|
|
27
|
+
puts "EDITOR environment variable not set"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
system cmd
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# command-line mode
|
|
35
|
+
|
|
36
|
+
if __FILE__ == $0
|
|
37
|
+
|
|
38
|
+
begin
|
|
39
|
+
load $file = ARGV[0]
|
|
40
|
+
rescue Exception => e
|
|
41
|
+
error = breakout(e)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
#require 'facet/kernel/within?'
|
|
2
|
+
require 'quarry/assertion'
|
|
3
|
+
|
|
4
|
+
module Quarry
|
|
5
|
+
module Design
|
|
6
|
+
|
|
7
|
+
class << self
|
|
8
|
+
def specifications
|
|
9
|
+
@specifications ||= []
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def specification(description, &specification)
|
|
13
|
+
specifications << Specification.new(nil, description, &specification)
|
|
14
|
+
end
|
|
15
|
+
alias_method :spec, :specification
|
|
16
|
+
|
|
17
|
+
# TODO: make output compatible with unit_diff ?
|
|
18
|
+
|
|
19
|
+
def check
|
|
20
|
+
specifications.each do |specification|
|
|
21
|
+
specification.check
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def outline
|
|
26
|
+
specifications.each do |specification|
|
|
27
|
+
specification.outline
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Design specification. Sepcification can contains sub-specifications.
|
|
33
|
+
#
|
|
34
|
+
class Specification
|
|
35
|
+
attr :relation
|
|
36
|
+
attr :description
|
|
37
|
+
attr :specification
|
|
38
|
+
attr :context
|
|
39
|
+
attr :before
|
|
40
|
+
attr :after
|
|
41
|
+
|
|
42
|
+
# New Specification
|
|
43
|
+
|
|
44
|
+
def initialize(relation, description, context=nil, &specification)
|
|
45
|
+
@relation = relation
|
|
46
|
+
@description = description
|
|
47
|
+
@specification = specification
|
|
48
|
+
@context = context
|
|
49
|
+
@before = context.before if context
|
|
50
|
+
@after = context.after if context
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Check Specification
|
|
54
|
+
|
|
55
|
+
def check(level=0)
|
|
56
|
+
padding = " " * 2 * level
|
|
57
|
+
|
|
58
|
+
clause = "#{relation} #{description}".strip
|
|
59
|
+
|
|
60
|
+
new_context = Context.new
|
|
61
|
+
new_context.instance_eval(&before) if before
|
|
62
|
+
begin
|
|
63
|
+
new_context.instance_eval(&specification)
|
|
64
|
+
puts ("=" * (level+1)) + " " + clause.gsub(/\b\w/){$&.upcase}
|
|
65
|
+
rescue Assertion => e
|
|
66
|
+
#puts padding + " (FAIL) [#{e.backtrace[2]}] " + clause
|
|
67
|
+
puts "* " + clause.gsub('_',' ') + " [#{e.backtrace[2]}]"
|
|
68
|
+
puts e if $VERBOSE
|
|
69
|
+
rescue Exception => e
|
|
70
|
+
raise e if $DEBUG
|
|
71
|
+
print padding
|
|
72
|
+
#puts padding + " (ERROR) [#{e.backtrace[2]}] " + clause
|
|
73
|
+
puts padding + " (ERROR) #{e}"
|
|
74
|
+
puts e.backtrace if $VERBOSE
|
|
75
|
+
ensure
|
|
76
|
+
new_context.instance_eval(&after) if after
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
new_context.specifications.each do |s|
|
|
80
|
+
s.check(level+1)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Outline Specification
|
|
85
|
+
|
|
86
|
+
def outline(level=0)
|
|
87
|
+
padding = (" " * 2 * level) + "- "
|
|
88
|
+
context = Context.new
|
|
89
|
+
begin
|
|
90
|
+
context.instance_eval(&specification)
|
|
91
|
+
rescue Assertion => e
|
|
92
|
+
#rescue Exception => e
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
str = ''
|
|
96
|
+
str << "#{relation} " if relation
|
|
97
|
+
str << "#{description}"
|
|
98
|
+
#str = str.strip #.gsub(/\b\w/){$&.upcase}
|
|
99
|
+
|
|
100
|
+
puts padding + str.strip
|
|
101
|
+
|
|
102
|
+
context.specifications.each do |s|
|
|
103
|
+
s.outline(level+1)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# A context provides a "clean room" to build a specification.
|
|
108
|
+
|
|
109
|
+
class Context
|
|
110
|
+
|
|
111
|
+
def specifications
|
|
112
|
+
@specifications ||= []
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def before(&before)
|
|
116
|
+
before ? @before = before : before
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def after(&after)
|
|
120
|
+
after ? @after = after : after
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def method_missing(relation, *description, &specification)
|
|
124
|
+
if description.size > 1
|
|
125
|
+
super
|
|
126
|
+
else
|
|
127
|
+
specifications << Specification.new(relation, description.first, self, &specification)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
at_exit { Quarry::Design.check unless $no_autocheck }
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
=begin demo
|
|
142
|
+
|
|
143
|
+
Quarry::Design.specification "Example Specification" do
|
|
144
|
+
|
|
145
|
+
context "demonstrate basic assertions" do
|
|
146
|
+
|
|
147
|
+
specify "fail if should is false" do
|
|
148
|
+
4.assert == 3
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
specify "fail if should_not is true" do
|
|
152
|
+
4.assert! == 4
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
specify "fail on should raise" do
|
|
156
|
+
lambda{raise ArgumentError}.assert.raise? SyntaxError
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
$no_autocheck = true
|
|
164
|
+
|
|
165
|
+
Quarry::Design.outline
|
|
166
|
+
|
|
167
|
+
=end
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
if __FILE__ == $0
|
|
171
|
+
|
|
172
|
+
Quarry::Design.spec "Example Specification" do
|
|
173
|
+
|
|
174
|
+
demonstrate "basic assertions" do
|
|
175
|
+
|
|
176
|
+
that "4 == 3 fails" do
|
|
177
|
+
4.assert == 3
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
that "4 != 4 fails" do
|
|
181
|
+
4.assert! == 4
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
that "raising an ArgumentError does not raise a SyntaxError" do
|
|
185
|
+
lambda{raise ArgumentError}.assert.raise? SyntaxError
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
$no_autocheck = true
|
|
193
|
+
|
|
194
|
+
Quarry::Design.outline
|
|
195
|
+
|
|
196
|
+
end
|
|
197
|
+
|