xref: /unit/src/test/nxt_sprintf_test.c (revision 384:8f86d3ff3e29)
1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) NGINX, Inc.
5  */
6 
7 #include <nxt_main.h>
8 #include "nxt_tests.h"
9 
10 
11 typedef struct {
12     const char  *format;
13     const char  *test;
14     double       number;
15 } nxt_sprintf_double_test_t;
16 
17 
18 static const nxt_sprintf_double_test_t  double_test[] =
19 {
20     { "%3.5f", "1234.56700", 1234.567 },
21     { "%3.0f", "1234", 1234.567 },
22     { "%f", "1234.567", 1234.567 },
23     { "%f", "0.1", 0.1 },
24     { "%f", "0.000001", 0.000001 },
25     { "%f", "4503599627370495", 4503599627370495.0 },
26 };
27 
28 
29 static nxt_int_t
nxt_sprintf_test_double(u_char * buf,u_char * end,const char * fmt,const char * test,double n)30 nxt_sprintf_test_double(u_char *buf, u_char *end, const char *fmt,
31     const char *test, double n)
32 {
33     u_char  *p;
34 
35     p = nxt_sprintf(buf, end, fmt, n);
36     *p = '\0';
37 
38     return nxt_strcmp(buf, test);
39 }
40 
41 
42 nxt_int_t
nxt_sprintf_test(nxt_thread_t * thr)43 nxt_sprintf_test(nxt_thread_t *thr)
44 {
45     nxt_int_t   ret;
46     nxt_uint_t  i;
47     u_char      *end, buf[64];
48 
49     nxt_thread_time_update(thr);
50 
51     end = buf + 64;
52 
53     for (i = 0; i < nxt_nitems(double_test); i++) {
54 
55         ret = nxt_sprintf_test_double(buf, end, double_test[i].format,
56                                       double_test[i].test,
57                                       double_test[i].number);
58 
59         if (ret == NXT_OK) {
60             continue;
61         }
62 
63         nxt_log_alert(thr->log, "nxt_sprintf(\"%s\") failed: \"%s\" vs \"%s\"",
64                       double_test[i].format, double_test[i].test, buf);
65 
66         return NXT_ERROR;
67     }
68 
69     nxt_log_error(NXT_LOG_NOTICE, thr->log, "nxt_sprintf() test passed");
70     return NXT_OK;
71 }
72