[llvm-commits] [llvm] r61576 -/llvm/trunk/unittests/ADT/ImmutableSetTest.cpp

Nuno Lopes nunoplopes at sapo.pt
Sat Jan 3 06:57:49 PST 2009


Hi,

So it was the first time I was using gtests, so I didn't know those details. 
Anyway thanks for reviewing the test. I've commited a patch that should 
address your comments.

Thanks,
Nuno


----- Original Message -----
> Hi Nuno,
>
> Thanks for adding unittests!  I have some comments below.
>
> 2009/1/2 Nuno Lopes <nunoplopes at sapo.pt>
>
>> Author: nlopes
>> Date: Fri Jan  2 07:49:50 2009
>> New Revision: 61576
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=61576&view=rev
>> Log:
>> fist short at a new unit test for ImmutableSets. no bugs found, though :P
>>
>> Added:
>>    llvm/trunk/unittests/ADT/ImmutableSetTest.cpp
>>
>> Added: llvm/trunk/unittests/ADT/ImmutableSetTest.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/ImmutableSetTest.cpp?rev=61576&view=auto
>>
>>
>> ==============================================================================
>> --- llvm/trunk/unittests/ADT/ImmutableSetTest.cpp (added)
>> +++ llvm/trunk/unittests/ADT/ImmutableSetTest.cpp Fri Jan  2 07:49:50 
>> 2009
>> @@ -0,0 +1,208 @@
>> +// llvm/unittest/ADT/ImmutableSetTest.cpp - ImmutableSet unit tests -*-
>> C++ -*-//
>>
>
> You can put the description below the typical file header to make this 
> line
> look standard, but this is minor.
>
>
>> +namespace {
>> +class ImmutableSetTest : public testing::Test {
>> +};
>> +
>> +
>> +TEST_F(ImmutableSetTest, EmptyIntSetTest) {
>> +  ImmutableSet<int>::Factory f;
>
>
> I see you use a Factory in every test -- you can make this a member of the
> ImmutableSetTest above, declare it once, and drop the declaration from 
> every
> specific test -- that will make your code shorter.  A new Factory will be
> created for each test, so you don't need to worry about getting a used
> Factory. :-)
>
>
>> +static char *ptr; // tmp var
>> +struct MyIter {
>> +  int counter;
>> +  MyIter() : counter(0) {}
>> +  void operator()(char c) {
>> +    *ptr++ = c;
>> +    ++counter;
>> +  }
>> +};
>>
>
> Global state is frowned upon -- if you don't properly clear it between
> tests, strange bugs will occur, and they will depend on the order of the
> test execution (which aren't guaranteed to execute in any particular
> order).  This will lead to strange Heisenbugs.
>
> Instead, you can make another Fixture class, and make this state a part of
> that class.  If you set up that state, you'll know you're always getting a
> clean beginning state, and you'll have nothing to worry about.
>
>
>> +TEST_F(ImmutableSetTest, CallbackCharSetTest) {
>> +  ImmutableSet<char>::Factory f;
>> +  ImmutableSet<char> S = f.GetEmptySet();
>> +
>> +  ImmutableSet<char> S2 = f.Add(f.Add(f.Add(S, 'a'), 'e'), 'i');
>> +  ImmutableSet<char> S3 = f.Add(f.Add(S2, 'o'), 'u');
>> +
>> +  char buffer[6] = {0};
>> +  ptr = buffer;
>> +  S3.foreach<MyIter>();
>> +
>> +  ASSERT_EQ(buffer[0], 'a');
>> +  ASSERT_EQ(buffer[1], 'e');
>> +  ASSERT_EQ(buffer[2], 'i');
>> +  ASSERT_EQ(buffer[3], 'o');
>> +  ASSERT_EQ(buffer[4], 'u');
>> +  ASSERT_EQ(buffer[5], 0);
>>
>
> No need to use ASSERT here, EXPECT will work just as well, and will tell 
> you
> if you have multiple errors (e.g., you'll see if 2 of them were swapped, 
> for
> instance, which ASSERT won't tell you.
>
> Also, and this is very important, the expected value in ASSERT and EXPECT
> values should go FIRST (you do this correctly above, but not here).  This 
> is
> important because if this assertion fails, the error will print as:
> ASSERT failed:
> expected value: <foo>
> actual value: <bar>
>
> If you mix and match the order of the values, you'll get confusing error
> messages.
>
> +    ASSERT_EQ(*I, i++);
>> +  }
>> +  ASSERT_EQ(i, 0);
>> +
>> +  i = 0;
>> +  for (ImmutableSet<long>::iterator I = S2.begin(), E = S2.end(); I != 
>> E;
>> ++I) {
>> +    ASSERT_EQ(*I, i++);
>> +  }
>> +  ASSERT_EQ(i, 3);
>> +
>> +  i = 0;
>> +  for (ImmutableSet<long>::iterator I = S3.begin(), E = S3.end(); I != 
>> E;
>> I++) {
>> +    ASSERT_EQ(*I, i++);
>> +  }
>> +  ASSERT_EQ(i, 6);
>>
>
> Same here on the order of expected vs. actual values -- please reverse 
> them.
>
>
> Misha 




More information about the llvm-commits mailing list