From 6e087ac758cc46592a54b00c5107feac4bda628b Mon Sep 17 00:00:00 2001
From: "Meredith L. Patterson" <clonearmy@gmail.com>
Date: Fri, 11 May 2012 21:05:49 +0100
Subject: [PATCH] Test harness macros extended. Need to implement bodies of
 primitive parsers.

---
 src/hammer.c     | 16 ++++++++--------
 src/test_suite.h | 35 ++++++++++++++++++++++++++---------
 2 files changed, 34 insertions(+), 17 deletions(-)

diff --git a/src/hammer.c b/src/hammer.c
index 7ab8c874..c8503979 100644
--- a/src/hammer.c
+++ b/src/hammer.c
@@ -441,10 +441,10 @@ parse_result_t* parse(const parser_t* parser, const uint8_t* input, size_t lengt
 #include "test_suite.h"
 
 static void test_token(void) {
-  //uint8_t test[3] = { '9', '5', 0xa2 };
-  //const parser_t *token_ = token(test , 3);
-  //parse_result_t *ret = parse(token_, test, 3);
-  // need a g_check_cmpstr function for this :P
+  uint8_t test[3] = { '9', '5', 0xa2 };
+  const parser_t *token_ = token(test , 3);
+  parse_result_t *ret = parse(token_, test, 3);
+  g_check_bytes((ret->ast)[0].bytes.len, (ret->ast)[0].bytes.token, ==, test);
 }
 
 static void test_ch(void) {
@@ -465,28 +465,28 @@ static void test_int64(void) {
   uint8_t test[8] = { 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00 };
   const parser_t *int64_ = int64();
   parse_result_t *ret = parse(int64_, test, 8);
-  g_check_cmpint((long long int)(ret->ast)[0].sint, ==, -8589934592L);
+  g_check_cmplong((ret->ast)[0].sint, ==, -8589934592L);
 }
 
 static void test_int32(void) {
   uint8_t test[4] = { 0xff, 0xfe, 0x00, 0x00 };
   const parser_t *int32_ = int32();
   parse_result_t *ret = parse(int32_, test, 4);
-  g_check_cmpint((long long int)(ret->ast)[0].sint, ==, -131072);
+  g_check_cmpint((ret->ast)[0].sint, ==, -131072);
 }
 
 static void test_int16(void) {
   uint8_t test[2] = { 0xfe, 0x00 };
   const parser_t *int16_ = int16();
   parse_result_t *ret = parse(int16_, test, 2);
-  g_check_cmpint((long long int)(ret->ast)[0].sint, ==, -512);
+  g_check_cmpint((ret->ast)[0].sint, ==, -512);
 }
 
 static void test_int8(void) {
   uint8_t test[1] = { 0x88 };
   const parser_t *int8_ = int8();
   parse_result_t *ret = parse(int8_, test, 1);
-  g_check_cmpint((long long int)(ret->ast)[0].sint, ==, -120);
+  g_check_cmpint((ret->ast)[0].sint, ==, -120);
 }
 
 static void test_uint64(void) {
diff --git a/src/test_suite.h b/src/test_suite.h
index 8cc3c090..630d655e 100644
--- a/src/test_suite.h
+++ b/src/test_suite.h
@@ -2,16 +2,33 @@
 #define HAMMER_TEST_SUITE__H
 
 // Equivalent to g_assert_*, but not using g_assert...
-#define g_check_cmpint(n1, op, n2) {			\
-  typeof (n1) _n1 = (n1);				\
-  typeof (n2) _n2 = (n2);				\
-  if (!(_n1 op _n2)) {					\
-    g_test_message("Check failed: (%s): (%lld %s %d)",	\
-		   #n1 " " #op " " #n2,			\
-		   _n1, #op, _n2);			\
-    g_test_fail();					\
-  }							\
+#define g_check_inttype(fmt, typ, n1, op, n2) {				\
+    typ _n1 = (n1);							\
+    typ _n2 = (n2);							\
+    if (!(_n1 op _n2)) {						\
+      g_test_message("Check failed: (%s): (" fmt " %s " fmt ")",	\
+		     #n1 " " #op " " #n2,				\
+		     _n1, #op, _n2);					\
+      g_test_fail();							\
+    }									\
   }
 
+#define g_check_bytes(len, n1, op, n2) {	\
+    const uint8_t *_n1 = (n1);			\
+    uint8_t *_n2 = (n2);			\
+    if (!(memcmp(_n1, _n2, len) op 0)) {	\
+      g_test_message("Check failed: (%s)",    	\
+		     #n1 " " #op " " #n2);	\
+      g_test_fail();				\
+    }						\
+  }
+
+#define g_check_cmpint(n1, op, n2) g_check_inttype("%d", int, n1, op, n2)
+#define g_check_cmplong(n1, op, n2) g_check_inttype("%ld", long, n1, op, n2)
+#define g_check_cmplonglong(n1, op, n2) g_check_inttype("%lld", long long, n1, op, n2)
+#define g_check_cmpuint(n1, op, n2) g_check_inttype("%u", unsigned int, n1, op, n2)
+#define g_check_cmpulong(n1, op, n2) g_check_inttype("%lu", unsigned long, n1, op, n2)
+#define g_check_cmpulonglong(n1, op, n2) g_check_inttype("%llu", unsigned long long, n1, op, n2)
+
 
 #endif // #ifndef HAMMER_TEST_SUITE__H
-- 
GitLab