📄 regression.c
字号:
/************************************************************************* * Regression test */#include "triodef.h"#if defined(TRIO_COMPILER_ANCIENT)# include <varargs.h>#else# include <stdarg.h>#endif#include <math.h>#include <limits.h>#include <float.h>#include <errno.h>#include "trio.h"#include "triop.h"#if defined(TRIO_EMBED_NAN)# define TRIO_PUBLIC_NAN static# define TRIO_FUNC_NINF# define TRIO_FUNC_PINF# define TRIO_FUNC_NAN# define TRIO_FUNC_ISINF# define TRIO_FUNC_ISNAN# if TRIO_FEATURE_FLOAT# define TRIO_FUNC_NZERO# endif#endif#include "trionan.h"#if defined(TRIO_EMBED_STRING)# define TRIO_PUBLIC_STRING static# define TRIO_FUNC_EQUAL_CASE#endif#include "triostr.h"#undef printf#if TRIO_FEATURE_WIDECHAR# include <wchar.h>#endif#define QUOTE(x) #x#define DOUBLE_EQUAL(x,y) (((x)>(y)-DBL_EPSILON) && ((x)<(y)+DBL_EPSILON))#define FLOAT_EQUAL(x,y) (((x)>(y)-FLT_EPSILON) && ((x)<(y)+FLT_EPSILON))static TRIO_CONST char rcsid[] = "@(#)$Id: regression.c,v 1.54 2005/12/25 11:06:57 breese Exp $";#if defined(TRIO_EMBED_NAN)# include "trionan.c"#endif#if defined(TRIO_EMBED_STRING)# include "triostr.c"#endif/************************************************************************* * */static voidDumpTRIO_ARGS2((buffer, rc), char *buffer, int rc){ if (rc < 0) { printf("Err = %d (%s), Pos = %d\n", TRIO_ERROR_CODE(rc), TRIO_ERROR_NAME(rc), TRIO_ERROR_POSITION(rc)); } else if (buffer) printf("buffer[% 3d] = \"%s\"\n", rc, buffer);}/************************************************************************* * */static voidReport0TRIO_ARGS2((file, line), TRIO_CONST char *file, int line){ printf("Verification failed in %s:%d.\n", file, line);}/************************************************************************* * */static voidReportTRIO_ARGS4((file, line, expected, got), TRIO_CONST char *file, int line, TRIO_CONST char *expected, TRIO_CONST char *got){ Report0(file, line); printf(" Expected \"%s\"\n", expected); printf(" Got \"%s\"\n", got);}/************************************************************************* * */intVerifyTRIO_VARGS5((file, line, result, fmt, va_alist), TRIO_CONST char *file, int line, TRIO_CONST char *result, TRIO_CONST char *fmt, TRIO_VA_DECL){ int rc; va_list args; char buffer[4096]; TRIO_VA_START(args, fmt); rc = trio_vsnprintf(buffer, sizeof(buffer), fmt, args); if (rc < 0) Dump(buffer, rc); TRIO_VA_END(args); if (!trio_equal_case(result, buffer)) { Report(file, line, result, buffer); return 1; } return 0;}/************************************************************************* * */intVerifyReturnValues(TRIO_NOARGS){ int nerrors = 0; int rc; int count; char *expected; char buffer[4096]; char result[4096]; rc = trio_sprintf(buffer, "%s%n", "0123456789", &count); trio_sprintf(result, "%d %d %s", rc, count, buffer); expected = "10 10 0123456789"; if (!trio_equal_case(result, expected)) { nerrors++; Report(__FILE__, __LINE__, expected, result); } rc = trio_snprintf(buffer, sizeof(buffer), "%s%n", "0123456789", &count); trio_sprintf(result, "%d %d %s", rc, count, buffer); expected = "10 10 0123456789"; if (!trio_equal_case(result, expected)) { nerrors++; Report(__FILE__, __LINE__, expected, result); } rc = trio_snprintf(buffer, 4, "%s%n", "0123456789", &count); trio_sprintf(result, "%d %d %s", rc, count, buffer); expected = "10 3 012"; if (!trio_equal_case(result, expected)) { nerrors++; Report(__FILE__, __LINE__, expected, result); } /* The output buffer contains the empty string */ rc = trio_snprintf(buffer, 1, "%s%n", "0123456789", &count); trio_sprintf(result, "%d %d %s", rc, count, buffer); expected = "10 0 "; if (!trio_equal_case(result, expected)) { nerrors++; Report(__FILE__, __LINE__, expected, result); } /* The output buffer should be left untouched when max size is 0 */ trio_sprintf(buffer, "DO NOT TOUCH"); rc = trio_snprintf(buffer, 0, "%s%n", "0123456789", &count); trio_sprintf(result, "%d %d %s", rc, count, buffer); expected = "10 0 DO NOT TOUCH"; if (!trio_equal_case(result, expected)) { nerrors++; Report(__FILE__, __LINE__, expected, result); } return nerrors;}/************************************************************************* * */#define TEST_STRING "0123456789"intVerifyAllocate(TRIO_NOARGS){ int nerrors = 0;#if TRIO_FEATURE_DYNAMICSTRING int rc; char *string; int count; int test_size = sizeof(TEST_STRING) - 1; /* Allocate a string with the result */ rc = trio_asprintf(&string, "%s%n", TEST_STRING, &count); if (rc < 0) { nerrors++; Dump(string, rc); } else if (count != test_size) { nerrors++; printf("Validation failed in %s:%d\n", __FILE__, __LINE__); printf(" Expected %%n = %d\n", test_size); printf(" Got %%n = %d\n", count); } else if (!trio_equal_case(string, TEST_STRING)) { nerrors++; Report(__FILE__, __LINE__, TEST_STRING, string); } if (string) free(string);#endif return nerrors;}/************************************************************************* * */intVerifyFormatting(TRIO_NOARGS){ int nerrors = 0; char buffer[256]; /* Normal text */ nerrors += Verify(__FILE__, __LINE__, "Hello world", "Hello world"); /* String */ nerrors += Verify(__FILE__, __LINE__, "Hello world", "%s", "Hello world"); /* Pointer */ if (sizeof(void *) == 4) { nerrors += Verify(__FILE__, __LINE__, "Pointer 0x01234567", "Pointer %p", 0x1234567); } else if (sizeof(void *) == 8) { nerrors += Verify(__FILE__, __LINE__, "Pointer 0x0123456789012345", "Pointer %p", 0x123456789012345); } /* Nil pointer */ nerrors += Verify(__FILE__, __LINE__, "Pointer (nil)", "Pointer %p", NULL); /* Integer */ nerrors += Verify(__FILE__, __LINE__, "Number 42", "Number %d", 42); nerrors += Verify(__FILE__, __LINE__, "Number -42", "Number %d", -42); nerrors += Verify(__FILE__, __LINE__, "Number 42", "Number %ld", 42L); nerrors += Verify(__FILE__, __LINE__, "Number -42", "Number %ld", -42L); /* Integer width */ nerrors += Verify(__FILE__, __LINE__, " 1234", "%6d", 1234); nerrors += Verify(__FILE__, __LINE__, " 1234", "%*d", 6, 1234); /* Integer width overrun */ nerrors += Verify(__FILE__, __LINE__, "123456", "%4d", 123456); /* Integer precision */ nerrors += Verify(__FILE__, __LINE__, "0012", "%.4d", 12); nerrors += Verify(__FILE__, __LINE__, "0012", "%.*d", 4, 12); nerrors += Verify(__FILE__, __LINE__, " 0012", "%6.*d", 4, 12); nerrors += Verify(__FILE__, __LINE__, " 0012", "%*.*d", 6, 4, 12); nerrors += Verify(__FILE__, __LINE__, " 0012", "%*.*.*d", 6, 4, 2, 12); nerrors += Verify(__FILE__, __LINE__, " 0012", "%*.*.*i", 6, 4, 10, 12); /* Integer sign, zero-padding, and width */ nerrors += Verify(__FILE__, __LINE__, "+01234", "%+06d", 1234); nerrors += Verify(__FILE__, __LINE__, " 01234", "% 06d", 1234); nerrors += Verify(__FILE__, __LINE__, "+01234", "% +06d", 1234); /* Integer adjust, zero-padding, and width */ nerrors += Verify(__FILE__, __LINE__, "12 ", "%-08d", 12); /* Integer zero-padding, width, and precision */ nerrors += Verify(__FILE__, __LINE__, " 000012", "%08.6d", 12); /* Integer base */ nerrors += Verify(__FILE__, __LINE__, "42", "%u", 42); nerrors += Verify(__FILE__, __LINE__, "-1", "%d", -1); nerrors += Verify(__FILE__, __LINE__, "52", "%o", 42); nerrors += Verify(__FILE__, __LINE__, "052", "%#o", 42); nerrors += Verify(__FILE__, __LINE__, "0", "%#o", 0); nerrors += Verify(__FILE__, __LINE__, "2a", "%x", 42); nerrors += Verify(__FILE__, __LINE__, "2A", "%X", 42); nerrors += Verify(__FILE__, __LINE__, "0x2a", "%#x", 42); nerrors += Verify(__FILE__, __LINE__, "0X2A", "%#X", 42); nerrors += Verify(__FILE__, __LINE__, "0x00c ", "%-#6.3x", 12); nerrors += Verify(__FILE__, __LINE__, "", "%.d", 0); nerrors += Verify(__FILE__, __LINE__, "", "%#.d", 0); nerrors += Verify(__FILE__, __LINE__, "42", "%.d", 42); nerrors += Verify(__FILE__, __LINE__, "", "%.o", 0); nerrors += Verify(__FILE__, __LINE__, " 0000", "%8.4o", 0); nerrors += Verify(__FILE__, __LINE__, " 0", "%8o", 0); nerrors += Verify(__FILE__, __LINE__, "00000000", "%08o", 0); nerrors += Verify(__FILE__, __LINE__, "0", "%#.o", 0); nerrors += Verify(__FILE__, __LINE__, "52", "%.o", 42); nerrors += Verify(__FILE__, __LINE__, "", "%.x", 0); nerrors += Verify(__FILE__, __LINE__, "", "%#.x", 0); nerrors += Verify(__FILE__, __LINE__, "2a", "%.x", 42); sprintf(buffer, "%u", UINT_MAX); nerrors += Verify(__FILE__, __LINE__, buffer, "%u", -1); sprintf(buffer, "%x", UINT_MAX); nerrors += Verify(__FILE__, __LINE__, buffer, "%x", -1);#if TRIO_FEATURE_FLOAT /* Double */ nerrors += Verify(__FILE__, __LINE__, "3141.000000", "%f", 3141.0); nerrors += Verify(__FILE__, __LINE__, "3141.500000", "%f", 3141.5); nerrors += Verify(__FILE__, __LINE__, "3.141000e+03", "%e", 3141.0); nerrors += Verify(__FILE__, __LINE__, " -2.3420e-02", "%16.4e", -2.342E-02); nerrors += Verify(__FILE__, __LINE__, " -2.3420e-22", "%16.4e", -2.342E-22); nerrors += Verify(__FILE__, __LINE__, " 2.3420e-02", "% 16.4e", 2.342E-02); nerrors += Verify(__FILE__, __LINE__, " 2.3420e-02", "% 1.4e", 2.342E-02); nerrors += Verify(__FILE__, __LINE__, "3.141000E-44", "%E", 3.141e-44); nerrors += Verify(__FILE__, __LINE__, "0", "%g", 0.0); nerrors += Verify(__FILE__, __LINE__, "-0", "%g", trio_nzero()); nerrors += Verify(__FILE__, __LINE__, "3141.5", "%g", 3141.5); nerrors += Verify(__FILE__, __LINE__, "3.1415E-06", "%G", 3.1415e-6); nerrors += Verify(__FILE__, __LINE__, "+3141.000000", "%+f", 3141.0); nerrors += Verify(__FILE__, __LINE__, "-3141.000000", "%+f", -3141.0); nerrors += Verify(__FILE__, __LINE__, "0.333333", "%f", 1.0/3.0); nerrors += Verify(__FILE__, __LINE__, "0.666667", "%f", 2.0/3.0); /* Beyond accuracy */ nerrors += Verify(__FILE__, __LINE__, "0.000000", "%f", 1.234567890123456789e-20);# if defined(TRIO_BREESE) nerrors += Verify(__FILE__, __LINE__, "1.3999999999999999111821580299875", "%.32g", 1.4); nerrors += Verify(__FILE__, __LINE__, "1.39999999999999991118215802998748", "%.32f", 1.4); nerrors += Verify(__FILE__, __LINE__, "1.3999999999999999111821580300", "%.28f", 1.4); nerrors += Verify(__FILE__, __LINE__, "1.399999999999999911182158", "%.24f", 1.4); nerrors += Verify(__FILE__, __LINE__, "1.39999999999999991", "%.17f", 1.4); nerrors += Verify(__FILE__, __LINE__, "1.40000000000000", "%.14f", 1.4); nerrors += Verify(__FILE__, __LINE__, "39413.800000000002910383045673370361", "%.30f", 39413.80);# endif /* 2^-1 + 2^-15 */ nerrors += Verify(__FILE__, __LINE__, "0.500030517578125", "%.*g", DBL_DIG + 10, 0.500030517578125); /* Double decimal point */ nerrors += Verify(__FILE__, __LINE__, "3141", "%.0f", 3141.0); nerrors += Verify(__FILE__, __LINE__, "3142", "%.0f", 3141.5); nerrors += Verify(__FILE__, __LINE__, "3141", "%.f", 3141.0); nerrors += Verify(__FILE__, __LINE__, "12", "%.f", 12.34); nerrors += Verify(__FILE__, __LINE__, "3141.000", "%.3f", 3141.0); nerrors += Verify(__FILE__, __LINE__, "3141.000000", "%#f", 3141.0); nerrors += Verify(__FILE__, __LINE__, "0.0000", "%#.4f", 0.0); nerrors += Verify(__FILE__, __LINE__, "0.000", "%#.4g", 0.0); nerrors += Verify(__FILE__, __LINE__, "0.001000", "%#.4g", 1e-3); nerrors += Verify(__FILE__, __LINE__, "3141.0000", "%#.4f", 3141.0); nerrors += Verify(__FILE__, __LINE__, "3141.", "%#.0f", 3141.0); nerrors += Verify(__FILE__, __LINE__, "3141.", "%#.f", 3141.0); nerrors += Verify(__FILE__, __LINE__, "11.0000", "%#.4f", 11.0); nerrors += Verify(__FILE__, __LINE__, "100.00", "%.2f", 99.9999); nerrors += Verify(__FILE__, __LINE__, "3e+03", "%.e", 3141.0); nerrors += Verify(__FILE__, __LINE__, "3.e+03", "%#.e", 3141.0); nerrors += Verify(__FILE__, __LINE__, "1.23457e+06", "%g", 1234567.0); nerrors += Verify(__FILE__, __LINE__, "1e+02", "%.2g", 99.9999); nerrors += Verify(__FILE__, __LINE__, "1.0e+02", "%#.2g", 99.9999); nerrors += Verify(__FILE__, __LINE__, "0.123", "%0g", 0.123); nerrors += Verify(__FILE__, __LINE__, "1.00e+00", "%.2e", 0.9999); nerrors += Verify(__FILE__, __LINE__, "1", "%.2g", 0.9999); nerrors += Verify(__FILE__, __LINE__, "2", "%.0g", 1.5); nerrors += Verify(__FILE__, __LINE__, "2", "%.g", 1.5); nerrors += Verify(__FILE__, __LINE__, "0.01", "%.2g", 0.01); nerrors += Verify(__FILE__, __LINE__, "0.010", "%#.2g", 0.01); nerrors += Verify(__FILE__, __LINE__, "1e-04", "%5.g", 0.999999e-4); /* Double width and precision */ nerrors += Verify(__FILE__, __LINE__, " 1e-05", "%11.5g", 1e-5);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -