diff test/callback_suite/do_test.c @ 0:3e629dc19168

initial from svn dyncall-1745
author Daniel Adler
date Thu, 19 Mar 2015 22:24:28 +0100
parents
children f5577f6bf97a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/callback_suite/do_test.c	Thu Mar 19 22:24:28 2015 +0100
@@ -0,0 +1,128 @@
+/*
+
+ Package: dyncall
+ Library: test
+ File: test/callback_suite/do_test.c
+ Description: 
+ License:
+
+   Copyright (c) 2011-2015 Daniel Adler <dadler@uni-goettingen.de>,
+                           Tassilo Philipp <tphilipp@potion-studios.com>
+
+   Permission to use, copy, modify, and distribute this software for any
+   purpose with or without fee is hereby granted, provided that the above
+   copyright notice and this permission notice appear in all copies.
+
+   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+*/
+
+#include <assert.h>
+#include "_auto_config.h"
+#include "invokers.h"
+#include "dyncall_callback.h"
+#include "sigstrings.h"
+#include "signature_utils.h"
+#include "env.h"
+#include "print.h"
+#include "../common/platformInit.h"
+
+int CompareValues(char type, DCValue* a, DCValue* b)
+{
+  int isequal = 0;
+  switch(type) 
+  {
+    case DC_SIGCHAR_BOOL:      isequal = (a->B == b->B) ? 1 : 0 ; break;
+    case DC_SIGCHAR_CHAR:      isequal = (a->c == b->c) ? 1 : 0 ; break;
+    case DC_SIGCHAR_UCHAR:     isequal = (a->C == b->C) ? 1 : 0 ; break;
+    case DC_SIGCHAR_SHORT:     isequal = (a->s == b->s) ? 1 : 0 ; break;
+    case DC_SIGCHAR_USHORT:    isequal = (a->S == b->S) ? 1 : 0 ; break;
+    case DC_SIGCHAR_INT:       isequal = (a->i == b->i) ? 1 : 0 ; break;
+    case DC_SIGCHAR_UINT:      isequal = (a->I == b->I) ? 1 : 0 ; break;
+    case DC_SIGCHAR_LONG:      isequal = (a->j == b->j) ? 1 : 0 ; break;
+    case DC_SIGCHAR_ULONG:     isequal = (a->J == b->J) ? 1 : 0 ; break;
+    case DC_SIGCHAR_LONGLONG:  isequal = (a->l == b->l) ? 1 : 0 ; break;
+    case DC_SIGCHAR_ULONGLONG: isequal = (a->L == b->L) ? 1 : 0 ; break;
+    case DC_SIGCHAR_FLOAT:     isequal = (a->f == b->f) ? 1 : 0 ; break;
+    case DC_SIGCHAR_DOUBLE:    isequal = (a->d == b->d) ? 1 : 0 ; break;
+    case DC_SIGCHAR_POINTER:   isequal = (a->p == b->p) ? 1 : 0 ; break;
+    default: assert(0);
+  }
+  return isequal;
+}
+
+int Compare(const char* signature)
+{
+  DCValue ref;
+  int total = 1;
+  int pos;
+  int isequal;
+  char ch;
+
+  /* skip prefix */
+
+  signature = SignatureSkipCallPrefix(signature);
+
+  /* check arguments */
+
+  pos = 0;
+
+  for(;;) {
+
+    ch  = *signature++;
+    
+    if (ch == DC_SIGCHAR_ENDARG) break;
+    GetReferenceArg(&ref, ch, pos);
+    isequal = CompareValues( ch, &ref, &Args[pos] );
+    if ( !isequal ) {
+      if (OptionVerbose) { total = 0; fprintf(stdout, " @%d[%c] ", pos, ch); }
+      else return 0;
+    }
+    ++ pos;
+  }
+    
+  ch  = *signature++;
+
+  /* check result */
+
+  GetReferenceResult(&ref, ch);
+
+  isequal = CompareValues(ch, &ref, &Result);
+  if (!isequal) {
+    if (OptionVerbose) { total = 0; fprintf(stdout, " @-1 "); }
+    else return 0;
+  }
+
+  return total;
+}
+
+
+extern DCCallbackHandler handler; /* see handler.c for implementation */
+
+int DoTest(int id)
+{
+  int index, result;
+  const char* signature;
+  DCCallback* pcb;
+
+  assert( id > 0 && id <= CONFIG_NSIGS );
+  index = id - 1;
+  
+  signature = GetSignature(index);
+  PrintCaseInfo(id,signature);
+
+  pcb = dcbNewCallback( signature, handler, (void*) signature );
+  assert(pcb != NULL);
+  DoInvoke(index, (void*) pcb);
+  result = Compare(signature); 
+  PrintCaseResult(result);
+  dcbFreeCallback(pcb);
+  return result;
+}
+