Unit Testing C and C++ ... with Ruby and RSpec! 110

Posted by Dean Wampler Tue, 05 Feb 2008 04:08:00 GMT

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!

Comments

Leave a response

  1. Avatar
    Ola Bini about 8 hours later:

    If you want to use the same approach for testing Java code, you can use JtestR, that includes both RSpec, dust and Test::Unit.

  2. Avatar
    Tim about 9 hours later:

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

  3. Avatar
    yachris2112 about 9 hours later:

    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.

  4. Avatar
    Dean Wampler about 11 hours later:

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

  5. Avatar
    Allen Rohner about 12 hours later:

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

  6. Avatar
    Bheeshmar about 20 hours later:

    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.

  7. Avatar
    Carlo 1 day later:

    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.

  8. Avatar
    Eric 1 day later:

    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.

  9. Avatar
    Dean Wampler 1 day later:

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

  10. Avatar
    Ben Mabey 3 days later:

    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

  11. Avatar
    Nolan Eakins 3 months later:

    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.

  12. Avatar
    cyguy 4 months later:

    Maybe also have a look at http://metasm.cr0.org or http://cil.sourceforge.net !

  13. Avatar
    </div> <cite><a href="http://ubuntuftw.blogspot.com">kewlito</a></cite> over 2 years later:

    I found this response interesting: http://www.codethinked.com/post/2009/11/05/Ite28099s-Okay-To-Write-Unit-Tests.aspx

  14. Avatar
    ShAaNiG over 2 years later:

    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

  15. Avatar
    Mohamad over 2 years later:

    Unit testing? c and c++ ? mmm

  16. Avatar
    ShAaNiG over 2 years later:

    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

  17. Avatar
    ShAaNiG over 2 years later:

    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

  18. Avatar
    prepin over 2 years later:

    “cyguy 4 months later:

    Maybe also have a look at http://metasm.cr0.org or http://cil.sourceforge.net ! “

    Thanks for link!

  19. Avatar
    okey oyunu indir over 2 years later:

    experiment with C more because I’ve only gotten used to C. Okey Oyunu ?ndir Okey Yükle

  20. Avatar
    daniel over 2 years later:

    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

  21. Avatar
    Kent over 2 years later:

    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

  22. Avatar
    Daniel over 2 years later:

    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

  23. Avatar
    memorias usb over 3 years later:

    a make task could fill a template file with the changed list of source files during the build

  24. Avatar
    cheap vps over 3 years later:

    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

  25. Avatar
    bag manufacturer over 3 years later:

    age offers the best developer productivity among all the language ch

  26. Avatar
    Craigslist Phoenix over 3 years later:

    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

  27. Avatar
    Chicago mover over 3 years later:

    I have been worked in C and C++ but I haven’t worked in Ruby.

  28. Avatar
    Danny Staple over 3 years later:

    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.

  29. Avatar
    Welders over 3 years later:

    I am new to this site and to Ruby too.Thanks for the info.

  30. Avatar
    Regim Hotelier Bucuresti over 3 years later:

    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

  31. Avatar
    The North Face Shop over 3 years later:

    Buy the cheap North Face online in The North Face Shop for free shopping and save 50~70% OFF. north face outlet , Northface shop.

  32. Avatar
    Tenant Screening over 3 years later:

    This is such a good information. Thanks for sharing this to us.

  33. Avatar
    Pandora over 3 years later:

    This looks a lot like the way “good” inheritance should behave.

  34. Avatar
    iPad video converter for Mac over 3 years later:

    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.

  35. Avatar
    cincinnati chiropractor over 3 years later:

    Nice post you have here.cincinnati chiropractic

  36. Avatar
    http://www.blacktowhiteiphone4.com over 3 years later:

    Latest iphone 4 white Conversion Kit with white color is now available, Let’s try!

  37. Avatar
    porno videolar? over 3 years later:

    usefull subject man..

  38. Avatar
    Silicone Molding over 3 years later:

    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.

  39. Avatar
    Silicone Molding over 3 years later:

    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.

  40. Avatar
    longview real estate over 3 years later:

    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

  41. Avatar
    masters in criminal justice over 3 years later:

    but still in some villages & small town teachers are using black boards.

  42. Avatar
    Visual Impact Muscle Building Review over 3 years later:

    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

  43. Avatar
    US Criminal Record over 3 years later:

    The Ruby section of the SWIG manual was very helpful.

  44. Avatar
    htttp://www.hongkongvacationsholidays.com over 3 years later:

    Rajesh…I am new to this site .Thanks for giving such a nice information .

  45. Avatar
    Server management over 3 years later:

    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

  46. Avatar
    Server management over 3 years later:

    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.

  47. Avatar
    iPad PDF Transfer for Mac over 3 years later:

    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.

  48. Avatar
    iPad to mac transfer over 3 years later:

    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.

  49. Avatar
    facebook dating app over 3 years later:

    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

  50. Avatar
    Best Nose Hair Trimmer over 3 years later:

    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

  51. Avatar
    Criminal Records over 3 years later:

    This is far from a complete and working solution, but I think it shows promise.

  52. Avatar
    GuncelTurkey over 3 years later:

    Rajesh.

    I am new to this site .Thanks for giving such a nice information.

  53. Avatar
    ssara over 3 years later:

    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

  54. Avatar
    LiliEast over 3 years later:

    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.

  55. Avatar
    Education is essential over 3 years later:

    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

  56. Avatar
    Ukonlinepaydayloans over 3 years later:

    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.

  57. Avatar
    Sunglass over 3 years later:

    Buy $10 Replica Designer Sunglasses with 3-day FREE SHIPPING

  58. Avatar
    SEO Firm India over 3 years later:

    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…

  59. Avatar
    tahmid_nsu_bba@yahoo.com over 3 years later:

    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

  60. Avatar
    tahmid_nsu_bba@yahoo.com over 3 years later:

    there are lots of people are talking about this differently Florist Glasgow

  61. Avatar
    programy over 3 years later:

    I am not sure where you are getting your information, but great topic

  62. Avatar
    okey oyunu oyna over 3 years later:

    useful code many thanks.

    internette görüntülü olarak okey oyunu oyna, gerçek kisilerle tanis, turnuva heyecanini yasa.

  63. Avatar
    Jewellery over 3 years later:

    i am happyr for your responses

  64. Avatar
    free live stream over 3 years later:

    a make task could fill a template file with the changed list of source files during the build

  65. Avatar
    epl stream over 3 years later:

    I think it shows promise.

  66. Avatar
    beats by dr dre headphones over 3 years later:

    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 .

  67. Avatar
    hcg diet atlanta over 3 years later:

    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

  68. Avatar
    mofei over 3 years later:

    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

  69. Avatar
    http://www.leprechaun-software.com over 3 years later:

    Very Nice Article About Unit Testing. Thanks for the valuable information.

  70. Avatar
    Beth over 3 years later:

    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

  71. Avatar
    Dave over 3 years later:

    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

  72. Avatar
    Crystal Jewellery over 4 years later:

    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

  73. Avatar
    beats by dre store over 4 years later:

    we all need a sense of our technological identity, a sense of who we are and what we

  74. Avatar
    beats by dre store over 4 years later:

    sense of our technological identity, a sense of who we are and what wehigh quality headphones new design headphones

  75. Avatar
    Monster Cable Beats over 4 years later:

    This shows, in fact Berlin have to individual burning cars became accustomed to, Lady Gaga Heartbeats think this is mischief.

  76. Avatar
    Monster Cable Beats over 4 years later:

    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.

  77. Avatar
    Monster Cable Beats over 4 years later:

    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.

  78. Avatar
    Tom over 4 years later:

    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

  79. Avatar
    vintage lace wedding dresses over 4 years later:

    the best vintage lace wedding dresses show

  80. Avatar
    christian louboutin over 4 years later:

    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:

    Color: Coffee
    Material: Suede
    4(100mm) heel
    Signature red sole x

    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.

  81. Avatar
    Beats By Dre Canada over 4 years later:

    in describing the evaluation of our Studio before it is necessary to talk about this wire to the ascension of the sound quality.

  82. Avatar
    Dr Dre beats Headphones Canada over 4 years later:

    As used on the head headphones, so people not necessarily seeing the way the case for basic procedures,

  83. Avatar
    hp storage servers over 4 years later:

    really nice one good article

  84. Avatar
    music production over 4 years later:

    I am totally agreed with the commenter above me. It’s really unbelievable.

  85. Avatar
    Breguet watches over 4 years later:

    at the card

  86. Avatar
    san antonio dental over 4 years later:

    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!

  87. Avatar
    Singles over 4 years later:

    great site, kudos

  88. Avatar
    Backup iPhone sms over 4 years later:

    well. your article is very useful for all the programmer and it can help me have a better code.

  89. Avatar
    lipozene over 4 years later:

    Very Nice Article About Unit Testing. Thanks for the valuable information.

  90. Avatar
    Outlook Email Setup over 4 years later:

    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

  91. Avatar
    blank snapback hats over 4 years later:

    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,

  92. Avatar
    cheap air shoes over 4 years later:

    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

  93. Avatar
    air mens shoes over 4 years later:

    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

  94. Avatar
    nfl cheap jerseys over 4 years later:

    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.

  95. Avatar
    wholesale snapback hats over 4 years later:

    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

  96. Avatar
    wholesale snapbacks over 4 years later:

    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,

  97. Avatar
    cheap snapbacks free shipping over 4 years later:

    ramp agents, line assistance technicians, customer assistance agents, baggage handlers, and other conduite positions including station manager, support manager, and airport functions manager.

  98. Avatar
    cheap snapback hats over 4 years later:

    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,

  99. Avatar
    louboutin sales over 4 years later:

    Unit Testing C and C++ ... with Ruby and RSpec! 98 hoo,good article!!I like the post!62

  100. Avatar
    bladeless fans over 4 years later:

    Unit Testing C and C++ ... with Ruby and RSpec! 99 good post155

  101. Avatar
    air mens shoes over 4 years later:

    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.

  102. Avatar
    cheap air shoes over 4 years later:

    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.

  103. Avatar
    cheap soccer jerseys over 4 years later:

    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.

  104. Avatar
    custom soccer jerseys over 4 years later:

    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.

  105. Avatar
    sodabrew over 4 years later:

    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!)

  106. Avatar
    lime green hermes birkin over 4 years later:

    Bridesmaids gifts can be anything, from jewelry pieces, handbags to perfumes?

  107. Avatar
    costumes cosplay over 4 years later:

    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.

  108. Avatar
    linlin5668@hotmail.com over 4 years later:

    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.

  109. Avatar
    blaircraig over 4 years later:

    Wonderful post. This is most inspiring post. I love to read such kind of material. Blogger did a great job here…. Botox in Dubai

  110. Avatar
    devindennis over 4 years later:

    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

Comments