Unit Testing C and C++ ... with Ruby and RSpec! 110
If you’re writing C/C++ code, it’s natural to write your unit tests in the same language (or use C++ for your C test code). All the well-known unit testing tools take this approach.
I think we can agree that neither language offers the best developer productivity among all the language choices out there. Most of us use either language because of perceived performance requirements, institutional and industry tradition, etc.
There’s growing interest, however, in mixing languages, tools, and paradigms to get the best tool for a particular job. <shameless-plug>I’m giving a talk March 7th at SD West on this very topic, called Polyglot and Poly-Paradigm Programming </shameless-plug>.
So, why not use a more productive language for your C or C++ unit tests? You have more freedom in your development chores than what’s required for production. Why not use Ruby’s RSpec, a Behavior-Driven Development tool for acceptance and unit testing? Or, you could use Ruby’s version of JUnit, called Test::Unit. The hard part is integrating Ruby and C/C++. If you’ve been looking for an excuse to bring Ruby (or Tcl or Python or Java or…) into your C/C++ environment, starting with development tasks is usually the path of least resistance.
I did some experimenting over the last few days to integrate RSpec using SWIG (Simplified Wrapper and Interface Generator), a tool for bridging libraries written in C and C++ to other languages, like Ruby. The Ruby section of the SWIG manual was very helpful.
My Proof-of-Concept Code
Here is a zip file of my experiment: rspec_for_cpp.zip
This is far from a complete and working solution, but I think it shows promise. See the Current Limitations section below for details.
Unzip the file into a directory. I’ll assume you named it rspec_for_cpp
. You need to have gmake
, gcc
, SWIG and Ruby installed, along with the RSpec “gem”. Right now, it only builds on OS X and Linux (at least the configurations on my machines running those OS’s – see the discussion below). To run the build, use the following commands:
$ cd rspec_for_cpp/cpp
$ make
You should see it finish with the lines
( cd ../spec; spec *_spec.rb )
.........
Finished in 0.0***** seconds
9 examples, 0 failures
Congratulations, you’ve just tested some C and C++ code with RSpec! (Or, if you didn’t succeed, see the notes in the Makefile
and the discussion below.)
The Details
I’ll briefly walk you through the files in the zip and the key steps required to make it all work.
cexample.h
Here is a simple C header file.
/* cexample.h */
#ifndef CEXAMPLE_H
#define CEXAMPLE_H
#ifdef __cplusplus
extern "C" {
#endif
char* returnString(char* input);
double returnDouble(int input);
void doNothing();
#ifdef __cplusplus
}
#endif
#endif
Of course, in a pure C shop, you won’t need the #ifdef __cplusplus
stuff. I found this was essential in my experiment when I mixed C and C++, as you might expect.
cpp/cexample.c
Here is the corresponding C source file.
/* cexample.h */
char* returnString(char* input) {
return input;
}
double returnDouble(int input) {
return (double) input;
}
void doNothing() {}
cpp/CppExample.h
Here is a C++ header file.
#ifndef CPPEXAMPLE_H
#define CPPEXAMPLE_H
#include <string>
class CppExample
{
public:
CppExample();
CppExample(const CppExample& foo);
CppExample(const char* title, int flag);
virtual ~CppExample();
const char* title() const;
void title(const char* title);
int flag() const;
void flag(int value);
static int countOfCppExamples();
private:
std::string _title;
int _flag;
};
#endif
cpp/CppExample.cpp
Here is the corresponding C++ source file.
#include "CppExample.h"
CppExample::CppExample() : _title("") {}
CppExample::CppExample(const CppExample& foo): _title(foo._title) {}
CppExample::CppExample(const char* title, int flag) : _title(title), _flag(flag) {}
CppExample::~CppExample() {}
const char* CppExample::title() const { return _title.c_str(); }
void CppExample::title(const char* name) { _title = name; }
int CppExample::flag() const { return _flag; }
void CppExample::flag(int value) { _flag = value; }
int CppExample::countOfCppExamples() { return 1; }
cpp/example.i
Typically in SWIG, you specify a .i
file to the swig
command to define the module that wraps the classes and global functions, which classes and functions to expose to the target language (usually all in our case), and other assorted customization options, which are discussed in the SWIG manual. I’ll show the swig
command in a minute. For now, note that I’m going to generate an example_wrap.cpp
file that will function as the bridge between the languages.
Here’s my example.i
, where I named the module example
.
%module example
%{
#include "cexample.h"
#include "CppExample.h"
%}
%include "cexample.h"
%include "CppExample.h"
It looks odd to have header files appear twice. The code inside the %{...%}
(with a ’#’ before each include
) are standard C and C++ statements, etc. that will be inserted verbatim into the generated “wrapper” file, example_wrap.cpp
, so that file will compile when it references anything declared in the header files. The second case, with a ’%’ before the include
statements1, tells SWIG to make all the declarations in those header files available to the target language. (You can be more selective, if you prefer…)
Following Ruby conventions, the Ruby plugin for SWIG automatically names the module with an upper case first letter (Example
), but you use require 'example'
to include it, as we’ll see shortly.
Building
See the cpp/Makefile
for the gory details. In a nutshell, you run the swig
command like this.
swig -c++ -ruby -Wall -o example_wrap.cpp example.i
Next, you create a dynamically-linked library, as appropriate for your platform, so the Ruby interpreter can load the module dynamically when required. The Makefile
can do this for Linux and OS X platforms. See the Ruby section of the SWIG manual for Windows specifics.
If you test-drive your code, which tends to drive you towards minimally-coupled “modules”, then you can keep your libraries and build times small, which will make the build and test cycle very fast!
spec/cexample_spec.rb
and spec/cppexample_spec.rb
Finally, here are the RSpec files that exercise the C and C++ code. (Disclaimer: these aren’t the best spec files I’ve ever written. For one thing, they don’t exercise all the CppExample
methods! So sue me… :)
require File.dirname(__FILE__) + '/spec_helper'
require 'example'
describe "Example (C functions)" do
it "should be a constant on Module" do
Module.constants.should include('Example')
end
it "should have the methods defined in the C header file" do
Example.methods.should include('returnString')
Example.methods.should include('returnDouble')
Example.methods.should include('doNothing')
end
end
describe Example, ".returnString" do
it "should return the input char * string as a Ruby string unchanged" do
Example.returnString("bar!").should == "bar!"
end
end
describe Example, ".returnDouble" do
it "should return the input integer as a double" do
Example.returnDouble(10).should == 10.0
end
end
describe Example, ".doNothing" do
it "should exist, but do nothing" do
lambda { Example.doNothing }.should_not raise_error
end
end
and
require File.dirname(__FILE__) + '/spec_helper'
require 'example'
describe Example::CppExample do
it "should be a constant on module Example" do
Example.constants.should include('CppExample')
end
end
describe Example::CppExample, ".new" do
it "should create a new object of type CppExample" do
example = Example::CppExample.new("example1", 1)
example.title.should == "example1"
example.flag.should == 1
end
end
describe Example::CppExample, "#title(value)" do
it "should set the title" do
example = Example::CppExample.new("example1", 1)
example.title("title2")
example.title.should == "title2"
end
end
describe Example::CppExample, "#flag(value)" do
it "should set the flag" do
example = Example::CppExample.new("example1", 1)
example.flag(2)
example.flag.should == 2
end
end
If you love RSpec like I do, this is a very compelling thing to see!
And now for the small print:
Current Limitations
As I said, this is just an experiment at this point. Volunteers to make this battle-ready would be most welcome!
General
The Example Makefile
File
It Must Be Hand Edited for Each New or Renamed Source File
You’ve probably already solved this problem for your own make files. Just merge in the example Makefile
to pick up the SWIG- and RSpec-related targets and rules.
It Only Knows How to Build Shared Libraries for Mac OS X and Linux (and Not Very Well)
Some definitions are probably unique to my OS X and Linux machines. Windows is not supported at all. However, this is also easy rectify. Start with the notes in the Makefile
itself.
The module.i
File Must Be Hand Edited for Each File Change
Since the format is simple, a make task could fill a template file with the changed list of source files during the build.
Better Automation
It should be straightforward to provide scripts, IDE/Editor shortcuts, etc. that automate some of the tasks of adding new methods and classes to your C and C++ code when you introduce them first in your “spec” files. (The true TDD way, of course.)
Specific Issues for C Code Testing
I don’t know of any other C-specific issues, so unit testing with Ruby is most viable today for C code. Although I haven’t experimented extensively, C functions and variables are easily mapped by SWIG to a Ruby module. The Ruby section of the SWIG manual discusses this mapping in some detail.
Specific Issues for C++ Code Testing
More work will be required to make this viable. It’s important to note that SWIG cannot handle all C++ constructs (although there are workarounds for most issues, if you’re committed to this approach…). For example, namespaces, nested classes, some template and some method overloading scenarios are not supported. The SWIG manual has details.
Also, during my experiment, SWIG didn’t seem to map const std::string&
objects in C++ method signatures to Ruby strings, as I would have expected (char*
worked fine).
Is It a Viable Approach?
Once the General issues listed above are handled, I think this approach would work very well for C code. For C++ code, there are more issues that need to be addressed, and programmers who are committed to this strategy will need to tolerate some issues (or just use C++-language tools for some scenarios).
Conclusions: Making It Development-Team Ready
I’d like to see this approach pushed to its logical limit. I think it has the potential to really improve the productivity of C and C++ developers and the quality of their test coverage, by leveraging the productivity and power of dynamically-typed languages like Ruby. If you prefer, you could use Tcl, Python, even Java instead.
License
This code is complete open and free to use. Of course, use it at your own risk; I offer it without warranty, etc., etc. When I polish it to the point of making it an “official” project, I will probably release under the Apache license.
1 I spent a lot of time debugging problems because I had a ’#’ where I should have had a ’%’! Caveat emptor!
If you want to use the same approach for testing Java code, you can use JtestR, that includes both RSpec, dust and Test::Unit.
There are lots of ways to improve on coding. I guess with the enumerations above you’ve taken coding a step further. I should experiment with C more becuase I’ve only gotten used to C++.
Cool - nice to see multi-language work - use the best tool, and all that.
You might want to look at the “native” Ruby C interface, rather than using SWIG. I was doing some neural net stuff a while back, and using the FANN (Fast Artificial Neural Network) library, and it was nearly trivial to get it working with Ruby. I’ve done TCL and Perl bindings back and forth with C, and Ruby’s was much cleaner and simpler.
However, it’s been long enough ago that I don’t remember it well enough to swear that it’s simpler than SWIG.
@Ola, I really like what you did with JtestR (and your role in JRuby, for that matter…). Too bad C and C++ aren’t as accomodating.
@yachris2112, I will look at the native interface. I grabbed SWIG for the experiment because I’ve used it before and I wasn’t sure if the Ruby native interface handles C++ very well.
@yachris2112: Maybe I’m missing something, but the nice thing about SWIG is that it automatically generates the ruby interface for you. Using the ruby native interface would require something to parse your C/C++ code and generate the ruby interfaces.
I actually first started using Ruby after reading this article by Phil Tomson on using SWIG and Ruby together: http://www.ddj.com/web-development/184401747
It reduced the acceptance test interpreter I had written in C++ for my QA team from 5000 lines of C++ to about 100 lines of Ruby in about 3 days.
BTW, to get std::string et al in SWIG, you have to include in the .i file ‘%include std_string.i’ inside the wrapped module.
Oh! What a good experiment. It’s seems interesting and not complicated to use, I’ll try one day since it’s free. Of course, I’ll take my own risk.
Nice article Dean.
My first use of Ruby on a real project was using it to automate testing of a DCOM object. Didn’t require the amount of work shown here because of the Win32OLE libraries.
@Bheeshmar, thanks for the useful information about SWIG and C++ strings. Your experience rewriting your AT interpreter is a great example of why I think combining languages and tools is worth the trouble; a 100 line program in any language will be far easier to maintain and evolve over time than a 5000 line program!
@Eric, it will be interesting to watch the Ruby CLR integration projects, like IronRuby. Microsoft is certainly working hard these days on integrating different languages.
Dean, Nice write up. I made a similar post to my blog back in September: http://www.benmabey.com/2007/09/09/bdd_your_c/
One difference in what I did was that I used mkmf to generate my Makefile. I was only playing around with it a little but with what I tried it seemed to work well. So by using that you can avoid having to edit the Makefile by hand.
-Ben
I’m just about ready to try doing this same thing. The only problem I see is that SWIG may introduce bugs. Not sure if that should be a big worry. I am finding Rake to be helpful to build things.
Maybe also have a look at http://metasm.cr0.org or http://cil.sourceforge.net !
I found this response interesting: http://www.codethinked.com/post/2009/11/05/Ite28099s-Okay-To-Write-Unit-Tests.aspx
There are lots of ways to improve on coding. I guess with the enumerations above you’ve taken coding a step further. I should experiment with C more because I’ve only gotten used to C++.
Prudential West
Unit testing? c and c++ ? mmm
There are lots of ways to improve on coding. I guess with the enumerations above you’ve taken coding a step further. I should experiment with C more because I’ve only gotten used to C++.
Wholesale Brand Name Clothing
It reduced the acceptance test interpreter I had written in C++ for my QA team from 5000 lines of C++ to about 100 lines of Ruby in about 3 days.
Wholesalers
“cyguy 4 months later:
Maybe also have a look at http://metasm.cr0.org or http://cil.sourceforge.net ! “
Thanks for link!
experiment with C more because I’ve only gotten used to C. Okey Oyunu ?ndir Okey Yükle
I think mixed language is good for programming and not just for what we traditionally think of as language. One programming language can be so suffocating at times especially if you know more than one and you know a particular solution for the problem in that other language.
Hong Kong Vacations
I am a hard core C/C++ programmer. Now, I wish I have also ventured into other programming languages. It would be interesting and exciting to be part of the programming polyglot society, or something like that.
personal statements sample
I can already foresee some serious problems with mixed language programming. This may work more easily on the surface but there is bound to be a myriad of bugs. This does not mean I will not jump the bandwagon if given the chance
Lawsuit Loans
a make task could fill a template file with the changed list of source files during the build
There are lots of ways to improve on coding. I guess with the enumerations above you’ve taken coding a step further. I should experiment with C more because I’ve only gotten used to C++.cheap VPS
age offers the best developer productivity among all the language ch
Unit testing is one of the most difficult thing to do,,,, But now it is possible wit the new software… It is a method of testing individual unit of source code… It is basically a test of these codes whether they are fit for use on there is any complication in these. There are many other unit testers but all of these follow same method,,, http://phoenix.freecraigslist.ne
I have been worked in C and C++ but I haven’t worked in Ruby.
I tried this method out, including building a neat Rakefile to get it all working. One limitation also worth mentioning here is that Swig handling of pointers is a bit odd. Even with the std_string.i helper in place, it can handle a reference to std_string, but not a pointer to one. The deref method can get to the real pointer. Apparently smart pointers are already wrapped nicely though.
I am new to this site and to Ruby too.Thanks for the info.
I don’t think that RSpec works for C++ Using CppUnit, it’s somehow painful. There’s a lot of overhead per test (overhead means lines of code), so adding tests becomes annoying. CppTest looks a bit better, and cxxtest seems really nice, though I haven’t used the last two myself. Bucharest Hotel
Buy the cheap North Face online in The North Face Shop for free shopping and save 50~70% OFF. north face outlet , Northface shop.
This is such a good information. Thanks for sharing this to us.
This looks a lot like the way “good” inheritance should behave.
iPad Video Converter for Mac converts video such as AVI, FLV, MOV, WMV, MKV, and more to iPad. It also have useful setings such as crop, trim, merge, and video effect like brightness, contrast and saturation.
Nice post you have here.cincinnati chiropractic
Latest iphone 4 white Conversion Kit with white color is now available, Let’s try!
usefull subject man..
Mold making is the core business of Intertech (Taiwan). With world level technology, Intertech enjoys a very good reputation for making Injection Mold and Plastic Moldsfor their worldwide customers.
Mold making is the core business of Intertech (Taiwan). With world level technology, Intertech enjoys a very good reputation for making Injection Mold and Plastic Moldsfor their worldwide customers.
I tried this method out, including building a neat Rakefile to get it all working. One limitation also worth mentioning here is that Swig handling of pointers is a bit odd. Even with the std_string.i helper in place, it can handle a reference to std_string, but not a pointer to one. The deref method can get to the real pointer. Apparently smart pointers are already wrapped nicely though.longview real estate
but still in some villages & small town teachers are using black boards.
I’m just about ready to try doing this same thing. The only problem I see is that SWIG may introduce bugs. Not sure if that should be a big worry. I am finding Rake to be helpful to build things.Visual Impact Muscle Building Review
The Ruby section of the SWIG manual was very helpful.
Rajesh…I am new to this site .Thanks for giving such a nice information .
An awful call. Real informative and precise. I revalue the communicator for presenting much a alter flier. This types of posts are ever bookmarkable. I’ll wait for much posts here all the instance. Server management
An awesome flayer. Rattling informative and city. I revalue the communicator for presenting specified a nerveless aeronautic. This types of posts are e’er bookmarkable. I’ll wait for much posts here all the example.
I really like this essay. Thank you for writing it so seriously. I want to recommend it for my friends strongly. iPad PDF Transfer for Mac can help you transfer ebooks in PDF format from ipad to mac/iTunes.
Thanks for shareing! I agree with you. The artical improve me so much! I will come here frequently. iPad to Mac Transfer lets you transfer music, movie, photo, ePub, PDF, Audiobook, Podcast and TV Show from iPad to Mac or iPad to iTunes.
I’m always amazed that with a little extra searching, you can findsome of the most fascinating articles. It’s annoying that more blogs like this aren’t ranked at the top in the SERPs. I know a friend that will appreciate this page so I’ll send him a link to your article. facebook dating app
This web page is outstanding and so is how the matter was expanded. I like some of the comments as well although I would prefer we all keep it on topic in order add value to the subject. Newport Beach Houses Info. Enjoy Natural life with Newport Beach Houses. Find Newport Beach Houses
This is far from a complete and working solution, but I think it shows promise.
Rajesh.
I am new to this site .Thanks for giving such a nice information.
To understand any kinds of stuff the language used is very important. Many times they are good but at last not so explicit. Daycare Forms
I usually do plain C (mathematical coding), but I want to do one or two iPhone apps in some moment of my life and this can come in handy for the Objective C part.
Of course, I realize that emotions alone are not the basis for public policy and Libertarian Party positions should not be based merely on popular sentiment. http://educationonlinenow.wordpress.com/2011/01/13/the-many-career-opportunities-in-education/”>Teacher Resources
You thoughts and ideas about the concept of Unit Testing C and C++ with Ruby and Rspec are very useful and helpful for students pursuing their career in programming.
Buy $10 Replica Designer Sunglasses with 3-day FREE SHIPPING
Thanks for this post, I have searching this kind of information for how many times, this is really great… hope that you will continue sharing for your knowledge, I’ll be back again to read some of your post…
Three are some really thought provoking writings. I have shared it with others. They have really agreed on the points. You have definitely put good thought. Well done. Flats To Let Paisley
there are lots of people are talking about this differently Florist Glasgow
I am not sure where you are getting your information, but great topic
useful code many thanks.
internette görüntülü olarak okey oyunu oyna, gerçek kisilerle tanis, turnuva heyecanini yasa.
i am happyr for your responses
a make task could fill a template file with the changed list of source files during the build
I think it shows promise.
Beats by dr dre studio with look after talk in white. extra attributes on Monster Beats By Dr. Dre Pro Headphones Black a specific tri-fold design and design and carrying circumstance which make for compact and uncomplicated safe-keeping when not in use. Beats by dr dre solo .
The theme is superb. I have just bookmarked your site. There are some conspicuous points you mentioned. It’s really worth reading. Keep going. hcg diet atlanta
Our goal is to meet the needs of the customer.If you buy more,we can give you some convenient.For our old customer,we will give a discount. mens sandals womens sandals size 12 narrow womens sandals harley davidson womens sandals womens sandals with arch support white womens sandals sandals for women
women sandals for cheap born womens sandals womens size 12 sandals womens sandals size 11 womens red sandals womens golf sandals keen womens sandals women sandals sale sandals women
Very Nice Article About Unit Testing. Thanks for the valuable information.
This process can be engaged in a group, but you don’t want to influence anyone or be swayed by someone as you create your initial free-form dream list of goals. Buy and sell for free online
To get the most of out of technology we all need a sense of our technological identity, a sense of who we are and what we need to do to see to it that technology will help us get there. Tooway Pro
Great post! Nice and informative, I really enjoyed reading it and will certainly share this post with my friends . Read everything you ever wanted to know about engagement rings
we all need a sense of our technological identity, a sense of who we are and what we
sense of our technological identity, a sense of who we are and what wehigh quality headphones new design headphones
This shows, in fact Berlin have to individual burning cars became accustomed to, Lady Gaga Heartbeats think this is mischief.
if for the government, good at expression through other routes, and Monster Beats Dr Dre Tour should not be hurt civilians with the way to vent their emotions.
If Monster Beats Dr Dre Headphones help in tracking down arsonists who it and didn’t get better control. In order to be able to solve crimes in time, Berlin police at present a reward of 5000 euros gather clues.
Based on integral subsystem considerations, the fully integrated test program requires considerable systems analysis and trade-off studies to arrive at the evolution of specifications over a given time period. Ekonomi
the best vintage lace wedding dresses show
The professional design make you foot more comfortable. Even more tantalizing,this pattern make your legs look as long as you can,it will make you looked more attractive.Moveover,it has reasonable price.If you are a popular woman,do not miss it.
Technical details of Christian Louboutin Velours Scrunch Suede Boots Coffee:
Fashion, delicate, luxurious Christian louboutins shoes on sale, one of its series is Christian Louboutin Tall Boots, is urbanism collocation. This Christian louboutins shoes design makes people new and refreshing. Red soles shoes is personality, your charm will be wonderful performance.
in describing the evaluation of our Studio before it is necessary to talk about this wire to the ascension of the sound quality.
As used on the head headphones, so people not necessarily seeing the way the case for basic procedures,
really nice one good article
I am totally agreed with the commenter above me. It’s really unbelievable.
at the card
I have to say this post was certainly informative and contains useful content for enthusiastic visitors. I will definitely bookmark this blog for future reference and further viewing. Thanks a bunch for sharing this with us!
great site, kudos
well. your article is very useful for all the programmer and it can help me have a better code.
Very Nice Article About Unit Testing. Thanks for the valuable information.
An insightful post.. An automatic generator of basic unit tests for a shared C/C++ library.. It helps to quickly generate simple test cases for every function in an API using their signatures, data type definitions and relationships between functions straight from the header files.. Outlook Email Setup
Like the Rams afore them with Sam Bradford, the Vikings aswell acquire what they ahead is occasions a allocation quarterback in address in Christian Ponder affluence of added holes to fill. Rick Spielman,
who was again acknowledgment For the reason that need for these kinds of solutions is continually growing, you will find numerous job possibilities for anyone those who contain the creativeness as
well as the generate that may be forced to succeed. to accustomed manager, told Network the Vikings will be all-around listeners. alive on abstruse day, the third all-embracing Spielman said. traveling
acclimatized as a allocation of the fresh accumulated acceding acceding bogus it added accessible for teams to arrangement in to the top ten picks afterwards abounding affirmed diplomacy killing deals.
The Atlanta Falcons Jaguars traded in to the top ten in the plan of the Draft, the ancient below the fresh rules. Given the likelihood that Stanford quarterback Andrew Luck is ancient all-embracing
best by the Indianapolis Colts, teams analytic to move up would be accomplishing so for the acclimatized Support opportunities with all the airlines offers the next job titles: reservation agents,
ramp agents, line assistance technicians, customer assistance agents, baggage handlers, and other conduite positions including station manager, support manager, and airport functions manager.
baddest top-rated diplomacy like Baylor quarterback Robert Griffin, abhorrent accouterment Matt Kalil, Oklahoma St. avant-garde receiver Justin Blackmon or LSU cornerback Morris Claiborne,
Unit Testing C and C++ ... with Ruby and RSpec! 98 hoo,good article!!I like the post!62
Unit Testing C and C++ ... with Ruby and RSpec! 99 good post155
This seems to be acceptable to all. This is not just a hit and that these rich people are still taking a lot of attention of a compensation is largely because you can go through the not-to show him badly. You can communicate with the first we’ll try our best to make things better.
Mourinho conference missing, choose wisely is a “world war” decompression aswell Real reflected in the are currently delays of the state.Requires three trust Real Madrid, but Barca have scored more adventures.
Good news on preferential measures, as shown below. they are admired abroad but in addition to components of the call appearance. A new era of widely admired contemporary artifacts the appointment of youth Burghal.
This is perhaps the most significant victory Schalke, because a victory in Milan against Inter. The fact that playing in a club with a small, but the link with a list in hand yet sealed the door with a 3-1 victory over the Greek Panathinaikos took to do it was impressive.
I recently re-created this approach using Ruby FFI, and blogged about it here: http://sodabrew.com/2012/04/writing-c-unit-tests-in-ruby.html
Still thinking about how to auto-generate bindings from headers, rather than having the developer manually duplicate the C function signatures in the RSpec test file, but that’s a project for another day!
(PS – This blog post is still pretty popular, given how much spam it has attracted, yikes!)
Bridesmaids gifts can be anything, from jewelry pieces, handbags to perfumes?
http://www.outfitscosplay.com/cosplay-accessories/kingdom-hearts-accessories Deluxe Kingdom Hearts Accessories for Sale.Find your favorite characters and cosplay outfits from all the popular anime and games.
J’ai eu la chance tee shirt DC pas cher d’avoir vu ce discours vous live.I applaudi pour nous donner le droit, et les encourager à envoyer à Digest ou l’écrivain Magazine Writer. Chaque écrivain doit avoir une chance de lire ce. C’est si important que cela.
Wonderful post. This is most inspiring post. I love to read such kind of material. Blogger did a great job here…. Botox in Dubai
I am always searching for informative information like this! Write more informative news like this, and let’s Stop Dreaming Start Action!! brand building Pakistan