From 68c105b48c6b56189ccac3408578d090e3628c31 Mon Sep 17 00:00:00 2001 From: David Brown Date: Tue, 13 Sep 2016 19:44:01 +0100 Subject: [PATCH] Add tests for ENTIER. --- src/system/SYSTEM.h | 18 +++++++-------- src/test/confidence/language/TestLanguage.mod | 23 +++++++++++++++++++ 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/system/SYSTEM.h b/src/system/SYSTEM.h index fa63a9ab..d5f53efa 100644 --- a/src/system/SYSTEM.h +++ b/src/system/SYSTEM.h @@ -144,15 +144,6 @@ static inline int64 __RF(uint64 i, uint64 ub) {if (i >= ub) {__HALT(-8);} return -// Run time system routines in SYSTEM.c - - -extern void SYSTEM_INHERIT(LONGINT *t, LONGINT *t0); -extern void SYSTEM_ENUMP (void *adr, LONGINT n, void (*P)()); -extern void SYSTEM_ENUMR (void *adr, LONGINT *typ, LONGINT size, LONGINT n, void (*P)()); -extern LONGINT SYSTEM_ENTIER (double x); - - // Signal handling in SYSTEM.c #ifndef _WIN32 @@ -223,8 +214,9 @@ extern int64 SYSTEM_MOD(int64 x, int64 y); #define __MOD(x, y) (((x)>0 && (y)>0) ? (x)%(y) : __MODF(x, y)) +extern LONGINT SYSTEM_ENTIER (double x); +#define __ENTIER(x) SYSTEM_ENTIER(x) -#define __ENTIER(x) SYSTEM_ENTIER(x) #define __ABS(x) (((x)<0)?-(x):(x)) @@ -237,6 +229,7 @@ static inline double SYSTEM_ABSD(double i) {return i >= 0.0 ? i : -i;} #define __CAP(ch) ((CHAR)((ch)&0x5f)) #define __ODD(x) ((x)&1) + #define __IN(x, s) ((x)>=0 && (x)<(8*sizeof(SET)) && ((((uSET)(s))>>(x))&1)) #define __SETOF(x) ((SET)1<<(x)) #define __SETRNG(l, h) ((~(SET)0<<(l))&~(SET)0>>(8*sizeof(SET)-1-(h))) @@ -297,6 +290,11 @@ extern SYSTEM_PTR SYSTEM_NEWARR(LONGINT*, LONGINT, int, int, int, ...); /* Type handling */ +extern void SYSTEM_INHERIT(LONGINT *t, LONGINT *t0); +extern void SYSTEM_ENUMP (void *adr, LONGINT n, void (*P)()); +extern void SYSTEM_ENUMR (void *adr, LONGINT *typ, LONGINT size, LONGINT n, void (*P)()); + + #define __TDESC(t, m, n) \ static struct t##__desc { \ LONGINT tproc[m]; /* Proc for each ptr field */ \ diff --git a/src/test/confidence/language/TestLanguage.mod b/src/test/confidence/language/TestLanguage.mod index 6ae8c9e7..7399b006 100644 --- a/src/test/confidence/language/TestLanguage.mod +++ b/src/test/confidence/language/TestLanguage.mod @@ -2,6 +2,8 @@ MODULE TestLanguage; IMPORT SYSTEM, Console; + VAR gz: LONGREAL; + PROCEDURE TestShiftResult(of, by, actual, expected: LONGINT; msg: ARRAY OF CHAR); BEGIN IF actual # expected THEN @@ -236,6 +238,26 @@ END Abs; +(* LR does nothing numerically, but is enough to stop the C compiler + optimizing away the LR assignment and ENTIER implementation. *) +PROCEDURE LR(lr: LONGREAL): LONGREAL; BEGIN RETURN lr + gz; END LR; + +PROCEDURE Entier; + VAR lr: LONGREAL; +BEGIN + gz := 0.0; + lr := LR(-0.01); TestValue(ENTIER(lr), -1, "ENTIER(-0.01"); + lr := LR( 0.00); TestValue(ENTIER(lr), 0, "ENTIER(0.00"); + lr := LR( 5.00); TestValue(ENTIER(lr), 5, "ENTIER(5.00"); + lr := LR( 5.50); TestValue(ENTIER(lr), 5, "ENTIER(5.50"); + lr := LR( 5.99); TestValue(ENTIER(lr), 5, "ENTIER(5.99"); + lr := LR(-5.00); TestValue(ENTIER(lr), -5, "ENTIER(-5.00"); + lr := LR(-5.50); TestValue(ENTIER(lr), -6, "ENTIER(-5.50"); + lr := LR(-5.99); TestValue(ENTIER(lr), -6, "ENTIER(-5.99"); +END Entier; + + + PROCEDURE IntSize; VAR l: LONGINT; @@ -271,5 +293,6 @@ BEGIN DivMod; IntSize; Abs; + Entier; Console.String("Language tests successful."); Console.Ln; END TestLanguage.