Bacon 1.2, a small RSpec clone

Hello,

Today, after over 4 years, I’m proud to release Bacon 1.2.

  • December 21th, 2012: Fourth public release 1.2.0.
    • #satisfy will not pass arguments anymore to the block, use lexical
      scope.
    • Fixed Context#change?.
    • Add support for finding specs named like spec/**/*_spec.rb.
    • Contexts nest properly.
    • Timer in TestUnitOutput.
    • Nested output for SpecDoxOutput.
    • Small cleanups and more tests.

= Bacon – small RSpec clone.

“Truth will sooner come out from error than from confusion.”
—Francis Bacon

Bacon is a small RSpec clone weighing less than 350 LoC but
nevertheless providing all essential features.

== Whirl-wind tour

require 'bacon'

describe 'A new array' do
  before do
    @ary = Array.new
  end

  it 'should be empty' do
    @ary.should.be.empty
    @ary.should.not.include 1
  end

  it 'should have zero size' do
    @ary.size.should.equal 0
    @ary.size.should.be.close 0.1, 0.5
  end

  it 'should raise on trying fetch any index' do
    lambda { @ary.fetch 0 }.
      should.raise(IndexError).
      message.should.match(/out of array/)

    # Alternatively:
    should.raise(IndexError) { @ary.fetch 0 }
  end

  it 'should have an object identity' do
    @ary.should.not.be.same_as Array.new
  end

  # Custom assertions are trivial to do, they are lambdas returning 

a
# boolean vale:
palindrome = lambda { |obj| obj == obj.reverse }
it ‘should be a palindrome’ do
@ary.should.be.a palindrome
end

  it 'should have super powers' do
    should.flunk "no super powers found"
  end
end

Now run it:

$ bacon whirlwind.rb
A new array
- should be empty
- should have zero size
- should raise on trying fetch any index
- should have an object identity
- should be a palindrome
- should have super powers [FAILED]

Bacon::Error: no super powers found
  ./whirlwind.rb:39: A new array - should have super powers
  ./whirlwind.rb:38
  ./whirlwind.rb:3

6 specifications (9 requirements), 1 failures, 0 errors

If you want shorter output, use the Test::Unit format:

$ bacon -q whirlwind.rb
.....F
Bacon::Error: no super powers found
  ./whirlwind.rb:39: A new array - should have super powers
  ./whirlwind.rb:38
  ./whirlwind.rb:3

6 tests, 9 assertions, 1 failures, 0 errors

It also supports TAP:

$ bacon -p whirlwind.rb
ok 1        - should be empty
ok 2        - should have zero size
ok 3        - should raise on trying fetch any index
ok 4        - should have an object identity
ok 5        - should be a palindrome
not ok 6    - should have super powers: FAILED
# Bacon::Error: no super powers found
#   ./whirlwind.rb:39: A new array - should have super powers
#   ./whirlwind.rb:38
#   ./whirlwind.rb:3
1..6
# 6 tests, 9 assertions, 1 failures, 0 errors

$ bacon -p whirlwind.rb | taptap -q
Tests took 0.00 seconds.
FAILED tests 6
   6) should have super powers: FAILED

Failed 1/6 tests, 83.33% okay.

(taptap is available from Index of /repos/taptap/)

As of Bacon 1.1, it also supports Knock:

$ bacon -k whirlwind.rb
ok - should be empty
ok - should have zero size
ok - should raise on trying fetch any index
ok - should have an object identity
ok - should be a palindrome
not ok - should have super powers: FAILED
# Bacon::Error: no super powers found
#   ./whirlwind.rb:39: A new array - should have super powers
#   ./whirlwind.rb:38
#   ./whirlwind.rb:3

$ bacon -k whirlwind.rb | kn-sum
6 tests, 1 failed (83.3333% succeeded)

(knock is available from GitHub - leahneukirchen/knock: Knock is a simplification of the Test Anything Protocol used by Perl and others.)

== Implemented assertions

  • should. and should.be.
  • should.equal
  • should.match
  • should.be.identical_to / should.be.same_as
  • should.raise(*exceptions) { }
  • should.change { }
  • should.throw(symbol) { }
  • should.satisfy { |object| }

== Added core predicates

  • Object#true?
  • Object#false?
  • Proc#change?
  • Proc#raise?
  • Proc#throw?
  • Numeric#close?

[… for more documentation see README …]

== Where can I get it?

You can download Bacon 1.2 at

    http://chneukirchen.org/releases/bacon-1.2.0.tar.gz
            http://rubyforge.org/projects/test-spec

Alternatively, you can checkout from the development repository at:

             http://github.com/chneukirchen/bacon

(Patches rebased on HEAD are most welcome.)

== Installing with RubyGems

A Gem of Bacon is available. You can install it with:

gem install bacon

I also provide a local mirror of the gems (and development snapshots)
at my site:

gem install bacon --source http://chneukirchen.org/releases/gems

== Thanks to

  • Michael F., for fixing Bacon for 1.9 and various improvements.
  • Gabriele Renzi, for implementing Context#should.
  • James T., for the autotest support.
  • Yossef M., for nested contexts.
  • Gabriel H., for many patches.
  • everyone contributing bug fixes.

== History

  • January 7, 2008: First public release 0.9.

  • July 6th, 2008: Second public release 1.0.

    • Add Context#should as a shortcut for Context#it('should ’ + _).
    • describe now supports multiple arguments for better organization.
    • Empty specifications are now erroneous.
    • after-blocks run in the case of exceptions too.
    • Autotest support.
    • Bug fixes.
  • November 30th, 2008: Third public release 1.1.

    • Nested before/after.
    • Add -Q/–no-backtraces to not show details about failed
      specifications.
    • Add Knock output.
    • Bug fixes.
  • December 21th, 2012: Fourth public release 1.2.0.

    • #satisfy will not pass arguments anymore to the block, use lexical
      scope.
    • Fixed Context#change?.
    • Add support for finding specs named like spec/**/*_spec.rb.
    • Contexts nest properly.
    • Timer in TestUnitOutput.
    • Nested output for SpecDoxOutput.
    • Small cleanups and more tests.

== Contact

Please mail bugs, suggestions and patches to
mailto:[email protected].

Git repository (patches rebased on HEAD are most welcome):

git://github.com/chneukirchen/bacon.git

== Copying

Copyright (C) 2007, 2008, 2012 Christian N.
<purl.org/net/chneukirchen>

Bacon is freely distributable under the terms of an MIT-style license.
See COPYING or The MIT License – Open Source Initiative.

== Links

Behavior-Driven Development:: http://behaviour-driven.org/
RSpec:: http://rspec.rubyforge.org/
test/spec:: http://test-spec.rubyforge.org/

Christian N.:: http://chneukirchen.org/

Happy hacking and have a nice day,
Christian N.

On Dec 21, 2012, at 03:24 , Christian N.
[email protected] wrote:

Hello,

Today, after over 4 years, I’m proud to release Bacon 1.2.

Congratulations!

  • December 21th, 2012: Fourth public release 1.2.0.
  • #satisfy will not pass arguments anymore to the block, use lexical scope.
  • Fixed Context#change?.
  • Add support for finding specs named like spec/**/*_spec.rb.
  • Contexts nest properly.
  • Timer in TestUnitOutput.
  • Nested output for SpecDoxOutput.
  • Small cleanups and more tests.

This looks fantastic.

Damnit… and I was just about to announce minitest/bacon… I’ve almost
passed all your tests. :stuck_out_tongue: