[Gnucash-changes] initial checkin -- automated numeric test

Linas Vepstas linas at cvs.gnucash.org
Fri Jun 25 18:15:57 EDT 2004


Log Message:
-----------
initial checkin -- automated numeric test

Added Files:
-----------
    gnucash/src/engine/test:
        test-numeric.c

Revision Data
-------------
--- /dev/null
+++ src/engine/test/test-numeric.c
@@ -0,0 +1,265 @@
+
+/* Test file created by Linas Vepstas <linas at linas.org>
+ * Review operation of the gnc-numeric tools by verifying results
+ * of vairous operations.
+ *
+ * June 2004
+ * License: GPL
+ */
+
+#include <ctype.h>
+#include <glib.h>
+
+#include "gnc-module.h"
+#include "test-stuff.h"
+#include "test-engine-stuff.h"
+#include "gnc-numeric.h"
+
+
+
+static char *
+gnc_numeric_print(gnc_numeric in) {
+  char * retval;
+  if(gnc_numeric_check(in)) {
+    retval = g_strdup_printf("<ERROR> [%lld / %lld]",
+                             (long long int) in.num,
+                             (long long int) in.denom); 
+  }
+  else {
+    retval = g_strdup_printf("[%lld / %lld]",
+                             (long long int) in.num,
+                             (long long int) in.denom); 
+  }
+  return retval;
+}
+
+static void
+check_binary_op (gnc_numeric expected, 
+                 gnc_numeric actual, 
+					  gnc_numeric input_a, 
+					  gnc_numeric input_b, 
+					  const char * errmsg)
+{
+	char *e = gnc_numeric_print (expected);
+	char *r = gnc_numeric_print (actual);
+	char *a = gnc_numeric_print (input_a);
+	char *b = gnc_numeric_print (input_b);
+	char * str = g_strdup_printf (errmsg, e,r,a,b);
+	
+	do_test (gnc_numeric_eq(expected, actual), str);
+	
+	g_free (a);
+	g_free (b);
+	g_free (r);
+	g_free (e);
+	g_free (str);
+}
+
+#ifdef XXX_GNC_NUMERIC_TEST
+int
+main(int argc, char ** argv) {
+  gnc_numeric a = gnc_numeric_create(1, 3);
+  gnc_numeric b = gnc_numeric_create(1, 4);
+  gnc_numeric c;
+  gnc_numeric d = gnc_numeric_create(1, 2);
+  
+  gnc_numeric err;
+  int i;
+  gint64 v;
+
+  printf("add 100ths (banker's): %s + %s = %s\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(gnc_numeric_add(a, b, 100,
+                                           GNC_RND_ROUND)));
+  
+  c = gnc_numeric_add_with_error(a, b, 100, GNC_RND_ROUND, &err);
+  printf("add 100ths/error : %s + %s = %s + (error) %s\n\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(c),
+         gnc_numeric_print(err));
+  
+  printf("sub exact : %s - %s = %s\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(gnc_numeric_sub(a, b, GNC_DENOM_AUTO, 
+                                           GNC_DENOM_EXACT)));
+  
+  printf("sub least : %s - %s = %s\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(gnc_numeric_sub(a, b, 
+                                           GNC_DENOM_AUTO, 
+                                           GNC_DENOM_REDUCE)));
+  
+  printf("sub 100ths : %s - %s = %s\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(gnc_numeric_sub(a, b, 100,
+                                           GNC_RND_ROUND)));
+  
+  c = gnc_numeric_sub_with_error(a, b, 100, GNC_RND_FLOOR, &err);
+  printf("sub 100ths/error : %s - %s = %s + (error) %s\n\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(c),
+         gnc_numeric_print(err));
+  
+  printf("mul exact : %s * %s = %s\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(gnc_numeric_mul(a, b, GNC_DENOM_AUTO, 
+                                           GNC_DENOM_EXACT)));
+
+  printf("mul least : %s * %s = %s\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(gnc_numeric_mul(a, b, GNC_DENOM_AUTO, 
+                                           GNC_DENOM_REDUCE)));
+  
+  printf("mul 100ths : %s * %s = %s\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(gnc_numeric_mul(a, b, 100,
+                                           GNC_RND_ROUND)));
+
+  c = gnc_numeric_mul_with_error(a, b, 100, GNC_RND_ROUND, &err);
+  printf("mul 100ths/error : %s * %s = %s + (error) %s\n\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(c),
+         gnc_numeric_print(err));
+  
+  printf("div exact : %s / %s = %s\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(gnc_numeric_div(a, b, GNC_DENOM_AUTO, 
+                                           GNC_DENOM_EXACT)));
+  
+  printf("div least : %s / %s = %s\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(gnc_numeric_div(a, b, GNC_DENOM_AUTO, 
+                                           GNC_DENOM_REDUCE)));
+  
+  printf("div 100ths : %s / %s = %s\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(gnc_numeric_div(a, b, 100,
+                                           GNC_RND_ROUND)));  
+  
+  c = gnc_numeric_div_with_error(a, b, 100, GNC_RND_ROUND, &err);
+  printf("div 100ths/error : %s / %s = %s + (error) %s\n\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(c),
+         gnc_numeric_print(err));
+  
+  printf("7/16 as float: %e\n",
+         gnc_numeric_to_double(gnc_numeric_create(7, 16)));
+  
+  printf("7/16 as 100ths (floor): %s\n",
+         gnc_numeric_print(gnc_numeric_convert(gnc_numeric_create(7, 16),
+                                               100, GNC_RND_FLOOR)));
+  printf("7/16 as 100ths (ceil): %s\n",
+         gnc_numeric_print(gnc_numeric_convert(gnc_numeric_create(7, 16),
+                                               100, GNC_RND_CEIL)));
+  printf("7/16 as 100ths (trunc): %s\n",
+         gnc_numeric_print(gnc_numeric_convert(gnc_numeric_create(7, 16),
+                                               100, GNC_RND_TRUNC)));
+  printf("7/16 as 100ths (round): %s\n",
+         gnc_numeric_print(gnc_numeric_convert(gnc_numeric_create(7, 16),
+                                               100, GNC_RND_ROUND)));
+
+  printf("1511/1000 as 1/100 (round): %s\n",
+         gnc_numeric_print(gnc_numeric_convert(gnc_numeric_create(1511, 1000),
+                                               100, GNC_RND_ROUND)));
+  printf("1516/1000 as 1/100 (round): %s\n",
+         gnc_numeric_print(gnc_numeric_convert(gnc_numeric_create(1516, 1000),
+                                               100, GNC_RND_ROUND)));
+  printf("1515/1000 as 1/100 (round): %s\n",
+         gnc_numeric_print(gnc_numeric_convert(gnc_numeric_create(1515, 1000),
+                                               100, GNC_RND_ROUND)));
+  printf("1525/1000 as 1/100 (round): %s\n",
+         gnc_numeric_print(gnc_numeric_convert(gnc_numeric_create(1525, 1000),
+                                               100, GNC_RND_ROUND)));
+
+  printf("100023234 / 334216654 reduced: %s\n",
+         gnc_numeric_print(gnc_numeric_reduce(gnc_numeric_create(10023234LL,
+                                                                 334216654LL))));
+  printf("2^10*3^10*17^2 / 2^8*3^12 reduced: %s\n",
+         gnc_numeric_print
+         (gnc_numeric_reduce(gnc_numeric_create(17474724864LL,
+                                                136048896LL))));
+  printf("1024 / 1024^4 reduced: %s\n",
+         gnc_numeric_print
+         (gnc_numeric_reduce(gnc_numeric_create(1024LL,
+                                                1099511627776LL))));
+  printf("reducing 100,000 times:\n\n");
+  for(i = 0; i < 100000; i++) {
+    gnc_numeric_reduce(gnc_numeric_create(17474724864LL,
+                                          136048896LL));
+  }
+  
+  printf("add LCM: %s + %s = %s\n",
+         gnc_numeric_print(b), gnc_numeric_print(d),
+         gnc_numeric_print(gnc_numeric_add(b, d, GNC_DENOM_AUTO,
+                                           GNC_DENOM_LCD)));
+ 
+  printf("float to 6 sigfigs: %s\n",
+         gnc_numeric_print(double_to_gnc_numeric(1.1234567890123, 
+                                                 GNC_DENOM_AUTO, 
+                                                 GNC_DENOM_SIGFIGS(6) |
+                                                 GNC_RND_ROUND)));
+  printf("float to 6 sigfigs: %s\n",
+         gnc_numeric_print(double_to_gnc_numeric(.011234567890123, 
+                                                 GNC_DENOM_AUTO, 
+                                                 GNC_DENOM_SIGFIGS(6) |
+                                                 GNC_RND_ROUND)));
+  printf("float to 6 sigfigs: %s\n",
+         gnc_numeric_print(double_to_gnc_numeric(1123.4567890123, 
+                                                 GNC_DENOM_AUTO, 
+                                                 GNC_DENOM_SIGFIGS(6) |
+                                                 GNC_RND_ROUND)));
+  printf("float to 6 sigfigs: %s\n",
+         gnc_numeric_print(double_to_gnc_numeric(1.1234567890123e-5, 
+                                                 GNC_DENOM_AUTO, 
+                                                 GNC_DENOM_SIGFIGS(6) |
+                                                 GNC_RND_ROUND)));
+  printf("add to 4 sigfigs: %s + %s = %s\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(gnc_numeric_add(a, b, 
+                                           GNC_DENOM_AUTO, 
+                                           GNC_DENOM_SIGFIGS(4) |
+                                           GNC_RND_ROUND)));
+  
+   
+  v = 1000000;
+  a = gnc_numeric_create(1*v, v);
+  b = gnc_numeric_create(10000000*v, v);
+  printf("multiply (LCD): %s * %s = %s\n",
+	 gnc_numeric_print(a), gnc_numeric_print(b),
+	 gnc_numeric_print(gnc_numeric_mul(a, b, GNC_DENOM_AUTO, GNC_DENOM_LCD)));
+
+
+  return 0;
+}
+#endif
+
+static void
+run_test (void)
+{
+  gnc_numeric a = gnc_numeric_create(1, 3);
+  gnc_numeric b = gnc_numeric_create(1, 4);
+
+  check_binary_op (gnc_numeric_create(9,12), 
+                   gnc_numeric_add(a, b, GNC_DENOM_AUTO, GNC_DENOM_EXACT),
+						 a, b, "expected %s got %s = %s + %s for add exact");
+  
+}
+
+static void
+main_helper (void *closure, int argc, char **argv)
+{
+  g_log_set_always_fatal( G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING );
+  do_test((NULL!=gnc_module_load("gnucash/engine", 0)), "couldn't load engine");
+
+  run_test ();
+
+  print_test_results();
+  exit(get_rv());
+}
+
+int
+main (int argc, char **argv)
+{
+  scm_boot_guile(argc, argv, main_helper, NULL);
+  return 0;
+}


More information about the gnucash-changes mailing list