LCOV - code coverage report
Current view: top level - src/ctlib/unittests - cs_convert.c (source / functions) Hit Total Coverage
Test: FreeTDS coverage Lines: 133 153 86.9 %
Date: 2026-03-26 08:28:16 Functions: 2 2 100.0 %

          Line data    Source code
       1             : #include "common.h"
       2             : 
       3             : #ifdef CS_TDS_74
       4             : #  define FREETDS 1
       5             : #else
       6             : #  define FREETDS 0
       7             : #endif
       8             : 
       9             : static CS_CONTEXT *ctx;
      10             : static int allSuccess = 1;
      11             : 
      12             : typedef const char *STR;
      13             : 
      14             : static CS_INT dest_format = CS_FMT_UNUSED;
      15             : static CS_INT dest_precision = 0;
      16             : static CS_INT dest_scale = 0;
      17             : 
      18             : static int
      19         710 : DoTest(
      20             :               /* source information */
      21             :               CS_INT fromtype, void *fromdata, size_t fromlen,
      22             :               /* to information */
      23             :               CS_INT totype, CS_INT tomaxlen,
      24             :               /* expected result */
      25             :               CS_RETCODE tores, void *todata, CS_INT tolen,
      26             :               /* fields in string format */
      27             :               STR sdecl,
      28             :               STR sfromtype, STR sfromdata, STR sfromlen, STR stotype, STR stomaxlen, STR stores, STR stodata, STR stolen,
      29             :               /* source line number for error reporting */
      30             :               int line)
      31             : {
      32             :         CS_DATAFMT destfmt, srcfmt;
      33             :         CS_INT reslen;
      34             :         CS_RETCODE retcode;
      35             :         int i;
      36             :         char buffer[1024];
      37         710 :         const char *err = "";
      38             : 
      39         710 :         assert(tolen >= 0);
      40             : 
      41         710 :         memset(&destfmt, 0, sizeof(destfmt));
      42         710 :         destfmt.datatype = totype;
      43         710 :         destfmt.maxlength = tomaxlen;
      44         710 :         destfmt.format = dest_format;
      45         710 :         destfmt.precision = dest_precision;
      46         710 :         destfmt.scale = dest_scale;
      47             : 
      48         710 :         memset(&srcfmt, 0, sizeof(srcfmt));
      49         710 :         srcfmt.datatype = fromtype;
      50         710 :         srcfmt.maxlength = (CS_INT) fromlen;
      51             : 
      52             :         /*
      53             :          * FIXME this fix some thing but if error cs_convert should return
      54             :          * CS_UNUSED; note that this is defined 5.. a valid result ...
      55             :          */
      56         710 :         reslen = 0;
      57             : 
      58             :         /*
      59             :          * TODO: add special case for CS_CHAR_TYPE and give different
      60             :          * flags and len
      61             :          */
      62             : 
      63             :         /* do convert */
      64         710 :         ct_reset_last_message();
      65         710 :         memset(buffer, 23, sizeof(buffer));
      66         710 :         retcode = cs_convert(ctx, &srcfmt, fromdata, &destfmt, buffer, &reslen);
      67             : 
      68             :         /* test result of convert */
      69         710 :         if (tores != retcode) {
      70             :                 err = "result";
      71             :                 goto Failed;
      72             :         }
      73             : 
      74             :         /* test buffer */
      75         710 :         if (todata && (reslen != tolen || memcmp(todata, buffer, tolen) != 0)) {
      76             :                 int n;
      77           0 :                 printf("exp");
      78           0 :                 for (n = 0; n < tolen; ++n)
      79           0 :                         printf(" %02x", ((unsigned char*)todata)[n]);
      80           0 :                 printf("\ngot");
      81           0 :                 for (n = 0; n < reslen; ++n)
      82           0 :                         printf(" %02x", ((unsigned char*)buffer)[n]);
      83           0 :                 printf("\n");
      84             : 
      85           0 :                 err = "result data";
      86           0 :                 goto Failed;
      87             :         }
      88             : 
      89             :         /* test result len */
      90         710 :         if (reslen != tolen) {
      91             :                 int n;
      92           0 :                 printf("got");
      93           0 :                 for (n = 0; n < reslen; ++n)
      94           0 :                         printf(" %02x", ((unsigned char*)buffer)[n]);
      95           0 :                 printf("\n");
      96             : 
      97           0 :                 err = "result length";
      98           0 :                 goto Failed;
      99             :         }
     100             : 
     101             :         /* test other part of buffer */
     102             :         /* skip test in case of failure, in some cases the buffer is written */
     103         710 :         if (tores == CS_FAIL && !todata && tolen == 0)
     104          90 :                 memset(buffer, 23, sizeof(buffer));
     105         710 :         if (todata)
     106         620 :                 memset(buffer, 23, tolen);
     107      727750 :         for (i = 0; i < sizeof(buffer); ++i)
     108      727040 :                 if (buffer[i] != 23) {
     109             :                         err = "buffer left";
     110             :                         goto Failed;
     111             :                 }
     112             : 
     113             :         /* success */
     114             :         return 0;
     115           0 :       Failed:
     116           0 :         fprintf(stderr, "Test %s failed (got ret=%d len=%d)\n", err, (int) retcode, (int) reslen);
     117           0 :         fprintf(stderr, "line: %d\n  DO_TEST(decl=%s,\n"
     118             :                 "\t   fromtype=%s,fromdata=%s,fromlen=%s,\n"
     119             :                 "\t   totype=%s,tomaxlen=%s,\n"
     120             :                 "\t   tores=%s,todata=%s,tolen=%s);\n",
     121             :                 line, sdecl, sfromtype, sfromdata, sfromlen, stotype, stomaxlen, stores, stodata, stolen);
     122           0 :         allSuccess = 0;
     123           0 :         return 1;
     124             : }
     125             : 
     126             : #define DO_TEST(decl,fromtype,fromdata,fromlen,totype,tomaxlen,tores,todata,tolen) { \
     127             :  decl; \
     128             :  DoTest(fromtype,fromdata,fromlen,totype,tomaxlen,tores,todata,tolen,\
     129             :   #decl,#fromtype,#fromdata,#fromlen,#totype,#tomaxlen,#tores,#todata,#tolen,\
     130             :   __LINE__);\
     131             : }
     132             : 
     133          10 : TEST_MAIN()
     134             : {
     135          10 :         volatile CS_BIGINT one = 1;
     136          10 :         bool verbose = true;
     137             : 
     138          10 :         printf("%s: Testing conversion\n", __FILE__);
     139             : 
     140          10 :         check_call(cs_ctx_alloc, (CS_VERSION_150, &ctx));
     141          10 :         check_call(ct_init, (ctx, CS_VERSION_150));
     142          10 :         check_call(cs_config, (ctx, CS_SET, CS_MESSAGE_CB, (CS_VOID*) cslibmsg_cb, CS_UNUSED, NULL));
     143             : 
     144             :         /* TODO For each conversion test different values of fromlen and tolen */
     145             : 
     146             :         /* 
     147             :          * * INT to everybody 
     148             :          */
     149          10 :         DO_TEST(CS_INT test = 12345;
     150             :                 CS_INT test2 = 12345,
     151             :                 CS_INT_TYPE, &test, sizeof(test), CS_INT_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     152          10 :         DO_TEST(CS_INT test = 12345;
     153             :                 CS_INT test2 = 12345,
     154             :                 CS_INT_TYPE, &test, sizeof(test), CS_INT_TYPE, sizeof(test2) * 2, CS_SUCCEED, &test2, sizeof(test2));
     155             :         /* FIXME: correct ?? */
     156          10 :         DO_TEST(CS_INT test = 12345;
     157             :                 CS_INT test2 = 12345, 
     158             :                 CS_INT_TYPE, &test, sizeof(test), CS_INT_TYPE, sizeof(CS_SMALLINT), CS_SUCCEED, &test2, sizeof(test2));
     159             : 
     160          10 :         DO_TEST(CS_INT test = 1234;
     161             :                 CS_SMALLINT test2 = 1234, CS_INT_TYPE, &test, sizeof(test), CS_SMALLINT_TYPE, 1, CS_SUCCEED, &test2, sizeof(test2));
     162             :         /* biggest and smallest SMALLINT */
     163          10 :         DO_TEST(CS_INT test = 32767;
     164             :                 CS_SMALLINT test2 = 32767,
     165             :                 CS_INT_TYPE, &test, sizeof(test), CS_SMALLINT_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     166          10 :         DO_TEST(CS_INT test = -32768;
     167             :                 CS_SMALLINT test2 = -32768,
     168             :                 CS_INT_TYPE, &test, sizeof(test), CS_SMALLINT_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     169             :         /* overflow */
     170             : #if FREETDS
     171          10 :         DO_TEST(CS_INT test = 32768;
     172             :                 CS_SMALLINT test2 = 12345, CS_INT_TYPE, &test, sizeof(test), CS_SMALLINT_TYPE, sizeof(test2), CS_FAIL, NULL, 0);
     173          10 :         DO_TEST(CS_INT test = -32769;
     174             :                 CS_SMALLINT test2 = 12345, CS_INT_TYPE, &test, sizeof(test), CS_SMALLINT_TYPE, sizeof(test2), CS_FAIL, NULL, 0);
     175             : #endif
     176             : 
     177             :         /* biggest and smallest TINYINT */
     178          10 :         DO_TEST(CS_INT test = 255;
     179             :                 CS_TINYINT test2 = 255,
     180             :                 CS_INT_TYPE, &test, sizeof(test), CS_TINYINT_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     181          10 :         DO_TEST(CS_INT test = 0;
     182             :                 CS_TINYINT test2 = 0,
     183             :                 CS_INT_TYPE, &test, sizeof(test), CS_TINYINT_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     184             :         /* overflow */
     185             : #if FREETDS
     186          10 :         DO_TEST(CS_INT test = 256;
     187             :                 CS_TINYINT test2 = 1, CS_INT_TYPE, &test, sizeof(test), CS_TINYINT_TYPE, sizeof(test2), CS_FAIL, NULL, 0);
     188          10 :         DO_TEST(CS_INT test = -1;
     189             :                 CS_TINYINT test2 = 1, CS_INT_TYPE, &test, sizeof(test), CS_TINYINT_TYPE, sizeof(test2), CS_FAIL, NULL, 0);
     190             : #endif
     191             : 
     192             :         /* biggest and smallest BIT */
     193          10 :         DO_TEST(CS_INT test = 1;
     194             :                 CS_BYTE test2 = 1, CS_INT_TYPE, &test, sizeof(test), CS_BIT_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     195          10 :         DO_TEST(CS_INT test = 0;
     196             :                 CS_BYTE test2 = 0, CS_INT_TYPE, &test, sizeof(test), CS_BIT_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     197             :         /* overflow FIXME: or 1 if != 0 ?? */
     198          10 :         DO_TEST(CS_INT test = 2;
     199             :                 CS_BYTE test2 = 1, CS_INT_TYPE, &test, sizeof(test), CS_BIT_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     200          10 :         DO_TEST(CS_INT test = -1;
     201             :                 CS_BYTE test2 = 1, CS_INT_TYPE, &test, sizeof(test), CS_BIT_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     202             : 
     203          10 :         DO_TEST(CS_INT test = 1234;
     204             :                 CS_REAL test2 = 1234.0,
     205             :                 CS_INT_TYPE, &test, sizeof(test), CS_REAL_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     206          10 :         DO_TEST(CS_INT test = -8765;
     207             :                 CS_REAL test2 = -8765.0,
     208             :                 CS_INT_TYPE, &test, sizeof(test), CS_REAL_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     209             : 
     210          10 :         DO_TEST(CS_INT test = 1234;
     211             :                 CS_FLOAT test2 = 1234.0,
     212             :                 CS_INT_TYPE, &test, sizeof(test), CS_FLOAT_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     213          10 :         DO_TEST(CS_INT test = -8765;
     214             :                 CS_FLOAT test2 = -8765.0,
     215             :                 CS_INT_TYPE, &test, sizeof(test), CS_FLOAT_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     216             : 
     217             : #if FREETDS
     218          10 :         DO_TEST(CS_INT test = 1234678; CS_MONEY4 test2 = {
     219             :                 1234678}
     220             :                 , CS_INT_TYPE, &test, sizeof(test), CS_MONEY4_TYPE, sizeof(test2), CS_FAIL, NULL, 0);
     221             : #endif
     222          10 :         DO_TEST(CS_INT test = -8765; CS_MONEY4 test2 = {
     223             :                 -8765 * 10000}
     224             :                 , CS_INT_TYPE, &test, sizeof(test), CS_MONEY4_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     225             : 
     226             :         /* strange money formatting */
     227          10 :         DO_TEST(CS_CHAR test[] = ""; CS_MONEY4 test2 = {
     228             :                 0}
     229             :                 , CS_CHAR_TYPE, test, strlen(test), CS_MONEY4_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     230          10 :         DO_TEST(CS_CHAR test[] = "."; CS_MONEY4 test2 = {
     231             :                 0}
     232             :                 , CS_CHAR_TYPE, test, strlen(test), CS_MONEY4_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     233          10 :         DO_TEST(CS_CHAR test[] = ".12"; CS_MONEY4 test2 = {
     234             :                 1200}
     235             :                 , CS_CHAR_TYPE, test, strlen(test), CS_MONEY4_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     236          10 :         DO_TEST(CS_CHAR test[] = "++++-123"; CS_MONEY4 test2 = {
     237             :                 -123 * 10000}
     238             :                 , CS_CHAR_TYPE, test, strlen(test), CS_MONEY4_TYPE, sizeof(test2), CS_FAIL, NULL, 0);
     239          10 :         DO_TEST(CS_CHAR test[] = "   -123"; CS_MONEY4 test2 = {
     240             :                 -123 * 10000}
     241             :                 , CS_CHAR_TYPE, test, strlen(test), CS_MONEY4_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     242          10 :         DO_TEST(CS_CHAR test[] = "   +123"; CS_MONEY4 test2 = {
     243             :                 123 * 10000}
     244             :                 , CS_CHAR_TYPE, test, strlen(test), CS_MONEY4_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     245          10 :         DO_TEST(CS_CHAR test[] = "+123.1234"; CS_MONEY4 test2 = {
     246             :                 1231234}
     247             :                 , CS_CHAR_TYPE, test, strlen(test), CS_MONEY4_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     248          10 :         DO_TEST(CS_CHAR test[] = "+123.123411"; CS_MONEY4 test2 = {
     249             :                 1231234}
     250             :                 , CS_CHAR_TYPE, test, strlen(test), CS_MONEY4_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     251          10 :         DO_TEST(CS_CHAR test[] = "+123.12.3411"; CS_MONEY4 test2 = {
     252             :                 1231234}
     253             :                 , CS_CHAR_TYPE, test, strlen(test), CS_MONEY4_TYPE, sizeof(test2), CS_FAIL, NULL, 0);
     254          10 :         DO_TEST(CS_CHAR test[] = "pippo"; CS_MONEY4 test2 = {
     255             :                 0}
     256             :                 , CS_CHAR_TYPE, test, strlen(test), CS_MONEY4_TYPE, sizeof(test2), CS_FAIL, NULL, 0);
     257             : 
     258             :         /* not terminated money  */
     259          10 :         DO_TEST(CS_CHAR test[] = "-1234567"; CS_MONEY4 test2 = {
     260             :                 -1230000}
     261             :                 , CS_CHAR_TYPE, test, 4, CS_MONEY4_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     262             : 
     263          10 :         DO_TEST(CS_INT test = 1234678;
     264             :                 CS_MONEY test2;
     265             :                 test2.mnyhigh = ((one * 1234678) * 10000) >> 32;
     266             :                 test2.mnylow = (CS_UINT) ((one * 1234678) * 10000),
     267             :                 CS_INT_TYPE, &test, sizeof(test), CS_MONEY_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     268          10 :         DO_TEST(CS_INT test = -8765;
     269             :                 CS_MONEY test2;
     270             :                 test2.mnyhigh = ((one * -8765) * 10000) >> 32;
     271             :                 test2.mnylow = (CS_UINT) ((one * -8765) * 10000),
     272             :                 CS_INT_TYPE, &test, sizeof(test), CS_MONEY_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     273             : 
     274          10 :         DO_TEST(CS_INT test = 12345;
     275             :                 CS_CHAR test2[] = "12345",
     276             :                 CS_INT_TYPE, &test, sizeof(test), CS_CHAR_TYPE, sizeof(test2), CS_SUCCEED, test2, sizeof(test2) - 1);
     277             : 
     278             : #if FREETDS
     279          10 :         { CS_VARCHAR test2 = { 5, "12345"};
     280          10 :         memset(test2.str+5, 23, 251);
     281          10 :         DO_TEST(CS_INT test = 12345,
     282             :                 CS_INT_TYPE,&test,sizeof(test),
     283             :                 CS_VARCHAR_TYPE,sizeof(test2),
     284             :                 CS_SUCCEED,&test2,sizeof(test2));
     285             :         }
     286             : #endif
     287             : 
     288          10 :         DO_TEST(CS_CHAR test[] = "12345";
     289             :                 CS_INT test2 = 12345, CS_CHAR_TYPE, test, 5, CS_INT_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     290             : 
     291             :         /* unterminated number */
     292          10 :         DO_TEST(CS_CHAR test[] = " - 12345";
     293             :                 CS_INT test2 = -12, CS_CHAR_TYPE, test, 5, CS_INT_TYPE, sizeof(test2), CS_SUCCEED, &test2, sizeof(test2));
     294             : 
     295             :         /* to binary */
     296          10 :         DO_TEST(CS_CHAR test[] = "abc";
     297             :                 CS_CHAR test2[] = "abc", CS_BINARY_TYPE, test, 3, CS_BINARY_TYPE, 3, CS_SUCCEED, test2, 3);
     298             : #if 0
     299             :         DO_TEST(CS_CHAR test[] = "abcdef";
     300             :                 CS_CHAR test2[] = "ab", CS_BINARY_TYPE, test, 6, CS_BINARY_TYPE, 2, CS_FAIL, test2, 2);
     301             :         DO_TEST(CS_CHAR test[] = "abc";
     302             :                 CS_CHAR test2[] = "ab", CS_BINARY_TYPE, test, 3, CS_BINARY_TYPE, 2, CS_FAIL, test2, 2);
     303             : #endif
     304          10 :         DO_TEST(CS_CHAR test[] = "616263";
     305             :                 CS_CHAR test2[] = "abc", CS_CHAR_TYPE, test, 6, CS_BINARY_TYPE, 3, CS_SUCCEED, test2, 3);
     306          10 :         DO_TEST(CS_CHAR test[] = "616263646566";
     307             :                 CS_CHAR test2[] = "abc", CS_CHAR_TYPE, test, 12, CS_BINARY_TYPE, 3, CS_FAIL, test2, 3);
     308          10 :         check_last_message(CTMSG_CSLIB, 0x2040124, "The result is truncated");
     309          10 :         DO_TEST(CS_CHAR test[] = "96162ignored";
     310             :                 CS_CHAR test2[] = "\tab", CS_CHAR_TYPE, test, 5, CS_IMAGE_TYPE, 3, CS_SUCCEED, test2, 3);
     311          10 :         DO_TEST(CS_CHAR test[] = "616263zxzxzxzxzx";
     312             :                 CS_CHAR test2[] = "abc", CS_CHAR_TYPE, test, 12, CS_BINARY_TYPE, 3, CS_FAIL, test2, 3);
     313          10 :         check_last_message(CTMSG_CSLIB, 0x2040124, "The result is truncated");
     314          10 :         DO_TEST(CS_CHAR test[] = "961626zxzxzxzxzx";
     315             :                 CS_CHAR test2[] = "\tab", CS_CHAR_TYPE, test, 11, CS_BINARY_TYPE, 3, CS_FAIL, test2, 3);
     316          10 :         check_last_message(CTMSG_CSLIB, 0x2040124, "The result is truncated");
     317          10 :         DO_TEST(CS_CHAR test[] = "61626xzxzxzxzxzx", CS_CHAR_TYPE, test, 12, CS_BINARY_TYPE, 3, CS_FAIL, NULL, 0);
     318          10 :         check_last_message(CTMSG_CSLIB, 0x2040118, "syntax error in the source field");
     319          10 :         DO_TEST(CS_CHAR test[] = "hello"; CS_CHAR test2[] = "abc", CS_CHAR_TYPE, test, 5, CS_BINARY_TYPE, 10, CS_FAIL, test2, 0);
     320             :         /* spaces, tabs and initial "0x" are ignored */
     321          10 :         DO_TEST(CS_CHAR test[] = " \t \t0x616263";
     322             :                 CS_CHAR test2[] = "abc", CS_CHAR_TYPE, test, 12, CS_BINARY_TYPE, 3, CS_SUCCEED, test2, 3);
     323             :         /* spaces and trailing tabs are ignored */
     324          10 :         DO_TEST(CS_CHAR test[] = "616263 \t ";
     325             :                 CS_CHAR test2[] = "abc", CS_CHAR_TYPE, test, 9, CS_BINARY_TYPE, 3, CS_SUCCEED, test2, 3);
     326             :         /* odd number of characters */
     327          10 :         DO_TEST(CS_CHAR test[] = "61626";
     328             :                 CS_CHAR test2[] = "\x06\x16\x26", CS_CHAR_TYPE, test, 5, CS_BINARY_TYPE, 3, CS_SUCCEED, test2, 3);
     329             : 
     330             :         /* to char */
     331          10 :         DO_TEST(CS_INT test = 1234567;
     332             :                 CS_CHAR test2[] = "1234567", CS_INT_TYPE, &test, sizeof(test), CS_CHAR_TYPE, 7, CS_SUCCEED, test2, 7);
     333          10 :         DO_TEST(CS_CHAR test[] = "abc";
     334             :                 CS_CHAR test2[] = "ab", CS_CHAR_TYPE, test, 3, CS_CHAR_TYPE, 2, CS_FAIL, test2, 2);
     335          10 :         DO_TEST(CS_CHAR test[] = "abc";
     336             :                 CS_CHAR test2[] = "616263", CS_BINARY_TYPE, test, 3, CS_CHAR_TYPE, 6, CS_SUCCEED, test2, 6);
     337          10 :         DO_TEST(CS_CHAR test[] = "abcdef";
     338             :                 CS_CHAR test2[] = "616263", CS_BINARY_TYPE, test, 6, CS_CHAR_TYPE, 6, CS_FAIL, test2, 6);
     339             : 
     340             :         /* conversion to various binaries */
     341          10 :         DO_TEST(CS_CHAR test[] = "616263646566";
     342             :                 CS_CHAR test2[12] = "abcdef", CS_CHAR_TYPE, test, 12, CS_IMAGE_TYPE, 12, CS_SUCCEED, test2, 6);
     343          10 :         DO_TEST(CS_CHAR test[] = "616263646566";
     344             :                 CS_CHAR test2[12] = "abcdef", CS_CHAR_TYPE, test, 12, CS_BINARY_TYPE, 12, CS_SUCCEED, test2, 6);
     345          10 :         DO_TEST(CS_CHAR test[] = "616263646566yyy";
     346             :                 CS_CHAR test2[] = "616263646566xxx", CS_BINARY_TYPE, test, 12, CS_BINARY_TYPE, 12, CS_SUCCEED, test2, 12);
     347          10 :         DO_TEST(CS_CHAR test[] = "6162636465yyyyy";
     348             :                 CS_CHAR test2[] = "616263646566xxx", CS_BINARY_TYPE, test, 12, CS_BINARY_TYPE, 10, CS_FAIL, test2, 10);
     349          10 :         DO_TEST(CS_CHAR test[] = "6162636465yyyyy";
     350             :                 CS_CHAR test2[] = "616263646566xxx", CS_IMAGE_TYPE, test, 12, CS_IMAGE_TYPE, 10, CS_FAIL, test2, 10);
     351          10 :         DO_TEST(CS_CHAR test[] = "6162636465yyyyy";
     352             :                 CS_CHAR test2[] = "616263646566xxx", CS_BINARY_TYPE, test, 12, CS_IMAGE_TYPE, 10, CS_FAIL, test2, 10);
     353          10 :         DO_TEST(CS_CHAR test[] = "6162636465yyyyy";
     354             :                 CS_CHAR test2[] = "616263646566xxx", CS_IMAGE_TYPE, test, 12, CS_BINARY_TYPE, 10, CS_FAIL, test2, 10);
     355          10 :         DO_TEST(CS_CHAR test[] = "616263646566";
     356             :                 CS_VARBINARY test2; test2.len = 6; memset(test2.array, 23, 256); memcpy(test2.array, "abcdef", 6),
     357             :                 CS_CHAR_TYPE, test, 12, CS_VARBINARY_TYPE, 12, CS_SUCCEED, &test2, 258);
     358             : 
     359             :         /* conversion to various binaries, same as above but with zero padding */
     360          10 :         dest_format = CS_FMT_PADNULL;
     361          10 :         DO_TEST(CS_CHAR test[] = "616263646566";
     362             :                 CS_CHAR test2[12] = "abcdef", CS_CHAR_TYPE, test, 12, CS_IMAGE_TYPE, 12, CS_SUCCEED, test2, 12);
     363          10 :         DO_TEST(CS_CHAR test[] = "616263646566";
     364             :                 CS_CHAR test2[12] = "abcdef", CS_CHAR_TYPE, test, 12, CS_BINARY_TYPE, 12, CS_SUCCEED, test2, 12);
     365          10 :         DO_TEST(CS_CHAR test[] = "616263646566";
     366             :                 CS_VARBINARY test2; test2.len = 6; memset(test2.array, 23, 256); memcpy(test2.array, "abcdef", 6),
     367             :                 CS_CHAR_TYPE, test, 12, CS_VARBINARY_TYPE, 12, CS_SUCCEED, &test2, 258);
     368          10 :         dest_format = CS_FMT_UNUSED;
     369             : 
     370          10 :         dest_precision = 30;
     371          10 :         dest_scale = 2;
     372             :         {
     373          10 :                 CS_NUMERIC test = {
     374             :                         30, 2, {0, 0, 0, 1, 2, 3, 4}
     375             :                 };
     376          10 :                 DO_TEST(CS_CHAR test2[30] = "12184261810429657455001.60",
     377             :                         CS_NUMERIC_TYPE, &test, sizeof(test), CS_CHAR_TYPE, sizeof(test2), CS_SUCCEED, test2, 26);
     378             :         }
     379             : 
     380             :         {
     381          10 :                 CS_NUMERIC test2 = {
     382             :                         30, 2, {0, 0, 0, 1, 2, 3, 4}
     383             :                 };
     384          10 :                 DO_TEST(CS_CHAR test[] = "12184261810429657455001.60",
     385             :                         CS_CHAR_TYPE, test, sizeof(test) - 1, CS_NUMERIC_TYPE, sizeof(test2), CS_SUCCEED, &test2, 16);
     386             :         }
     387             : 
     388          10 :         dest_precision = 78;
     389             :         {
     390          10 :                 CS_NUMERIC test2 = {
     391             :                         30, 2, {0, 0, 0, 1, 2, 3, 4}
     392             :                 };
     393          10 :                 DO_TEST(CS_CHAR test[] = "12184261810429657455001.60",
     394             :                         CS_CHAR_TYPE, test, sizeof(test) - 1, CS_NUMERIC_TYPE, sizeof(test2), CS_FAIL, &test2, 0);
     395          10 :                 check_last_message(CTMSG_CSLIB, 0x2010112, "An illegal value of 78 was placed in the precision field");
     396             :         }
     397             : 
     398          10 :         dest_precision = 30;
     399          10 :         dest_scale = 31;
     400             :         {
     401          10 :                 CS_NUMERIC test2 = {
     402             :                         30, 2, {0, 0, 0, 1, 2, 3, 4}
     403             :                 };
     404          10 :                 DO_TEST(CS_CHAR test[] = "12184261810429657455001.60",
     405             :                         CS_CHAR_TYPE, test, sizeof(test) - 1, CS_NUMERIC_TYPE, sizeof(test2), CS_FAIL, &test2, 0);
     406          10 :                 check_last_message(CTMSG_CSLIB, 0x2010112, "An illegal value of 31 was placed in the scale field");
     407             :         }
     408             : 
     409          10 :         dest_precision = CS_SRC_VALUE;
     410          10 :         dest_scale = CS_SRC_VALUE;
     411             :         {
     412          10 :                 CS_NUMERIC test = {
     413             :                         30, 2, {0, 0, 0, 1, 2, 3, 4}
     414             :                 };
     415          10 :                 DO_TEST(CS_NUMERIC test2 = test,
     416             :                         CS_NUMERIC_TYPE, &test, sizeof(test), CS_NUMERIC_TYPE, sizeof(test2), CS_SUCCEED, &test2, 16);
     417             :         }
     418             : 
     419          10 :         dest_precision = 31;
     420          10 :         dest_scale = CS_SRC_VALUE;
     421             :         {
     422          10 :                 CS_NUMERIC test = {
     423             :                         30, 2, {0, 0, 0, 1, 2, 3, 4}
     424             :                 };
     425          10 :                 DO_TEST(CS_NUMERIC test2 = test;
     426             :                         test2.precision = 31,
     427             :                         CS_NUMERIC_TYPE, &test, sizeof(test), CS_NUMERIC_TYPE, sizeof(test2), CS_SUCCEED, &test2, 16);
     428             :         }
     429             : 
     430          10 :         check_call(ct_exit, (ctx, CS_UNUSED));
     431          10 :         check_call(cs_ctx_drop, (ctx));
     432             : 
     433          10 :         if (verbose && allSuccess) {
     434          10 :                 printf("Test succeded\n");
     435             :         }
     436          10 :         return allSuccess ? 0 : 1;
     437             : }

Generated by: LCOV version 1.13