Bacon 1.1, a small RSpec clone


#1

Hello,

Today I’m proud to release Bacon 1.1.

  • 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.

= 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 http://chneukirchen.org/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 http://github.com/chneukirchen/knock/)

== 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.0 at

    http://chneukirchen.org/releases/bacon-1.1.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.
  • 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.

== Contact

Please mail bugs, suggestions and patches to
mailto:removed_email_address@domain.invalid.

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


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

== Copying

Copyright © 2007, 2008 Christian N.
<purl.org/net/chneukirchen>

Bacon is freely distributable under the terms of an MIT-style license.
See COPYING or http://www.opensource.org/licenses/mit-license.php.

== 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.


#2

On Sun, Nov 30, 2008 at 11:29 AM, Christian N.
removed_email_address@domain.invalid wrote:
.org/releases/gems

== Thanks to

  • Michael F., for fixing Bacon for 1.9 and various improvements.
    Well after all time is relative, right?

Jokes apart this looks really interesting, especially as one could
potentially release bacon with the own code
due to it’s small size.

One question, is Speck Ruby 1.8[.succ] agnostic?

Cheers
Robert


#3

On 2008-11-30, Robert D. removed_email_address@domain.invalid wrote:

On Sun, Nov 30, 2008 at 11:29 AM, Christian N.

== Thanks to

  • Michael F., for fixing Bacon for 1.9 and various improvements.
    Well after all time is relative, right?

Jokes apart this looks really interesting, especially as one could
potentially release bacon with the own code
due to it’s small size.

Indeed, it’s just one file.

One question, is Speck Ruby 1.8[.succ] agnostic?

AFAICT it works on 1.8 and 1.9. The code is pretty simple, it will
likely work in other Ruby implementations as well.


#4

On Nov 30, 4:29 am, Christian N. removed_email_address@domain.invalid
wrote:

Hello,

Today I’m proud to release Bacon 1.1.

  • November 30th, 2008: Third public release 1.1.
    • Nested before/after.

YAY!!!

Looking forward to continuing the process of attempting to switch a
project to bacon.


#5

Christian, could you talk a little bit about the relation between
Bacon and test/spec and the future of test/spec?

Regards,
Pit