# Bacon 1.1, a small RSpec clone

**URL:** <https://www.ruby-forum.com/t/bacon-1-1-a-small-rspec-clone/154477>\
**Category:** Ruby\
**Created:** [November 30, 2008, 11:35am UTC](https://www.ruby-forum.com/t/bacon-1-1-a-small-rspec-clone/154477 "2008-11-30T11:35:37Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![cneuhaus](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/34f0e0/32.png) [@cneuhaus](https://www.ruby-forum.com/u/cneuhaus)\
**Post date:** [November 30, 2008, 11:35am UTC](https://www.ruby-forum.com/t/bacon-1-1-a-small-rspec-clone/154477/1 "2008-11-30T11:35:37Z")

</div>

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 [Index of /repos/taptap/](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 [GitHub - leahneukirchen/knock: Knock is a simplification of the Test Anything Protocol used by Perl and others.](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.

- November 30th, 2008: Third public release 1.1.

== Contact

Please mail bugs, suggestions and patches to  
[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid).

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

> **[GitHub - leahneukirchen/bacon: a small RSpec clone](https://github.com/leahneukirchen/bacon)**
>
> a small RSpec clone. Contribute to leahneukirchen/bacon development by creating an account on GitHub.

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

== Copying

Copyright (C) 2007, 2008 Christian N.  
\<[InfoPage of Leah Neukirchen -- leah2](http://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](http://www.opensource.org/licenses/mit-license.php).

== Links

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

Christian N.:: [http://chneukirchen.org/](http://chneukirchen.org/)

Happy hacking and have a nice day,  
Christian N.

---

<div class="post-metadata">

**Author:** ![cneuhaus](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/34f0e0/32.png) [@cneuhaus](https://www.ruby-forum.com/u/cneuhaus)\
**Post date:** [November 30, 2008, 11:59am UTC](https://www.ruby-forum.com/t/bacon-1-1-a-small-rspec-clone/154477/2 "2008-11-30T11:59:05Z")

</div>

On Sun, Nov 30, 2008 at 11:29 AM, Christian N.  
[removed\_email\_address@domain.invalid](mailto: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

---

<div class="post-metadata">

**Author:** ![cneuhaus](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/34f0e0/32.png) [@cneuhaus](https://www.ruby-forum.com/u/cneuhaus)\
**Post date:** [November 30, 2008, 2:45pm UTC](https://www.ruby-forum.com/t/bacon-1-1-a-small-rspec-clone/154477/3 "2008-11-30T14:45:32Z")

</div>

On 2008-11-30, Robert D. [removed\_email\_address@domain.invalid](mailto: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.

---

<div class="post-metadata">

**Author:** ![cneuhaus](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/34f0e0/32.png) [@cneuhaus](https://www.ruby-forum.com/u/cneuhaus)\
**Post date:** [November 30, 2008, 5:54pm UTC](https://www.ruby-forum.com/t/bacon-1-1-a-small-rspec-clone/154477/4 "2008-11-30T17:54:17Z")

</div>

On Nov 30, 4:29 am, Christian N. [removed\_email\_address@domain.invalid](mailto: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.

---

<div class="post-metadata">

**Author:** ![cneuhaus](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/34f0e0/32.png) [@cneuhaus](https://www.ruby-forum.com/u/cneuhaus)\
**Post date:** [December 1, 2008, 12:58pm UTC](https://www.ruby-forum.com/t/bacon-1-1-a-small-rspec-clone/154477/5 "2008-12-01T12:58:27Z")

</div>

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

Regards,  
Pit
