578 lines
17 KiB
C
578 lines
17 KiB
C
/*************************************************************************\
|
|
* Copyright (c) 2023 Karl Vestin
|
|
* EPICS BASE is distributed subject to a Software License Agreement found
|
|
* in file LICENSE that is included with this distribution.
|
|
\*************************************************************************/
|
|
|
|
#include "dbUnitTest.h"
|
|
#include "testMain.h"
|
|
#include "errlog.h"
|
|
#include "dbAccess.h"
|
|
|
|
void recTestIoc_registerRecordDeviceDriver(struct dbBase *);
|
|
|
|
static void test_double_percentile(void){
|
|
const char format_string[] = "Format test string %%d";
|
|
const char result_string[] = "Format test string %d";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 1);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_d_format(void){
|
|
const char format_string[] = "Format test string %d";
|
|
const char result_string[] = "Format test string 7";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 7);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_c_format(void){
|
|
const char format_string[] = "Format test string %c";
|
|
const char result_string[] = "Format test string R";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0, 82 is ASCII for R */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 82);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_i_format(void){
|
|
const char format_string[] = "Format test string %i";
|
|
const char result_string[] = "Format test string -27";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, -27);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_o_format(void){
|
|
const char format_string[] = "Format test string %o";
|
|
const char result_string[] = "Format test string 6777";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 06777);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_u_format(void){
|
|
const char format_string[] = "Format test string %u";
|
|
const char result_string[] = "Format test string 8009";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 8009);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_x_format(void){
|
|
const char format_string[] = "Format test string %x";
|
|
const char result_string[] = "Format test string fafa";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_LONG, 0xfafa);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_X_format(void){
|
|
const char format_string[] = "Format test string %X";
|
|
const char result_string[] = "Format test string BA";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 0x00ba);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_e_format(void){
|
|
const char format_string[] = "Format test string %e";
|
|
const char result_string[] = "Format test string -1.400000e+01";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, -14);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_E_format(void){
|
|
const char format_string[] = "Format test string %E";
|
|
const char result_string[] = "Format test string 1.992000E+03";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 1992);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_f_format(void){
|
|
const char format_string[] = "Format test string %f";
|
|
const char result_string[] = "Format test string -0.062000";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_DOUBLE, -0.062);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_F_format(void){
|
|
const char format_string[] = "Format test string %F";
|
|
const char result_string[] = "Format test string 6729982.999000";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_DOUBLE, 6729982.999);
|
|
|
|
/* verify that string is formatted as expected */
|
|
// visual studio less than 2015 does not support %F
|
|
// mingw/gcc also fails, suspect this may be gcc version
|
|
// related and checking __GNUC__ could resolve but
|
|
// initial attempts didn't work so excluding mingw entirely for now
|
|
#ifdef _WIN32
|
|
#if (defined(_MSC_VER) && _MSC_VER < 1900) || defined(_MINGW)
|
|
testTodoBegin("Fails on windows with old visual studio versions and mingw");
|
|
#endif
|
|
#endif
|
|
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
#ifdef _WIN32
|
|
#if (defined(_MSC_VER) && _MSC_VER < 1900) || defined(_MINGW)
|
|
testTodoEnd();
|
|
#endif
|
|
#endif
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_g_format(void){
|
|
const char format_string[] = "Format test string %g";
|
|
const char result_string[] = "Format test string -0.093";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_DOUBLE, -93e-3);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_G_format(void){
|
|
const char format_string[] = "Format test string %G";
|
|
const char result_string[] = "Format test string 7.2884E+08";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_LONG, 728839938);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_s_format(void){
|
|
|
|
const char format_string[] = "Format test string %d %s";
|
|
const char result_string[] = "Format test string 7 Molly III";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 7);
|
|
|
|
/* set value on inp1 */
|
|
testdbPutFieldOk("test_printf_inp1_rec.VAL", DBF_STRING, "Molly III");
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 4
|
|
}
|
|
|
|
static void test_plus_flag(void){
|
|
|
|
const char format_string[] = "Format test string %+d";
|
|
const char result_string[] = "Format test string +7";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 7);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_minus_flag(void){
|
|
|
|
const char format_string[] = "Format test string %-10d";
|
|
const char result_string[] = "Format test string 18 ";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 18);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_space_flag(void){
|
|
|
|
const char format_string[] = "Format test string % d";
|
|
const char result_string[] = "Format test string 12";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 12);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_hash_flag(void){
|
|
|
|
const char format_string[] = "Format test string %#o";
|
|
const char result_string[] = "Format test string 014";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 014);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_min_width_flag(void){
|
|
|
|
const char format_string[] = "Format test string %04i";
|
|
const char result_string[] = "Format test string 0003";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 3);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_prec_flag(void){
|
|
|
|
const char format_string[] = "Format test string %.4f";
|
|
const char result_string[] = "Format test string 71.2000";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_DOUBLE, 71.2);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_h_flag(void){
|
|
|
|
const char format_string[] = "Format test string %hx";
|
|
const char result_string[] = "Format test string baba";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_LONG, 0xffbaba);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_hh_flag(void){
|
|
|
|
const char format_string[] = "Format test string %hhx";
|
|
const char result_string[] = "Format test string c1";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_LONG, 0xffc0c1);
|
|
|
|
/* verify that string is formatted as expected */
|
|
#ifdef __rtems__
|
|
testTodoBegin("Fails on UB-20 gcc-9 on RTEMS");
|
|
#endif
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
#ifdef __rtems__
|
|
testTodoEnd();
|
|
#endif
|
|
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_l_flag(void){
|
|
|
|
const char format_string[] = "Format test string %lx";
|
|
const char result_string[] = "Format test string 70a1c0c1";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_LONG, 0x70a1c0c1);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
// number of tests = 3
|
|
}
|
|
|
|
static void test_ll_flag(void){
|
|
|
|
const char format_string[] = "%d %s %llx";
|
|
const char result_string[] = "2 Reperbahn ba0110baa0a1c0c1";
|
|
const epicsInt64 value = 0xba0110baa0a1c0c1ull;
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 2);
|
|
|
|
/* set value on inp1 */
|
|
testdbPutFieldOk("test_printf_inp1_rec.VAL", DBF_STRING, "Reperbahn");
|
|
|
|
/* set value on inp2 */
|
|
testdbPutFieldOk("test_printf_inp2_rec.VAL", DBR_INT64, value);
|
|
testdbGetFieldEqual("test_printf_inp2_rec.VAL", DBR_INT64, value);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 6
|
|
}
|
|
|
|
static void test_sizv(void){
|
|
|
|
const char format_string[] = "%d %s %llx";
|
|
const char result_string[] = "99 123456789012345678901234567890 6640baa0a1";
|
|
const epicsInt64 value = 0x06640baa0a1c0c1ull;
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 99);
|
|
|
|
/* set value on inp1 */
|
|
testdbPutFieldOk("test_printf_inp1_rec.VAL", DBF_STRING, "123456789012345678901234567890");
|
|
|
|
/* set value on inp2 */
|
|
testdbPutFieldOk("test_printf_inp2_rec.VAL", DBR_INT64, value);
|
|
testdbGetFieldEqual("test_printf_inp2_rec.VAL", DBR_INT64, value);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetArrFieldEqual("test_printf_rec.VAL$", DBF_CHAR, 45, 45, result_string);
|
|
|
|
// number of tests = 6
|
|
}
|
|
|
|
static void test_all_inputs(void){
|
|
|
|
const char format_string[] = "%d %s %i %i %i %i %i %i %i %i";
|
|
const char result_string[] = "0 One 2 3 4 5 6 7 8 9";
|
|
|
|
/* set format string */
|
|
testdbPutFieldOk("test_printf_rec.FMT", DBF_STRING, format_string);
|
|
|
|
/* set value on inp0 */
|
|
testdbPutFieldOk("test_printf_inp0_rec.VAL", DBF_SHORT, 0);
|
|
|
|
/* set value on inp1 */
|
|
testdbPutFieldOk("test_printf_inp1_rec.VAL", DBF_STRING, "One");
|
|
|
|
/* set value on inp2 */
|
|
testdbPutFieldOk("test_printf_inp2_rec.VAL", DBF_SHORT, 2);
|
|
|
|
/* set value on inp3 */
|
|
testdbPutFieldOk("test_printf_inp3_rec.VAL", DBF_SHORT, 3);
|
|
|
|
/* set value on inp4 */
|
|
testdbPutFieldOk("test_printf_inp4_rec.VAL", DBF_SHORT, 4);
|
|
|
|
/* set value on inp5 */
|
|
testdbPutFieldOk("test_printf_inp5_rec.VAL", DBF_SHORT, 5);
|
|
|
|
/* set value on inp6 */
|
|
testdbPutFieldOk("test_printf_inp6_rec.VAL", DBF_SHORT, 6);
|
|
|
|
/* set value on inp7 */
|
|
testdbPutFieldOk("test_printf_inp7_rec.VAL", DBF_SHORT, 7);
|
|
|
|
/* set value on inp8 */
|
|
testdbPutFieldOk("test_printf_inp8_rec.VAL", DBF_SHORT, 8);
|
|
|
|
/* set value on inp9 */
|
|
testdbPutFieldOk("test_printf_inp9_rec.VAL", DBF_SHORT, 9);
|
|
|
|
/* verify that string is formatted as expected */
|
|
testdbGetFieldEqual("test_printf_rec.VAL", DBF_STRING, result_string);
|
|
|
|
// number of tests = 12
|
|
}
|
|
|
|
MAIN(printfTest) {
|
|
#ifdef _WIN32
|
|
#if (defined(_MSC_VER) && _MSC_VER < 1900) || \
|
|
(defined(_MINGW) && defined(_TWO_DIGIT_EXPONENT))
|
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
|
#endif
|
|
#endif
|
|
|
|
testPlan(3+3+3+3+3+3+3+3+4+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+6+6+12);
|
|
|
|
testdbPrepare();
|
|
testdbReadDatabase("recTestIoc.dbd", NULL, NULL);
|
|
recTestIoc_registerRecordDeviceDriver(pdbbase);
|
|
|
|
testdbReadDatabase("printfTest.db", NULL, NULL);
|
|
|
|
eltc(0);
|
|
testIocInitOk();
|
|
eltc(1);
|
|
|
|
test_double_percentile();
|
|
test_c_format();
|
|
test_d_format();
|
|
test_i_format();
|
|
test_o_format();
|
|
test_u_format();
|
|
test_x_format();
|
|
test_X_format();
|
|
test_e_format();
|
|
test_E_format();
|
|
test_f_format();
|
|
test_F_format();
|
|
test_g_format();
|
|
test_G_format();
|
|
test_s_format();
|
|
test_plus_flag();
|
|
test_minus_flag();
|
|
test_space_flag();
|
|
test_hash_flag();
|
|
test_min_width_flag();
|
|
test_prec_flag();
|
|
test_h_flag();
|
|
test_hh_flag();
|
|
test_l_flag();
|
|
test_ll_flag();
|
|
test_sizv();
|
|
test_all_inputs();
|
|
|
|
testIocShutdownOk();
|
|
testdbCleanup();
|
|
|
|
return testDone();
|
|
}
|