riot 0.10.2 → 0.10.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -17,6 +17,7 @@ An extremely fast, expressive, and context-driven unit-testing framework. Protes
17
17
  - [Respond To](#examples-respond-to)
18
18
  - [Assigns](#examples-assigns)
19
19
  - [Nested contexts](#examples-nested)
20
+ - [Block expectations](#examples-block)
20
21
  - [OMG! Why did you write this](#omg)
21
22
  - [Running tests](#running)
22
23
  - [With Sinatra](#sinatra)
@@ -297,6 +298,18 @@ Oh yeah, Riot does those, too. The `setup` from each parent is "loaded" into the
297
298
  end
298
299
  end
299
300
 
301
+ <a name="examples-block"></a>
302
+ #### Example: Block expectations
303
+
304
+ You can use a block to create the expected value for your assertion,
305
+ which might come in useful if it takes a bit of work to generate your
306
+ expected value. My apologies for the incredibly contrived example as so:
307
+
308
+ context "block expectations" do
309
+ setup { 2 }
310
+ asserts_topic.equals { 1 + 1 }
311
+ end
312
+
300
313
  #### More examples/documentation
301
314
 
302
315
  There are many more basic assertion modifiers to come. See below for writing Riot extensions if you want to help out.
data/Rakefile CHANGED
@@ -5,9 +5,10 @@ task :default => [:test]
5
5
 
6
6
  require 'rake/testtask'
7
7
  Rake::TestTask.new(:test) do |test|
8
- test.libs << 'lib' << 'test'
9
- test.pattern = 'test/**/*_test.rb'
10
- test.verbose = false
8
+ test.libs << 'test'
9
+ test.pattern = 'test/**/*_test.rb'
10
+ test.warning = true
11
+ test.verbose = false
11
12
  end
12
13
 
13
14
  desc "Run Flog against library (except tests)"
@@ -47,7 +48,7 @@ begin
47
48
  gem.email = "gus@gusg.us"
48
49
  gem.homepage = "http://github.com/thumblemonks/riot"
49
50
  gem.authors = ["Justin 'Gus' Knowlden"]
50
- gem.add_dependency 'colorize'
51
+ gem.add_dependency 'term-ansicolor'
51
52
  end
52
53
  Jeweler::GemcutterTasks.new
53
54
  rescue LoadError
@@ -4,6 +4,9 @@
4
4
  - Assertion
5
5
  - scope
6
6
  - extensions (e.g. rack/test)
7
+ - Yard
8
+ - use yard to document the #assertion method used to define new assertions so the defined assertions will show up in the docs ( http://gnuu.org/2009/11/18/customizing-yard-templates/ )
9
+
7
10
  - Assertion Macros
8
11
  - include/any/contains (array,hash, maybe string?)
9
12
  - perhaps able to take an enumerable and compare...
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.10.2
1
+ 0.10.3
@@ -2,6 +2,7 @@ require 'riot/reporter'
2
2
  require 'riot/context'
3
3
  require 'riot/situation'
4
4
  require 'riot/runnable'
5
+ require 'riot/assertion'
5
6
  require 'riot/assertion_macros'
6
7
 
7
8
  module Riot
@@ -19,14 +20,20 @@ module Riot
19
20
  end
20
21
 
21
22
  def self.silently!; @silent = true; end
22
- def self.silently?; @silent == true; end
23
+ def self.silently?; defined?(@silent) && @silent == true end
24
+
25
+ def self.reporter=(reporter_class) @reporter_class = reporter_class; end
23
26
 
24
27
  def self.reporter
25
- Riot.silently? ? Riot::SilentReporter : (@reporter_class || Riot::StoryReporter)
28
+ if Riot.silently?
29
+ Riot::SilentReporter
30
+ else
31
+ (defined?(@reporter_class) && @reporter_class) || Riot::StoryReporter
32
+ end
26
33
  end
27
- def self.reporter=(reporter_class) @reporter_class = reporter_class; end
34
+
28
35
  # TODO: make this a flag that DotMatrix and Story respect and cause them to print errors/failures
29
- def self.verbose; Riot.reporter = Riot::VerboseReporter; end
36
+ def self.verbose; Riot.reporter = Riot::VerboseStoryReporter; end
30
37
  def self.dots; Riot.reporter = Riot::DotMatrixReporter; end
31
38
 
32
39
  at_exit { run unless Riot.silently? }
@@ -0,0 +1,45 @@
1
+ module Riot
2
+ class Assertion < RunnableBlock
3
+
4
+ def initialize(description, &definition)
5
+ super
6
+ @expectings, @expect_exception, @expectation_block = [], false, nil
7
+ @assertion_block = lambda do |actual|
8
+ actual ? Assertion.pass : Assertion.fail("Expected non-false but got #{actual.inspect} instead")
9
+ end
10
+ end
11
+
12
+ class << self
13
+ def pass() [:pass]; end
14
+ def fail(message) [:fail, message]; end
15
+ def error(e) [:error, e]; end
16
+ def assertions; @assertions ||= {}; end
17
+
18
+ # TODO: Make everyone switch to 1.8.7 or above so we can go mostly stateless again.
19
+ # Had to do this for 1.8.6 compatibility {:() I'm a sad sock monkey
20
+ def assertion(name, expect_exception=false, &assertion_block)
21
+ assertions[name] = [expect_exception, assertion_block]
22
+ class_eval <<-EOC
23
+ def #{name}(*expectings, &expectation_block)
24
+ @expectings, @expectation_block = expectings, expectation_block
25
+ @expect_exception, @assertion_block = Assertion.assertions[#{name.inspect}]
26
+ self
27
+ end
28
+ EOC
29
+ end
30
+ end
31
+
32
+ def run(situation)
33
+ @expectings << situation.evaluate(&@expectation_block) if @expectation_block
34
+ process_macro(situation, @expect_exception) { |actual| @assertion_block.call(actual, *@expectings) }
35
+ end
36
+
37
+ private
38
+ def process_macro(situation, expect_exception)
39
+ actual = situation.evaluate(&definition)
40
+ yield(expect_exception ? nil : actual)
41
+ rescue Exception => e
42
+ expect_exception ? yield(e) : Assertion.error(e)
43
+ end
44
+ end # Assertion
45
+ end # Riot
@@ -44,7 +44,8 @@ module Riot
44
44
  # topic.assigns(:email, "foo@bar.baz")
45
45
  assertion(:assigns) do |actual, *expectings|
46
46
  variable, expected_value = expectings
47
- actual_value = actual.instance_variable_get("@#{variable}")
47
+ variable_name = "@#{variable}"
48
+ actual_value = actual.instance_variable_defined?(variable_name) ? actual.instance_variable_get(variable_name) : nil
48
49
  if actual_value.nil?
49
50
  fail("expected @#{variable} to be assigned a value")
50
51
  elsif !expected_value.nil? && expected_value != actual_value
@@ -28,17 +28,22 @@ module Riot
28
28
  error(description, result)
29
29
  end
30
30
  end
31
+
32
+ def new(*args, &block)
33
+ self
34
+ end
31
35
  end # Reporter
32
36
 
33
37
  class IOReporter < Reporter
38
+ attr_reader :writer
34
39
  def initialize(writer=nil)
35
40
  super()
36
41
  @writer = writer || STDOUT
37
42
  end
38
- def say(message) @writer.puts(message); end
43
+ def say(message) writer.puts(message); end
39
44
 
40
45
  def results(time_taken)
41
- values = [@passes, @failures, @errors, ("%0.6f" % time_taken)]
46
+ values = [passes, failures, errors, ("%0.6f" % time_taken)]
42
47
  say "\n%d passes, %d failures, %d errors in %s seconds" % values
43
48
  end
44
49
  end
@@ -50,7 +55,7 @@ module Riot
50
55
  def error(description, e) say " ! " + "#{description}: #{e.message}".red; end
51
56
  end
52
57
 
53
- class VerboseReporter < StoryReporter
58
+ class VerboseStoryReporter < StoryReporter
54
59
  def error(description, e)
55
60
  super(description, e)
56
61
  say " #{e.class.name} occured".red
@@ -59,9 +64,9 @@ module Riot
59
64
  end
60
65
 
61
66
  class DotMatrixReporter < IOReporter
62
- def pass(description); @writer.write ".".green; end
63
- def fail(description, message); @writer.write "F".yellow; end
64
- def error(description, e); @writer.write "E".red; end
67
+ def pass(description); writer.write ".".green; end
68
+ def fail(description, message); writer.write "F".yellow; end
69
+ def error(description, e); writer.write "E".red; end
65
70
  # TODO: Print the failures and errors at the end. Sorry :|
66
71
  end
67
72
 
@@ -73,12 +78,14 @@ module Riot
73
78
  end
74
79
  end # Riot
75
80
 
76
- begin
77
- raise LoadError if ENV["TM_MODE"]
78
- require 'rubygems'
79
- require 'colorize'
80
- rescue LoadError
81
- class ::String
81
+ # Colorize strings
82
+ class ::String
83
+ begin
84
+ raise LoadError if ENV["TM_MODE"]
85
+ require 'rubygems'
86
+ require 'term/ansicolor'
87
+ include Term::ANSIColor
88
+ rescue LoadError
82
89
  def green; self; end
83
90
  alias :red :green
84
91
  alias :yellow :green
@@ -1,12 +1,11 @@
1
1
  module Riot
2
2
  class RunnableBlock
3
+ attr_reader :definition
3
4
  def initialize(description, &definition)
4
- @description, @definition = description, definition || Proc.new { topic }
5
+ @description, @definition = description, definition || lambda { topic }
5
6
  end
6
7
 
7
- def to_s
8
- @description
9
- end
8
+ def to_s; @description; end
10
9
  end # RunnableBlock
11
10
 
12
11
  class Setup < RunnableBlock
@@ -15,37 +14,8 @@ module Riot
15
14
  end
16
15
 
17
16
  def run(situation)
18
- situation.setup(&@definition)
17
+ situation.setup(&definition)
19
18
  [:setup]
20
19
  end
21
20
  end # Setup
22
-
23
- class Assertion < RunnableBlock
24
- def self.pass() [:pass]; end
25
- def self.fail(message) [:fail, message]; end
26
- def self.error(e) [:error, e]; end
27
-
28
- def run(situation)
29
- process_macro(situation, false) do |actual|
30
- actual ? Assertion.pass : Assertion.fail("Expected non-false but got #{actual.inspect} instead")
31
- end
32
- end
33
-
34
- def self.assertion(name, expect_exception=false, &assertion_block)
35
- define_method(name) do |*expectings, &expectation_block|
36
- (class << self; self; end).send(:define_method, :run) do |situation|
37
- expectings << situation.evaluate(&expectation_block) if expectation_block
38
- process_macro(situation, expect_exception) { |actual| assertion_block.call(actual, *expectings) }
39
- end # redefine run method when the assertion is called
40
- self
41
- end # define_method for assertion
42
- end
43
- private
44
- def process_macro(situation, expect_exception)
45
- actual = situation.evaluate(&@definition)
46
- yield(expect_exception ? nil : actual)
47
- rescue Exception => e
48
- expect_exception ? yield(e) : Assertion.error(e)
49
- end
50
- end # Assertion
51
21
  end # Riot
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{riot}
8
- s.version = "0.10.2"
8
+ s.version = "0.10.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Justin 'Gus' Knowlden"]
12
- s.date = %q{2009-11-27}
12
+ s.date = %q{2009-12-02}
13
13
  s.description = %q{An extremely fast, expressive, and context-driven unit-testing framework. A replacement for all other testing frameworks. Protest the slow test.}
14
14
  s.email = %q{gus@gusg.us}
15
15
  s.extra_rdoc_files = [
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
23
23
  "TODO.markdown",
24
24
  "VERSION",
25
25
  "lib/riot.rb",
26
+ "lib/riot/assertion.rb",
26
27
  "lib/riot/assertion_macros.rb",
27
28
  "lib/riot/context.rb",
28
29
  "lib/riot/reporter.rb",
@@ -41,6 +42,7 @@ Gem::Specification.new do |s|
41
42
  "test/assertion_macros/respond_to_test.rb",
42
43
  "test/assertion_macros/same_elements_test.rb",
43
44
  "test/assertion_test.rb",
45
+ "test/benchmark/colorize.rb",
44
46
  "test/benchmark/riot_vs_minitest.rb",
45
47
  "test/benchmark/same_elements_vs_set.rb",
46
48
  "test/benchmark/simple_context_and_assertions.rb",
@@ -68,6 +70,7 @@ Gem::Specification.new do |s|
68
70
  "test/assertion_macros/respond_to_test.rb",
69
71
  "test/assertion_macros/same_elements_test.rb",
70
72
  "test/assertion_test.rb",
73
+ "test/benchmark/colorize.rb",
71
74
  "test/benchmark/riot_vs_minitest.rb",
72
75
  "test/benchmark/same_elements_vs_set.rb",
73
76
  "test/benchmark/simple_context_and_assertions.rb",
@@ -83,12 +86,12 @@ Gem::Specification.new do |s|
83
86
  s.specification_version = 3
84
87
 
85
88
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
86
- s.add_runtime_dependency(%q<colorize>, [">= 0"])
89
+ s.add_runtime_dependency(%q<term-ansicolor>, [">= 0"])
87
90
  else
88
- s.add_dependency(%q<colorize>, [">= 0"])
91
+ s.add_dependency(%q<term-ansicolor>, [">= 0"])
89
92
  end
90
93
  else
91
- s.add_dependency(%q<colorize>, [">= 0"])
94
+ s.add_dependency(%q<term-ansicolor>, [">= 0"])
92
95
  end
93
96
  end
94
97
 
@@ -3,7 +3,7 @@ require 'teststrap'
3
3
  context "An assigns assertion macro" do
4
4
  setup do
5
5
  item = Object.new
6
- item.instance_eval { @foo = 1; @bar; @nil_val = nil }
6
+ item.instance_eval { @foo = 1; @nil_val = nil }
7
7
  Riot::Assertion.new("test") { item }
8
8
  end
9
9
 
@@ -32,27 +32,33 @@ context "An assertion" do
32
32
  end
33
33
  end # that is erroring
34
34
 
35
- context "with no block" do
35
+ context "with no block to provide the actual" do
36
36
  setup do
37
37
  @situation = Riot::Situation.new
38
38
  @situation.topic = "hello"
39
39
  Riot::Assertion.new("test")
40
40
  end
41
- should("use block returning topic as default") do
41
+ should("uses block returning topic as default") do
42
42
  topic.equals("hello")
43
43
  result = topic.run(@situation)
44
44
  end.equals([:pass])
45
45
  end
46
-
46
+
47
47
  context "with block expectation" do
48
48
  setup do
49
49
  @situation = Riot::Situation.new
50
50
  @situation.topic = "hello"
51
51
  Riot::Assertion.new("test")
52
52
  end
53
+
53
54
  should("use block returning topic as default") do
54
55
  topic.equals { "hello" }
55
56
  result = topic.run(@situation)
56
57
  end.equals([:pass])
58
+
59
+ asserts("block expectation has access to the situation items") do
60
+ topic.equals { @topic }
61
+ topic.run(@situation)
62
+ end.equals([:pass])
57
63
  end
58
64
  end # An assertion block
@@ -0,0 +1,39 @@
1
+ require 'rubygems'
2
+ require 'benchmark'
3
+ require 'colorize'
4
+ require 'term/ansicolor'
5
+
6
+ class MyString < String
7
+ include ::Term::ANSIColor
8
+ end
9
+
10
+ colorize = String.new
11
+ term_ansicolor = MyString.new
12
+
13
+ n = 50_000
14
+
15
+ Benchmark.bmbm do |x|
16
+ x.report("colorize") do
17
+ n.times do
18
+ colorize.green
19
+ colorize.yellow
20
+ colorize.red
21
+ end
22
+ end
23
+ x.report("term-ansicolor") do
24
+ n.times do
25
+ term_ansicolor.green
26
+ term_ansicolor.yellow
27
+ term_ansicolor.red
28
+ end
29
+ end
30
+ end
31
+
32
+ # Rehearsal --------------------------------------------------
33
+ # colorize 4.140000 0.160000 4.300000 ( 4.375765)
34
+ # term-ansicolor 0.720000 0.000000 0.720000 ( 0.730665)
35
+ # ----------------------------------------- total: 5.020000sec
36
+ #
37
+ # user system total real
38
+ # colorize 4.070000 0.170000 4.240000 ( 4.459804)
39
+ # term-ansicolor 0.700000 0.000000 0.700000 ( 0.728494)
@@ -1,4 +1,4 @@
1
- $:.concat ['./lib']
1
+ $:.unshift(File.dirname(__FILE__)+"/../../lib")
2
2
  require 'benchmark'
3
3
 
4
4
  #
@@ -41,6 +41,12 @@ context "A reporter" do
41
41
  asserts("description sent to #error") do
42
42
  topic.report("break it down", [:error, "error time"])
43
43
  end.equals("errored(break it down, error time)")
44
+
45
+ context "instance" do
46
+ setup { Riot::Reporter.new }
47
+
48
+ should("return self invoking new") { topic.new }.equals { topic }
49
+ end
44
50
  end # A reporter
45
51
 
46
52
  require 'stringio'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.2
4
+ version: 0.10.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin 'Gus' Knowlden
@@ -9,11 +9,11 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-27 00:00:00 -06:00
12
+ date: 2009-12-02 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: colorize
16
+ name: term-ansicolor
17
17
  type: :runtime
18
18
  version_requirement:
19
19
  version_requirements: !ruby/object:Gem::Requirement
@@ -38,6 +38,7 @@ files:
38
38
  - TODO.markdown
39
39
  - VERSION
40
40
  - lib/riot.rb
41
+ - lib/riot/assertion.rb
41
42
  - lib/riot/assertion_macros.rb
42
43
  - lib/riot/context.rb
43
44
  - lib/riot/reporter.rb
@@ -56,6 +57,7 @@ files:
56
57
  - test/assertion_macros/respond_to_test.rb
57
58
  - test/assertion_macros/same_elements_test.rb
58
59
  - test/assertion_test.rb
60
+ - test/benchmark/colorize.rb
59
61
  - test/benchmark/riot_vs_minitest.rb
60
62
  - test/benchmark/same_elements_vs_set.rb
61
63
  - test/benchmark/simple_context_and_assertions.rb
@@ -105,6 +107,7 @@ test_files:
105
107
  - test/assertion_macros/respond_to_test.rb
106
108
  - test/assertion_macros/same_elements_test.rb
107
109
  - test/assertion_test.rb
110
+ - test/benchmark/colorize.rb
108
111
  - test/benchmark/riot_vs_minitest.rb
109
112
  - test/benchmark/same_elements_vs_set.rb
110
113
  - test/benchmark/simple_context_and_assertions.rb