From 091e51fbbdc71f85facd44108901345ebf89b55d Mon Sep 17 00:00:00 2001
From: Steven H Johnson <shjohnson.pi@gmail.com>
Date: Sun, 11 Nov 2018 22:49:58 -0500
Subject: [PATCH] Do full tests for my_sqrt with mocking.

---
 src/unit_tests                  | Bin 31608 -> 0 bytes
 tests/cunit/README.md           |   3 +
 tests/cunit/cunit.c             |  24 +++++++
 tests/cunit/cunit.h             | 113 ++++++++++++++++++++++++++++++++
 tests/unit_tests/Makefile       |  11 ++--
 tests/unit_tests/mock_sqrt.c    |  17 ++++-
 tests/unit_tests/mock_sqrt.h    |   3 +
 tests/unit_tests/test_my_sqrt.c |  76 +++++++++++++++++----
 8 files changed, 230 insertions(+), 17 deletions(-)
 delete mode 100755 src/unit_tests
 create mode 100644 tests/cunit/README.md
 create mode 100644 tests/cunit/cunit.c
 create mode 100644 tests/cunit/cunit.h
 create mode 100644 tests/unit_tests/mock_sqrt.h

diff --git a/src/unit_tests b/src/unit_tests
deleted file mode 100755
index ff035a93ea140e83b2f57439eb874e1619dfceeb..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 31608
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

diff --git a/tests/cunit/README.md b/tests/cunit/README.md
new file mode 100644
index 0000000..12abd42
--- /dev/null
+++ b/tests/cunit/README.md
@@ -0,0 +1,3 @@
+Custom made C Unit Testing Library by Kapenga.
+
+Not to be confused with libcunit1.
\ No newline at end of file
diff --git a/tests/cunit/cunit.c b/tests/cunit/cunit.c
new file mode 100644
index 0000000..07b520c
--- /dev/null
+++ b/tests/cunit/cunit.c
@@ -0,0 +1,24 @@
+// cunit.c
+// The global constants for cunit and cunit_init(),
+// which should be called befoer using the unit test 
+// macros in cunit.h
+#include <stdio.h>
+#include "cunit.h"
+
+FILE    *cunit_log; 	// when cunit test macors print resu
+double  cunit_dmacheps;
+
+int cunit_init() {
+double dm;
+double dmacheps = 0.5;
+
+cunit_log = stderr;
+// a crude way for getting close to macheps 
+// should use a standard lib cal here 
+while( (1.0 + (dm = dmacheps/2.0) ) != 1.0  ) {
+   dmacheps = dm;
+}
+cunit_dmacheps = dmacheps;
+return 0; 
+}
+
diff --git a/tests/cunit/cunit.h b/tests/cunit/cunit.h
new file mode 100644
index 0000000..92b438a
--- /dev/null
+++ b/tests/cunit/cunit.h
@@ -0,0 +1,113 @@
+#include <stdio.h>
+#include <assert.h>
+#include <math.h> 
+
+extern FILE *cunit_log; 
+extern double cunit_dmacheps;
+
+int cunit_init();
+
+#define cunit_open(log) { \
+    if((cunit_log=fopen( log, "w") == NULL ) { \
+      cunit_log = stderr; \
+    } \
+}
+#define cunit_close fclose(cunit_log)
+#define cunit_flush() fflush(cunit_log)
+#define cunit_date(str) { \
+    fprintf(cunit_log, "%s  LINE %d:  DATE:%s TIME:%s :%s\n", \
+              __FILE__ , __LINE__ , __DATE__ , __TIME__ , str ); \
+}
+#define cunit_print(str) { \
+    fprintf(cunit_log, "%s\n", str ); \
+}
+
+#define assert_true(str, a) { \
+  if( !( a ) ) { \
+    fprintf(cunit_log, "%s  LINE %d: %s, %d != TRUE\n", \
+              __FILE__ , __LINE__ , str ,  a ); \
+  } \
+}
+
+#define assert_false(str, a) { \
+  if( a ) { \
+    fprintf(cunit_log, "%s  LINE %d: %s, %d != FALSE\n", \
+              __FILE__ , __LINE__ , str ,  a ); \
+  } \
+}
+
+#define assert_eq(str,a,b) { \
+  if( a != b ) { \
+    fprintf(cunit_log, "%s  LINE %d: %s, %d !== %d\n", \
+              __FILE__ , __LINE__ , str ,  a , b ); \
+  } \
+}
+#define assert_neq(str,a,b) { \
+  if( a == b ) { \
+    fprintf(cunit_log, "%s  LINE %d: %s, %d !!= %d\n", \
+              __FILE__ , __LINE__ , str ,  a , b ); \
+  } \
+}
+#define assert_ge(str,a,b) { \
+  if( a < b ) { \
+    fprintf(cunit_log, "%s  LINE %d: %s, %d !>= %d\n", \
+              __FILE__ , __LINE__ , str ,  a , b ); \
+  } \
+}
+#define assert_gt(str,a,b) { \
+  if( a <= b ) { \
+    fprintf(cunit_log, "%s  LINE %d: %s, %d !> %d\n", \
+              __FILE__ , __LINE__ , str ,  a , b ); \
+  } \
+}
+#define assert_le(str,a,b) { \
+  if( a > b ) { \
+    fprintf(cunit_log, "%s  LINE %d: %s, %d !<= %d\n", \
+              __FILE__ , __LINE__ , str ,  a , b ); \
+  } \
+}
+#define assert_lt(str,a,b) { \
+  if( a >= b ) { \
+    fprintf(cunit_log, "%s  LINE %d: %s, %d !< %d\n", \
+              __FILE__ , __LINE__ , str ,  a , b ); \
+  } \
+}
+#define assert_feq(str,a,b) { \
+  if( a != b ) { \
+    fprintf(cunit_log, "%s  LINE %d: %s, %24.16f !== %24.16f\n", \
+              __FILE__ , __LINE__ , str , a , b ); \
+  } \
+}
+// eq subject to absolute error
+#define assert_feqaerr(str,a,b,aerr) { \
+  if( fabs(a - b) > aerr ) { \
+    fprintf(cunit_log, "%s  LINE %d: %s, %24.16f !== %24.16f err=%10.6e\n", \
+              __FILE__ , __LINE__ , str , a , b , err); \
+  } \
+}
+// eq subject to relative error
+// Perhaps it should check if a == b == 0.0 
+#define assert_feqrerr(str,a,b,rerr) { \
+  if( fabs(a - b)/(fabs(a) + fabs(b)) > rerr ) { \
+    fprintf(cunit_log, "%s  LINE %d: %s, %24.16f !>= %24.16f rerr=%10.6e\n", \
+              __FILE__ , __LINE__ , str , a , b , rerr ); \
+  } \
+}
+#define assert_fgt(str,a,b) { \
+  if( a <= b ) { \
+    fprintf(cunit_log, "%s  LINE %d: %s, %24.16f !> %24.16f\n", \
+              __FILE__ , __LINE__ , str ,  a , b ); \
+  } \
+}
+#define assert_fle(str,a,b) { \
+  if( a > b ) { \
+    fprintf(cunit_log, "%s  LINE %d: %s, %24.16f !<= %24.16f\n", \
+              __FILE__ , __LINE__ , str , a , b ); \
+  } \
+}
+#define assert_flt(str,a,b) { \
+  if( a >= b ) { \
+    fprintf(cunit_log, "%s  LINE %d: %s, %24.16f !< %24.16f\n", \
+              __FILE__ , __LINE__ , str , a , b ); \
+  } \
+}
diff --git a/tests/unit_tests/Makefile b/tests/unit_tests/Makefile
index 93e370f..2a78f14 100644
--- a/tests/unit_tests/Makefile
+++ b/tests/unit_tests/Makefile
@@ -4,7 +4,7 @@ LIBS = -lm
 CC = gcc
 CFLAGS = -Wall -pedantic -std=c99 -g
 SRC_DIR = ../../src
