## Pages

### Developing by testing

We have been asked to write a C++ function that checks if the passed integer is prime. Let's develop it using Google Test as testing environment.

Step 1

The function should have this prototype:
`extern bool isPrime(int value);`
Let's write a first implementation, any value we pass in, the function says it is not a prime:
`bool isPrime(int value){    return false;}`

We know it is not working properly, but at least it works.

Step 2

We setup the Google Test environment, so we are going to call RUN_ALL_TEST on a few tests we are about to write.

Negative numbers are not prime, so here is a first lot of tests:
`TEST(IsPrimeTest, Negative) {  EXPECT_FALSE(isPrime(-1));  EXPECT_FALSE(isPrime(-2));  EXPECT_FALSE(isPrime(INT_MIN));}`

Let's consider the first positive numbers:
`TEST(IsPrimeTest, Trivial) {  EXPECT_FALSE(isPrime(0));  EXPECT_FALSE(isPrime(1));  EXPECT_TRUE(isPrime(2));  EXPECT_TRUE(isPrime(3));}`

And then do some testing on other positive numbers:
`TEST(IsPrimeTest, Positive) {  EXPECT_FALSE(isPrime(4));  EXPECT_TRUE(isPrime(5));  EXPECT_FALSE(isPrime(6));  EXPECT_TRUE(isPrime(23));}`

Step 3

We compile and run our application. If we correctly setup Google Test, we are going to find out that the first lot of testing succeed (hurray!) but we have a few errors in the other two ones:
`IsPrimeTest.Trivial:(...)\test.cpp(94): error: Value of: isPrime(2)  Actual: falseExpected: true(...)\test.cpp(95): error: Value of: isPrime(3)  Actual: falseExpected: trueIsPrimeTest.Trivial:(...)\test.cpp(101): error: Value of: isPrime(5)  Actual: falseExpected: true(...)\test.cpp(103): error: Value of: isPrime(23)  Actual: falseExpected: true`

Looks like the algorithm we applied in our function is not perfect.

Step 4

We change of function in this way:
`bool isPrime(int value){    if(value < 2)        return false;    // 2 is prime, all other even numbers not    if((value != 2) && (value % 2 == 0))        return false;    return true;}`

Wow - no errors detected. But have we done enough testing?

Step 4

`TEST(IsPrimeTest, LessThan100) {  EXPECT_FALSE(isPrime(87));  EXPECT_TRUE(isPrime(89));  EXPECT_FALSE(isPrime(95));  EXPECT_TRUE(isPrime(97));}`

Looks like we still have problems:
`(...)\test.cpp(107): error: Value of: isPrime(87)  Actual: trueExpected: false(...)\test.cpp(109): error: Value of: isPrime(95)  Actual: trueExpected: false`

And so on ...