text: /* ###
   * IP: GHIDRA
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   * 
   *      http://www.apache.org/licenses/LICENSE-2.0
   * 
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  #ifndef PCODE_TEST_H
  #define PCODE_TEST_H
  
  #include "types.h"
  
  #define TEST void
  #define MAIN void
  
  #ifdef HAS_GNU_ATTRIBUTES
  #define NOINLINE __attribute__ ((__noinline__))
  #define PACKED_STRUCTURE __attribute__((__packed__))
  #else
  #define NOINLINE
  #define PACKED_STRUCTURE
  #endif
  
  typedef i4 (*entryFunc)(i4 * val);
  typedef i4 (*breakOn)(void);
  typedef i4 (*testFuncPtr)(void);
  
  typedef struct PACKED_STRUCTURE FunctionInfo
  {
  	char *name;			/* Name of function, used in pcode test reporting */
  	testFuncPtr func;		/* Pointer to function */
  	i4 numTest;			/* Number of expected tests */
  } FunctionInfo;
  
  typedef struct PACKED_STRUCTURE TestInfo
  {
  	char id[8];			/* id constains a "Magic Number" which will allow us to find this in a binary */
  	u4 ptrSz;			/* how many bytes in a pointer? */
  	u4 byteOrder;			/* value 0x01020304 used to detect endianess */
  	breakOn onPass;			/* address of breakOnPass function, (where it goes on test pass) */
  	breakOn onError;		/* address of breakOnError function, (where it goes on test failure) */
  	breakOn onDone;			/* address of breakOnDone function, (where it goes when all test done) */
  	u4 numpass;			/* How many test passed */
  	u4 numfail;			/* How many test failed */
  	u4 lastTestPos;			/* Last test index number */
  	u4 lastErrorLine;		/* Line number of last error. */
  	char *lastErrorFile;		/* File name of last error. */
  	char *lastFunc;			/* Last function ran. */
  	void *sprintf5;			/* Our embedded sprintf function */
  	void *sprintf5buffer;		/* Buffer where our embedded sprintf write to */
  	u4 sprintf5Enabled;		/* Turn on off our embedded sprintf */
  	char *compilerVersion;		/* Compiler version info (gcc specific) */
  	char *name;			/* Test binary name */
  	char *ccflags;			/* Flags used to compile this */
  	char *buildDate;		/* when this was  compiled */
  	FunctionInfo *funcTable;	/* a function table */
  } TestInfo;
  
  typedef struct PACKED_STRUCTURE GroupInfo
  {
  	char id[8];			/* id constains a "Magic Number" which will allow us to find this in a binary */
  	FunctionInfo *funcTable;	/* Table of test functions in this group */
  } GroupInfo;
  
  void noteTestMain(const char *file, int line, const char *func);
  void assertI1(const char *file, int line, const char *func, i1 val, i1 expected);
  void assertI2(const char *file, int line, const char *func, i2 val, i2 expected);
  void assertI4(const char *file, int line, const char *func, i4 val, i4 expected);
  #ifdef HAS_LONGLONG
  void assertI8(const char *file, int line, const char *func, i8 val, i8 expected);
  #endif
  void assertU1(const char *file, int line, const char *func, u1 val, u1 expected);
  void assertU2(const char *file, int line, const char *func, u2 val, u2 expected);
  void assertU4(const char *file, int line, const char *func, u4 val, u4 expected);
  #ifdef HAS_LONGLONG
  void assertU8(const char *file, int line, const char *func, u8 val, u8 expected);
  #endif
  #ifdef HAS_FLOAT
  void assertF4(const char *file, int line, const char *func, f4 val, f4 expected);
  #endif
  #ifdef HAS_DOUBLE
  void assertF8(const char *file, int line, const char *func, f8 val, f8 expected);
  #endif
  NOINLINE i4 breakOnDone(const char *file, int line, const char *func);
  // NOINLINE void TestInfo_register(void);	/* Register a TestInfo */
  NOINLINE void TestInfo_reset(void);
  NOINLINE i4 breakOnSubDone(const char *file, int line, const char *func);
  
  #define ASSERTI1(val, exp)  assertI1(__FILE__, __LINE__, 0, val, exp);
  #define ASSERTI2(val, exp)  assertI2(__FILE__, __LINE__, 0, val, exp);
  #define ASSERTI4(val, exp)  assertI4(__FILE__, __LINE__, 0, val, exp);
  #define ASSERTI8(val, exp)  assertI8(__FILE__, __LINE__, 0, val, exp);
  #define ASSERTU1(val, exp)  assertU1(__FILE__, __LINE__, 0, val, exp);
  #define ASSERTU2(val, exp)  assertU2(__FILE__, __LINE__, 0, val, exp);
  #define ASSERTU4(val, exp)  assertU4(__FILE__, __LINE__, 0, val, exp);
  #define ASSERTU8(val, exp)  assertU8(__FILE__, __LINE__, 0, val, exp);
  #define ASSERTF4(val, exp)  assertF4(__FILE__, __LINE__, 0, val, exp);
  #define ASSERTF8(val, exp)  assertF8(__FILE__, __LINE__, 0, val, exp);
  
  #endif /* PCODE_TEST_H */
  
  