-WRAPPED = -Wl,--wrap=sqrt
+CUNIT_DIR = ../cunit
 
 .PHONY: default all clean test_unit_all
 
@@ -14,15 +14,18 @@ all: default
 test_unit_all: test_my_sqrt.out
 	./test_my_sqrt.out
 
-test_my_sqrt.out: my_sqrt.o test_my_sqrt.o mock_sqrt.o
-	${CC} -o $@ $^ $(LIBS) $(WRAPPED)
+test_my_sqrt.out: my_sqrt.o test_my_sqrt.o mock_sqrt.o cunit.o
+	${CC} -o $@ $^ $(LIBS) -Wl,--wrap=sqrt
 
 my_sqrt.o: $(SRC_DIR)/my_sqrt.c $(SRC_DIR)/my_sqrt.h
 	${CC} -c -o $@ $< ${CFLAGS}
 
-test_my_sqrt.o: test_my_sqrt.c
+test_my_sqrt.o: test_my_sqrt.c mock_sqrt.h
 
 mock_sqrt.o: mock_sqrt.c
 
+cunit.o: $(CUNIT_DIR)/cunit.c $(CUNIT_DIR)/cunit.h
+	${CC} -c -o $@ $< ${CFLAGS}
+
 clean:
 	-rm -f *.o *.out
