delano-tryouts 0.7.0 → 0.7.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.
- data/CHANGES.txt +8 -3
- data/lib/tryouts.rb +1 -1
- data/lib/tryouts/drill/sergeant/benchmark.rb +51 -0
- data/lib/tryouts/drill/sergeant/rbenchmark.rb +132 -0
- data/lib/tryouts/stats.rb +92 -0
- data/tryouts.gemspec +9 -1
- data/tryouts/01_mixins_tryouts.rb +26 -0
- data/tryouts/10_syntax_tryouts.rb +40 -0
- data/tryouts/20_cli_tryouts.rb +46 -0
- data/tryouts/50_class_context_tryouts.rb +30 -0
- data/tryouts/standalone_test.rb +37 -0
- metadata +9 -1
data/CHANGES.txt
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
TRYOUTS, CHANGES
|
2
2
|
|
3
3
|
|
4
|
-
#### 0.
|
4
|
+
#### 0.7.1 (2009-06-26) ###############################
|
5
5
|
|
6
|
-
|
6
|
+
* FIXED: Updated manifest in gemspec
|
7
|
+
* CHANGE: :cli testing is disabled indefinitely
|
8
|
+
* ADDED: Found Muggsy Bogues
|
9
|
+
|
10
|
+
|
11
|
+
#### 0.7.0 (2009-06-25) ###############################
|
7
12
|
|
8
13
|
* FIXED: Stash wasn't being displayed in the drill report
|
9
14
|
* CHANGE: CLI is now formatted to be 80 characters wide.
|
@@ -80,11 +85,11 @@ NOTE: command testing (:cli) is disabled.
|
|
80
85
|
* ADDED: Drill stash!
|
81
86
|
* ADDED: xdream and better handling for drills and dreams with no name
|
82
87
|
|
88
|
+
|
83
89
|
#### 0.4.1 (2009-06-07) ###############################
|
84
90
|
|
85
91
|
* CHANGE: The CLI output is no longer terrifyingly ugly
|
86
92
|
|
87
|
-
|
88
93
|
#### 0.4.0 (2009-06-05) ###############################
|
89
94
|
|
90
95
|
NOTE: Initial public release
|
data/lib/tryouts.rb
CHANGED
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
class Tryouts; class Drill; module Sergeant
|
6
|
+
|
7
|
+
# = Benchmark
|
8
|
+
#
|
9
|
+
# The sergeant responsible for running benchmarks
|
10
|
+
#
|
11
|
+
class Benchmark
|
12
|
+
require 'benchmark'
|
13
|
+
|
14
|
+
attr_reader :output
|
15
|
+
|
16
|
+
# * +reps+ Number of times to execute drill (>= 0, <= 30). Default: 3
|
17
|
+
#
|
18
|
+
def initialize(reps=nil)
|
19
|
+
@reps = (1..30).include?(reps) ? reps : 5
|
20
|
+
@stats = Tryouts::Stats.new
|
21
|
+
end
|
22
|
+
|
23
|
+
def run(block, context, &inline)
|
24
|
+
# A Proc object takes precedence over an inline block.
|
25
|
+
runtime = (block.nil? ? inline : block)
|
26
|
+
response = Tryouts::Drill::Reality.new
|
27
|
+
if runtime.nil?
|
28
|
+
raise "We need a block to benchmark"
|
29
|
+
else
|
30
|
+
begin
|
31
|
+
|
32
|
+
@reps.times do
|
33
|
+
run = ::Benchmark.realtime &runtime
|
34
|
+
@stats.sample run
|
35
|
+
end
|
36
|
+
|
37
|
+
response.output = @stats
|
38
|
+
|
39
|
+
rescue => e
|
40
|
+
puts e.message, e.backtrace if Tryouts.verbose > 2
|
41
|
+
response.output = false
|
42
|
+
response.etype = e.class
|
43
|
+
response.error = e.message
|
44
|
+
response.trace = e.backtrace
|
45
|
+
end
|
46
|
+
end
|
47
|
+
response
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end; end; end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
|
2
|
+
require 'benchmark'
|
3
|
+
|
4
|
+
|
5
|
+
class Tryouts; class Drill; module Sergeant
|
6
|
+
|
7
|
+
# = RBenchmark
|
8
|
+
#
|
9
|
+
# This is an implementation of Better-Benchmark:
|
10
|
+
# http://github.com/Pistos/better-benchmark/
|
11
|
+
#
|
12
|
+
# NOTE: It's a work in progress and currently not functioning
|
13
|
+
#
|
14
|
+
# See also: http://www.graphpad.com/articles/interpret/Analyzing_two_groups/wilcoxon_matched_pairs.htm
|
15
|
+
#
|
16
|
+
module RBenchmark
|
17
|
+
|
18
|
+
VERSION = '0.7.0'
|
19
|
+
|
20
|
+
class ComparisonPartial
|
21
|
+
def initialize( block, options )
|
22
|
+
@block1 = block
|
23
|
+
@options = options
|
24
|
+
end
|
25
|
+
|
26
|
+
def with( &block2 )
|
27
|
+
times1 = []
|
28
|
+
times2 = []
|
29
|
+
|
30
|
+
(1..@options[ :iterations ]).each do |iteration|
|
31
|
+
if @options[ :verbose ]
|
32
|
+
$stdout.print "."; $stdout.flush
|
33
|
+
end
|
34
|
+
|
35
|
+
times1 << ::Benchmark.realtime do
|
36
|
+
@options[ :inner_iterations ].times do |i|
|
37
|
+
@block1.call( iteration )
|
38
|
+
end
|
39
|
+
end
|
40
|
+
times2 << ::Benchmark.realtime do
|
41
|
+
@options[ :inner_iterations ].times do |i|
|
42
|
+
block2.call( iteration )
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
r = RSRuby.instance
|
48
|
+
wilcox_result = r.wilcox_test( times1, times2 )
|
49
|
+
|
50
|
+
{
|
51
|
+
:results1 => {
|
52
|
+
:times => times1,
|
53
|
+
:mean => r.mean( times1 ),
|
54
|
+
:stddev => r.sd( times1 ),
|
55
|
+
},
|
56
|
+
:results2 => {
|
57
|
+
:times => times2,
|
58
|
+
:mean => r.mean( times2 ),
|
59
|
+
:stddev => r.sd( times2 ),
|
60
|
+
},
|
61
|
+
:p => wilcox_result[ 'p.value' ],
|
62
|
+
:W => wilcox_result[ 'statistic' ][ 'W' ],
|
63
|
+
:significant => (
|
64
|
+
wilcox_result[ 'p.value' ] < @options[ :required_significance ]
|
65
|
+
),
|
66
|
+
}
|
67
|
+
end
|
68
|
+
alias to with
|
69
|
+
end
|
70
|
+
|
71
|
+
# Options:
|
72
|
+
# :iterations
|
73
|
+
# The number of times to execute the pair of blocks.
|
74
|
+
# :inner_iterations
|
75
|
+
# Used to increase the time taken per iteration.
|
76
|
+
# :required_significance
|
77
|
+
# Maximum allowed p value in order to declare the results statistically significant.
|
78
|
+
# :verbose
|
79
|
+
# Whether to print a dot for each iteration (as a sort of progress meter).
|
80
|
+
#
|
81
|
+
# To use better-benchmark properly, it is important to set :iterations and
|
82
|
+
# :inner_iterations properly. There are a few things to bear in mind:
|
83
|
+
#
|
84
|
+
# (1) Do not set :iterations too high. It should normally be in the range
|
85
|
+
# of 10-20, but can be lower. Over 25 should be considered too high.
|
86
|
+
# (2) Execution time for one run of the blocks under test should not be too
|
87
|
+
# small (or else random variance will muddle the results). Aim for at least
|
88
|
+
# 1.0 seconds per iteration.
|
89
|
+
# (3) Minimize the proportion of any warmup time (and cooldown time) of one
|
90
|
+
# block run.
|
91
|
+
#
|
92
|
+
# In order to achieve these goals, you will need to tweak :inner_iterations
|
93
|
+
# based on your situation. The exact number you should use will depend on
|
94
|
+
# the strength of the hardware (CPU, RAM, disk), and the amount of work done
|
95
|
+
# by the blocks. For code blocks that execute extremely rapidly, you may
|
96
|
+
# need hundreds of thousands of :inner_iterations.
|
97
|
+
def self.compare_realtime( options = {}, &block1 )
|
98
|
+
require 'rsruby'
|
99
|
+
|
100
|
+
options[ :iterations ] ||= 20
|
101
|
+
options[ :inner_iterations ] ||= 1
|
102
|
+
options[ :required_significance ] ||= 0.01
|
103
|
+
|
104
|
+
if options[ :iterations ] > 30
|
105
|
+
warn "The number of iterations is set to #{options[ :iterations ]}. " +
|
106
|
+
"Using too many iterations may make the test results less reliable. " +
|
107
|
+
"It is recommended to increase the number of :inner_iterations instead."
|
108
|
+
end
|
109
|
+
|
110
|
+
ComparisonPartial.new( block1, options )
|
111
|
+
end
|
112
|
+
|
113
|
+
def self.report_on( result )
|
114
|
+
puts
|
115
|
+
puts( "Set 1 mean: %.3f s" % [ result[ :results1 ][ :mean ] ] )
|
116
|
+
puts( "Set 1 std dev: %.3f" % [ result[ :results1 ][ :stddev ] ] )
|
117
|
+
puts( "Set 2 mean: %.3f s" % [ result[ :results2 ][ :mean ] ] )
|
118
|
+
puts( "Set 2 std dev: %.3f" % [ result[ :results2 ][ :stddev ] ] )
|
119
|
+
puts "p.value: #{result[ :p ]}"
|
120
|
+
puts "W: #{result[ :W ]}"
|
121
|
+
puts(
|
122
|
+
"The difference (%+.1f%%) %s statistically significant." % [
|
123
|
+
( ( result[ :results2 ][ :mean ] - result[ :results1 ][ :mean ] ) / result[ :results1 ][ :mean ] ) * 100,
|
124
|
+
result[ :significant ] ? 'IS' : 'IS NOT'
|
125
|
+
]
|
126
|
+
)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
end; end; end
|
131
|
+
|
132
|
+
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# Copyright (c) 2005 Zed A. Shaw
|
2
|
+
# You can redistribute it and/or modify it under the same terms as Ruby.
|
3
|
+
#
|
4
|
+
# Additional work donated by contributors. See http://mongrel.rubyforge.org/attributions.html
|
5
|
+
# for more information.
|
6
|
+
|
7
|
+
# Stolen from:
|
8
|
+
# http://mongrel.rubyforge.org/browser/trunk/lib/mongrel/stats.rb
|
9
|
+
#
|
10
|
+
# A very simple little class for doing some basic fast statistics sampling.
|
11
|
+
# You feed it either samples of numeric data you want measured or you call
|
12
|
+
# Stats.tick to get it to add a time delta between the last time you called it.
|
13
|
+
# When you're done either call sum, sumsq, n, min, max, mean or sd to get
|
14
|
+
# the information. The other option is to just call dump and see everything.
|
15
|
+
#
|
16
|
+
# It does all of this very fast and doesn't take up any memory since the samples
|
17
|
+
# are not stored but instead all the values are calculated on the fly.
|
18
|
+
class Tryouts
|
19
|
+
class Stats
|
20
|
+
attr_reader :sum, :sumsq, :n, :min, :max
|
21
|
+
|
22
|
+
def initialize(name=:unknown)
|
23
|
+
@name = name
|
24
|
+
reset
|
25
|
+
end
|
26
|
+
|
27
|
+
# Resets the internal counters so you can start sampling again.
|
28
|
+
def reset
|
29
|
+
@sum = 0.0
|
30
|
+
@sumsq = 0.0
|
31
|
+
@last_time = Time.new
|
32
|
+
@n = 0.0
|
33
|
+
@min = 0.0
|
34
|
+
@max = 0.0
|
35
|
+
end
|
36
|
+
|
37
|
+
# Adds a sampling to the calculations.
|
38
|
+
def sample(s)
|
39
|
+
@sum += s
|
40
|
+
@sumsq += s * s
|
41
|
+
if @n == 0
|
42
|
+
@min = @max = s
|
43
|
+
else
|
44
|
+
@min = s if @min > s
|
45
|
+
@max = s if @max < s
|
46
|
+
end
|
47
|
+
(@n+=1).to_f
|
48
|
+
end
|
49
|
+
|
50
|
+
# Dump this Stats object with an optional additional message.
|
51
|
+
def dump(msg = "", out=STDERR)
|
52
|
+
out.puts "#{msg}: #{self.to_s}"
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns a common display (used by dump)
|
56
|
+
def to_s
|
57
|
+
"[#{@name}]: SUM=%0.4f, SUMSQ=%0.4f, N=%0.4f, MEAN=%0.4f, SD=%0.4f, MIN=%0.4f, MAX=%0.4f" % [@sum, @sumsq, @n, mean, sd, @min, @max]
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
# Calculates and returns the mean for the data passed so far.
|
62
|
+
def mean
|
63
|
+
@sum / @n
|
64
|
+
end
|
65
|
+
|
66
|
+
# Calculates the standard deviation of the data so far.
|
67
|
+
def sdev
|
68
|
+
# (sqrt( ((s).sumsq - ( (s).sum * (s).sum / (s).n)) / ((s).n-1) ))
|
69
|
+
begin
|
70
|
+
Math.sqrt( (@sumsq - ( @sum * @sum / @n)) / (@n-1) ).to_f
|
71
|
+
rescue Errno::EDOM
|
72
|
+
0.0
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
# Adds a time delta between now and the last time you called this. This
|
78
|
+
# will give you the average time between two activities.
|
79
|
+
#
|
80
|
+
# An example is:
|
81
|
+
#
|
82
|
+
# t = Stats.new("do_stuff")
|
83
|
+
# 10000.times { do_stuff(); t.tick }
|
84
|
+
# t.dump("time")
|
85
|
+
#
|
86
|
+
def tick
|
87
|
+
now = Time.now
|
88
|
+
sample(now - @last_time)
|
89
|
+
@last_time = now
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/tryouts.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
@spec = Gem::Specification.new do |s|
|
2
2
|
s.name = "tryouts"
|
3
3
|
s.rubyforge_project = "tryouts"
|
4
|
-
s.version = "0.7.
|
4
|
+
s.version = "0.7.1"
|
5
5
|
s.summary = "Tryouts are high-level tests for your Ruby code. May all your dreams come true!"
|
6
6
|
s.description = s.summary
|
7
7
|
s.author = "Delano Mandelbaum"
|
@@ -48,12 +48,20 @@
|
|
48
48
|
lib/tryouts/drill/context.rb
|
49
49
|
lib/tryouts/drill/response.rb
|
50
50
|
lib/tryouts/drill/sergeant/api.rb
|
51
|
+
lib/tryouts/drill/sergeant/benchmark.rb
|
51
52
|
lib/tryouts/drill/sergeant/cli.rb
|
53
|
+
lib/tryouts/drill/sergeant/rbenchmark.rb
|
52
54
|
lib/tryouts/mixins.rb
|
53
55
|
lib/tryouts/mixins/hash.rb
|
54
56
|
lib/tryouts/orderedhash.rb
|
57
|
+
lib/tryouts/stats.rb
|
55
58
|
lib/tryouts/tryout.rb
|
56
59
|
tryouts.gemspec
|
60
|
+
tryouts/01_mixins_tryouts.rb
|
61
|
+
tryouts/10_syntax_tryouts.rb
|
62
|
+
tryouts/20_cli_tryouts.rb
|
63
|
+
tryouts/50_class_context_tryouts.rb
|
64
|
+
tryouts/standalone_test.rb
|
57
65
|
)
|
58
66
|
|
59
67
|
s.has_rdoc = true
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
library :tryouts, File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
|
4
|
+
group "Mixins"
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
test_hash = {
|
9
|
+
:level1 => {
|
10
|
+
:level2 => {},
|
11
|
+
:apples => 1
|
12
|
+
},
|
13
|
+
:help => [1, :a, 900001, Object.new, Hash],
|
14
|
+
:oranges => 90
|
15
|
+
}
|
16
|
+
|
17
|
+
|
18
|
+
tryouts "Hash" do
|
19
|
+
setup do
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
drill "knows the deepest point", test_hash.deepest_point, 3
|
24
|
+
drill "has a last method", {}, :last, :respond_to?
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
|
2
|
+
tryout "DSL Syntax", :api do
|
3
|
+
|
4
|
+
dream 4770744
|
5
|
+
drill "can specify dream above the drill" do
|
6
|
+
4770744
|
7
|
+
end
|
8
|
+
|
9
|
+
dream Array, :class
|
10
|
+
drill "can pass based on output object class" do
|
11
|
+
[1,2,3]
|
12
|
+
end
|
13
|
+
|
14
|
+
dream NameError, :exception
|
15
|
+
drill "can pass based on exception class" do
|
16
|
+
bad_method_call
|
17
|
+
end
|
18
|
+
|
19
|
+
drill "dreamless drills that return true will pass" do
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
drill "inline true values will pass too", true
|
24
|
+
drill "can specify inline return values", :food, :food
|
25
|
+
drill "can specify match format", 'mahir', /..hi./i, :match
|
26
|
+
|
27
|
+
dream "big"
|
28
|
+
dream String, :class
|
29
|
+
dream /\Ab.g\z/, :match
|
30
|
+
drill "can handle multiple dreams" do
|
31
|
+
"big"
|
32
|
+
end
|
33
|
+
|
34
|
+
drill "can specify gt (>) format", 2, 1, :gt
|
35
|
+
drill "can specify gte (>=) format", 2, 2, :gte
|
36
|
+
drill "can specify lt (<) format", 1, 2, :lt
|
37
|
+
drill "can specify lte (<=) format", 2, 2, :lte
|
38
|
+
|
39
|
+
drill "can run arbitrary formats", [3,1,2], [1,2,3], :sort
|
40
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
TRYOUTS_HOME = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
3
|
+
MOCKOUT_PATH = File.join(TRYOUTS_HOME, "bin", "mockout")
|
4
|
+
|
5
|
+
##group "mockout cli"
|
6
|
+
##command :mockout, MOCKOUT_PATH
|
7
|
+
##dreams File.join(GYMNASIUM_HOME, 'mockoutcli_dreams.rb')
|
8
|
+
##
|
9
|
+
##tryout "Common Usage" do
|
10
|
+
## drill "No args", :info
|
11
|
+
## drill "YAML Output", :f, :yaml, :info
|
12
|
+
## drill "JSON Output", :f, :json, :info
|
13
|
+
##end
|
14
|
+
##
|
15
|
+
##tryout "inline dream that passes", :cli, :mockout do
|
16
|
+
## output = ["we expect mockout to", "echo these lines back"]
|
17
|
+
##
|
18
|
+
## # $ bin/mockout sergeant -e "we expect mockout to" "echo these lines back"
|
19
|
+
## drill "echo arguments", :info, :e, output[0], output[1]
|
20
|
+
## dream "echo arguments", output
|
21
|
+
##end
|
22
|
+
##
|
23
|
+
##tryout "inline dream that fails", :cli, :mockout do
|
24
|
+
## dream "echo arguments", "The dream does"
|
25
|
+
## drill "echo arguments", :info, :e, "not match reality"
|
26
|
+
##end
|
27
|
+
##
|
28
|
+
##
|
29
|
+
##dreams "Common Usage" do
|
30
|
+
## dream "No Comman" do
|
31
|
+
## output inline(%Q{
|
32
|
+
## Date: 2009-02-16
|
33
|
+
## Owners: greg, rupaul, telly, prince kinko
|
34
|
+
## Players: d-bam, alberta, birds, condor man
|
35
|
+
## })
|
36
|
+
## end
|
37
|
+
## dream "YAML Output" do
|
38
|
+
## format :to_yaml
|
39
|
+
## output ({
|
40
|
+
## "Date" => "2009-02-16",
|
41
|
+
## "Players" => ["d-bam", "alberta", "birds", "condor man"],
|
42
|
+
## "Owners" => ["greg", "rupaul", "telly", "prince kinko"]
|
43
|
+
## })
|
44
|
+
## end
|
45
|
+
##end
|
46
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
group "Class context tests"
|
3
|
+
|
4
|
+
tryout "Setting class variables", :api do
|
5
|
+
setup do
|
6
|
+
class ::Olivia; end
|
7
|
+
@@from_setup = Olivia.new # NOTE: module_eval seems to solve this problem
|
8
|
+
@from_setup = true
|
9
|
+
end
|
10
|
+
|
11
|
+
drill "can't access class var created in setup (1.9 only)", NameError, :exception do
|
12
|
+
@@from_setup
|
13
|
+
end
|
14
|
+
|
15
|
+
drill "can access class var created in setup (1.8 only)", 'Olivia' do
|
16
|
+
@@from_setup.class.to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
drill "create class var", 'Olivia' do
|
20
|
+
@@from_drill = Olivia.new
|
21
|
+
@@from_drill.class.to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
drill "can access class var created in drill", 'Olivia' do
|
25
|
+
@@from_drill.class.to_s
|
26
|
+
end
|
27
|
+
|
28
|
+
dream /\w\d\w \d\w\d/, :match
|
29
|
+
drill "Knows where Santa Claus lives", 'H0H 0H0'
|
30
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
## Tryouts - Standalone Test
|
2
|
+
#
|
3
|
+
# This tryout is intended to be run on its own,
|
4
|
+
# without the tryouts exectuable. That's why it's
|
5
|
+
# named _test.rb, so tryouts won't see it. It uses
|
6
|
+
# the same dreams as MockoutCLI.
|
7
|
+
#
|
8
|
+
# Usage: ruby tryouts/standalone_test.rb
|
9
|
+
#
|
10
|
+
|
11
|
+
TRYOUTS_HOME = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
12
|
+
TRYOUTS_LIB = File.join(TRYOUTS_HOME, 'lib')
|
13
|
+
MOCKOUT_PATH = File.join(TRYOUTS_HOME, 'bin', 'mockout')
|
14
|
+
$:.unshift TRYOUTS_LIB # Put our local lib in first place
|
15
|
+
|
16
|
+
require 'tryouts'
|
17
|
+
|
18
|
+
class StandaloneCLI < Tryouts
|
19
|
+
command :mockout, MOCKOUT_PATH
|
20
|
+
#dreams File.join(TRYOUTS_HOME, 'tryouts', 'mockoutcli_dreams.rb')
|
21
|
+
|
22
|
+
tryout "common usage" do
|
23
|
+
drill 'no command'
|
24
|
+
drill 'no args', :sergeant
|
25
|
+
drill 'yaml output', :f, 'yaml', :sergeant
|
26
|
+
drill 'json output', :f, 'json', :sergeant
|
27
|
+
end
|
28
|
+
|
29
|
+
tryout "inline dream will pass", :cli, :mockout do
|
30
|
+
output = ['we expect mockout to', 'echo these lines back']
|
31
|
+
dream output
|
32
|
+
# $ bin/mockout sergeant -e 'we expect mockout to' 'echo these lines back'
|
33
|
+
drill 'echo arguments', :sergeant, :e, *output
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
StandaloneCLI.run
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delano-tryouts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Delano Mandelbaum
|
@@ -65,12 +65,20 @@ files:
|
|
65
65
|
- lib/tryouts/drill/context.rb
|
66
66
|
- lib/tryouts/drill/response.rb
|
67
67
|
- lib/tryouts/drill/sergeant/api.rb
|
68
|
+
- lib/tryouts/drill/sergeant/benchmark.rb
|
68
69
|
- lib/tryouts/drill/sergeant/cli.rb
|
70
|
+
- lib/tryouts/drill/sergeant/rbenchmark.rb
|
69
71
|
- lib/tryouts/mixins.rb
|
70
72
|
- lib/tryouts/mixins/hash.rb
|
71
73
|
- lib/tryouts/orderedhash.rb
|
74
|
+
- lib/tryouts/stats.rb
|
72
75
|
- lib/tryouts/tryout.rb
|
73
76
|
- tryouts.gemspec
|
77
|
+
- tryouts/01_mixins_tryouts.rb
|
78
|
+
- tryouts/10_syntax_tryouts.rb
|
79
|
+
- tryouts/20_cli_tryouts.rb
|
80
|
+
- tryouts/50_class_context_tryouts.rb
|
81
|
+
- tryouts/standalone_test.rb
|
74
82
|
has_rdoc: true
|
75
83
|
homepage: http://github.com/delano/tryouts
|
76
84
|
post_install_message:
|