Bacon 0.9, a small RSpec clone


#1

Hello,

Today I’m proud to release Bacon 0.9.

= Bacon – a small RSpec clone.

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

Bacon is a small RSpec clone weighing less than 300 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/)

== 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 …]

== Object#should

You can use Object#should outside of contexts, where the result of
assertion will be returned as a boolean. This is nice for
demonstrations, quick checks and doctest tests.

>> require 'bacon'
>> (1 + 1).should.equal 2
=> true
>> (6*9).should.equal 42
=> false

== Where can I get it?

You can download Bacon 0.2 at

    http://chneukirchen.org/releases/bacon-0.9.0.tar.gz
            http://rubyforge.org/projects/testspec

Alternatively, you can checkout from the development repository with:

       darcs get http://chneukirchen.org/repos/bacon

(Patches using “darcs send” 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

== Contact

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

Darcs repository (“darcs send” is welcome for patches):
http://chneukirchen.org/repos/bacon

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

Hi Chris,

On Jan 8, 2008 1:20 AM, Christian N. removed_email_address@domain.invalid
wrote:

nevertheless providing all essential features.
it ‘should be empty’ do
lambda { @ary.fetch 0 }.

end
- should have super powers [FAILED]
$ bacon -q whirlwind.rb
$ bacon -p whirlwind.rb
1..6



=> false
       darcs get http://chneukirchen.org/repos/bacon

at my site:

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

Is it compatible with Test::Unit like Test/Spec ?


Let them talk of their oriental summer climes of everlasting
conservatories; give me the privilege of making my own summer with my
own coals.

http://gnufied.org


#3

On Jan 7, 2008 2:50 PM, Christian N. removed_email_address@domain.invalid
wrote:

nevertheless providing all essential features.
it ‘should be empty’ do
lambda { @ary.fetch 0 }.

end
- should have super powers [FAILED]
$ bacon -q whirlwind.rb
$ bacon -p whirlwind.rb
1..6



=> false
       darcs get http://chneukirchen.org/repos/bacon

at my site:

RSpec:: http://rspec.rubyforge.org/
test/spec:: http://test-spec.rubyforge.org/

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

Is this a replacement for test/spec, or is test/spec bacon’s big
brother?

  • rob

#4

On 2008-01-07, Rob S. removed_email_address@domain.invalid wrote:

Today I’m proud to release Bacon 0.9.

= Bacon – a small RSpec clone.

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

Is this a replacement for test/spec, or is test/spec bacon’s big brother?

It is not a replacement for test/spec, but a reimplementation of the
ideas behind it in a compact way.

It does not use Test::Unit.

It is not completely compatible to test/spec or RSpec, but suites are
reasonably easy to port.


#5

It’s unfortunate you didn’t name contexts strips and examples bits.
You really could’ve played up this bacon thing. :slight_smile:

I like the way this looks. It plays nice with some specs I was working
on.

–Jeremy

On Jan 7, 2008 3:50 PM, Christian N. removed_email_address@domain.invalid
wrote:

It is not a replacement for test/spec, but a reimplementation of the
ideas behind it in a compact way.

It does not use Test::Unit.

It is not completely compatible to test/spec or RSpec, but suites are
reasonably easy to port.

  • rob


http://www.jeremymcanally.com/

My books:
Ruby in Practice

My free Ruby e-book
http://www.humblelittlerubybook.com/

My blogs:
http://www.mrneighborly.com/
http://www.rubyinpractice.com/


#6

Christian N. wrote:

On 2008-01-07, Jeremy McAnally removed_email_address@domain.invalid wrote:

It’s unfortunate you didn’t name contexts strips and examples bits.
You really could’ve played up this bacon thing. :slight_smile:

:smiley:
Lovely idea.

mmmm, chunky!


#7

Thanks for finally gemming it up! I just started writing the specs for
Halcyon and was really distraught over using RSpec or Bacon. Very cool
and very good timing.

Also, again, I think this is a very cool name considering its
inspiration.

Cheers,
Matt


#8

On 2008-01-07, Jeremy McAnally removed_email_address@domain.invalid wrote:

It’s unfortunate you didn’t name contexts strips and examples bits.
You really could’ve played up this bacon thing. :slight_smile:

:smiley:
Lovely idea.

I like the way this looks. It plays nice with some specs I was working on.

Thank you.


#9

On Jan 7, 2008 3:50 PM, Christian N. removed_email_address@domain.invalid
wrote:

It is not a replacement for test/spec, but a reimplementation of the
ideas behind it in a compact way.

It does not use Test::Unit.

It is not completely compatible to test/spec or RSpec, but suites are
reasonably easy to port.

  • rob

Neat…I checked out the code and it looks very nice and slim.

My only concern is converting our many thousands of lines of specs
written in test/spec if bacon is where all the goodness is going to be
happening =).

  • Rob

http://robsanheim.com
http://thinkrelevance.com


#10

Okay, time to admit that quote was not really the inspiration… :slight_smile:

Bacon in German is Speck, which is written and sounds like spec.

That makes it even better! :smiley:


#11

On 2008-01-07, Rob S. removed_email_address@domain.invalid wrote:

Neat…I checked out the code and it looks very nice and slim.

My only concern is converting our many thousands of lines of specs
written in test/spec if bacon is where all the goodness is going to be
happening =).

test/spec has a bigger userbase already, and I try to keep bacon
rather small. (Still, it has everything you need, really.)

IMO, a stable spec API is more useful than a featureful, but always
moving one.

I’ll make test/spec bacon compatible in the long term, not the other
way round. (That is, bacon-the-API will be really stable, so you can
run your specs with test/spec, bacon or taptap (to be released).)


#12

On 2008-01-07, Matt T. removed_email_address@domain.invalid wrote:

Thanks for finally gemming it up! I just started writing the specs for
Halcyon and was really distraught over using RSpec or Bacon. Very cool
and very good timing.

Also, again, I think this is a very cool name considering its inspiration.

Okay, time to admit that quote was not really the inspiration… :slight_smile:

Bacon in German is Speck, which is written and sounds like spec.


#13

On Jan 8, 2008 4:50 AM, Christian N. removed_email_address@domain.invalid
wrote:
[snip]

Happy hacking and have a nice day,

Thanks a lot, bacon rocks!

^ manveru