diff --git a/tests/unit_tests/mock_sqrt.c b/tests/unit_tests/mock_sqrt.c
index 376b8b4..2c04e79 100644
--- a/tests/unit_tests/mock_sqrt.c
+++ b/tests/unit_tests/mock_sqrt.c
@@ -1,4 +1,6 @@
-static short x = 0;
+static double test_x = 0;
+static double test_sqrt_x = 0;
+static double test_x_input = 0;
 
 /**
  * Mocks sqrt function.
@@ -6,5 +8,16 @@ static short x = 0;
  * Requires '-Wl,--wrap=sqrt' flag when linking.
  */
 double __wrap_sqrt(double x) {
-    return 1.0f;
+    test_x_input = x;
+    return test_sqrt_x;
 }
+
+void mock_sqrt_setup(double x, double sqrt_x) {
+    test_x = x;
+    test_sqrt_x = sqrt_x;
+}
+
+void mock_sqrt_get(double *x, double *sqrt_x) {
+    *x = test_x_input;
+    *sqrt_x = test_sqrt_x;
+}
\ No newline at end of file
diff --git a/tests/unit_tests/mock_sqrt.h b/tests/unit_tests/mock_sqrt.h
new file mode 100644
index 0000000..0f64be5
--- /dev/null
+++ b/tests/unit_tests/mock_sqrt.h
@@ -0,0 +1,3 @@
+// mock_sqrt.h
+void mock_sqrt_setup(double x, double sqrt_x);
+void mock_sqrt_get(double *x, double *sqrt_x);
\ No newline at end of file
diff --git a/tests/unit_tests/test_my_sqrt.c b/tests/unit_tests/test_my_sqrt.c
index aaad03a..54ed2a6 100644
--- a/tests/unit_tests/test_my_sqrt.c
+++ b/tests/unit_tests/test_my_sqrt.c
@@ -1,23 +1,77 @@
 #include <stdio.h>
 #include "../../src/my_sqrt.h"
+#include "../cunit/cunit.h"
+#include "mock_sqrt.h"
+
+void test_my_sqrt_4_returns_2() {
+    int my_sqrt_error = 0;
+    double mock_x_in = 4.0f;
+    double mock_x_out = 2.0f;
+    double passed_x_in = 0;
+    double passed_x_out = 0;
+    double x_out = 0;
+
+    mock_sqrt_setup(mock_x_in, mock_x_out);
+
+    my_sqrt_error = my_sqrt(mock_x_in, &x_out);
+
+    mock_sqrt_get(&passed_x_in, &passed_x_out);
+
+    assert_eq("my_sqrt returned error", 0, my_sqrt_error);
+    assert_feq("mock_sqrt did not get right argument", passed_x_in, mock_x_in);
+    assert_feq("my_sqrt modified mock_sqrt return value", passed_x_out, x_out);
+}
+
+void test_my_sqrt_nan_has_error() {
+    int my_sqrt_error = 0;
+    double x_in = NAN;
+    double x_out = 0;
+
+    mock_sqrt_setup(0, 0);
+
+    my_sqrt_error = my_sqrt(x_in, &x_out);
+
+    assert_neq("my_sqrt didn't return error", 0, my_sqrt_error);
+}
+
+void test_my_sqrt_inf_has_error() {
+    int my_sqrt_error = 0;
+    double x_in = INFINITY;
+    double x_out = 0;
+
+    mock_sqrt_setup(0, 0);
+
+    my_sqrt_error = my_sqrt(x_in, &x_out);
+
+    assert_neq("my_sqrt didn't return error", 0, my_sqrt_error);
+}
+
+void test_my_sqrt_negative_returns_nan_and_sqrt_not_called() {
+    int my_sqrt_error = 0;
+    double x_in = -1.0f;
+    double x_out = 0;
+
+    mock_sqrt_setup(0, 0); // zero will be returned if mock_sqrt called
+
+    my_sqrt_error = my_sqrt(x_in, &x_out);
+
+    assert_eq("my_sqrt returned error", 0, my_sqrt_error);
+    assert_true("Expected NAN", isnan(x_out));
+}
 
 /**
- * TODO: This is a work in progress.
- *
- * Currently this shows that my_sqrt's sqrt() function has been mocked.
- * It will always return 1, instead of computing the correct value of 2.
+ * Test my_sqrt by mocking the math library sqrt() function.
  */
 int main(int argc, char *argv[]) {
     int error = 0;
-    int my_sqrt_error = 0;
-    double x = 4.0f;
-    double out = 0;
 
-    printf("Hello!\n");
+    // init cunit
+    cunit_init();
 
-    my_sqrt_error = my_sqrt(x, &out);
-    printf("my_sqrt_error: %d\n", my_sqrt_error);
-    printf("Computed value: %f\n", out);
+    test_my_sqrt_4_returns_2();
+    test_my_sqrt_nan_has_error();
+    test_my_sqrt_inf_has_error();
+    test_my_sqrt_negative_returns_nan_and_sqrt_not_called();
 
     return error;
 }
-- 
GitLab