add printf tests

Tue, 20 Dec 2022 16:09:03 +0100

author
Mike Becker <universe@uap-core.de>
date
Tue, 20 Dec 2022 16:09:03 +0100
changeset 636
cfcc8cf0168c
parent 635
d4845058239a
child 637
ceadf0792ded

add printf tests

test/CMakeLists.txt file | annotate | diff | comparison | revisions
test/test_printf.cpp file | annotate | diff | comparison | revisions
     1.1 --- a/test/CMakeLists.txt	Tue Dec 20 15:08:08 2022 +0100
     1.2 +++ b/test/CMakeLists.txt	Tue Dec 20 16:09:03 2022 +0100
     1.3 @@ -24,6 +24,7 @@
     1.4          test_hash_key.cpp
     1.5          test_map.cpp
     1.6          test_basic_mempool.cpp
     1.7 +        test_printf.cpp
     1.8          selftest.cpp
     1.9          util_allocator.cpp
    1.10          )
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/test/test_printf.cpp	Tue Dec 20 16:09:03 2022 +0100
     2.3 @@ -0,0 +1,284 @@
     2.4 +/*
     2.5 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     2.6 + *
     2.7 + * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
     2.8 + *
     2.9 + * Redistribution and use in source and binary forms, with or without
    2.10 + * modification, are permitted provided that the following conditions are met:
    2.11 + *
    2.12 + *   1. Redistributions of source code must retain the above copyright
    2.13 + *      notice, this list of conditions and the following disclaimer.
    2.14 + *
    2.15 + *   2. Redistributions in binary form must reproduce the above copyright
    2.16 + *      notice, this list of conditions and the following disclaimer in the
    2.17 + *      documentation and/or other materials provided with the distribution.
    2.18 + *
    2.19 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    2.20 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    2.21 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    2.22 + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
    2.23 + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    2.24 + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    2.25 + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    2.26 + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    2.27 + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    2.28 + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    2.29 + * POSSIBILITY OF SUCH DAMAGE.
    2.30 + */
    2.31 +
    2.32 +#include "cx/printf.h"
    2.33 +#include "cx/buffer.h"
    2.34 +
    2.35 +#include <gtest/gtest.h>
    2.36 +#include "util_allocator.h"
    2.37 +
    2.38 +class PrintfFixture : public ::testing::Test {
    2.39 +protected:
    2.40 +    std::string buf;
    2.41 +    CxTestingAllocator alloc;
    2.42 +
    2.43 +    void TearDown() override {
    2.44 +        buf.clear();
    2.45 +        ASSERT_TRUE(alloc.verify());
    2.46 +    }
    2.47 +
    2.48 +    static size_t write_func(
    2.49 +            void const *src,
    2.50 +            size_t esize,
    2.51 +            size_t ecount,
    2.52 +            void *target
    2.53 +    ) {
    2.54 +        auto str = reinterpret_cast<char const *>(src);
    2.55 +        auto buf = reinterpret_cast<std::string *>(target);
    2.56 +        EXPECT_EQ(esize, 1);
    2.57 +        EXPECT_EQ(strlen(str), ecount);
    2.58 +        *buf = str;
    2.59 +        return ecount;
    2.60 +    }
    2.61 +};
    2.62 +
    2.63 +
    2.64 +TEST_F(PrintfFixture, BPrintf) {
    2.65 +    CxBuffer buf;
    2.66 +    cxBufferInit(&buf, nullptr, 64, &alloc, 0);
    2.67 +
    2.68 +    auto r = cx_bprintf(&buf, "This %s aged %u years in a %2XSK.", "Test", 10, 0xca);
    2.69 +    EXPECT_EQ(r, 34);
    2.70 +    EXPECT_EQ(buf.size, 34);
    2.71 +    buf.space[r] = '\0';
    2.72 +    EXPECT_STREQ(buf.space, "This Test aged 10 years in a CASK.");
    2.73 +
    2.74 +    cxBufferDestroy(&buf);
    2.75 +}
    2.76 +
    2.77 +TEST_F(PrintfFixture, FPrintf) {
    2.78 +    auto h = "Hello";
    2.79 +    size_t r;
    2.80 +
    2.81 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "teststring");
    2.82 +    EXPECT_EQ(r, 10);
    2.83 +    EXPECT_EQ(buf, "teststring");
    2.84 +
    2.85 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "[%10s]", h);
    2.86 +    EXPECT_EQ(r, 12);
    2.87 +    EXPECT_EQ(buf, "[     Hello]");
    2.88 +
    2.89 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "[%-10s]", h);
    2.90 +    EXPECT_EQ(r, 12);
    2.91 +    EXPECT_EQ(buf, "[Hello     ]");
    2.92 +
    2.93 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "[%*s]", 10, h);
    2.94 +    EXPECT_EQ(r, 12);
    2.95 +    EXPECT_EQ(buf, "[     Hello]");
    2.96 +
    2.97 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "[%-10.*s]", 4, h);
    2.98 +    EXPECT_EQ(r, 12);
    2.99 +    EXPECT_EQ(buf, "[Hell      ]");
   2.100 +
   2.101 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "[%-*.*s]", 10, 4, h);
   2.102 +    EXPECT_EQ(r, 12);
   2.103 +    EXPECT_EQ(buf, "[Hell      ]");
   2.104 +
   2.105 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "%c", 'A');
   2.106 +    EXPECT_EQ(r, 1);
   2.107 +    EXPECT_EQ(buf, "A");
   2.108 +
   2.109 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "%i %d %.6i %i %.0i %+i %i", 1, 2, 3, 0, 0, 4, -4);
   2.110 +    EXPECT_EQ(r, 19);
   2.111 +    EXPECT_EQ(buf, "1 2 000003 0  +4 -4");
   2.112 +
   2.113 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "%x %x %X %#x", 5, 10, 10, 6);
   2.114 +    EXPECT_EQ(r, 9);
   2.115 +    EXPECT_EQ(buf, "5 a A 0x6");
   2.116 +
   2.117 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "%o %#o %#o", 10, 10, 4);
   2.118 +    EXPECT_EQ(r, 9);
   2.119 +    EXPECT_EQ(buf, "12 012 04");
   2.120 +
   2.121 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "%f %.0f %.32f", 1.5, 1.5, 1.3);
   2.122 +    EXPECT_EQ(r, 45);
   2.123 +    EXPECT_EQ(buf, "1.500000 2 1.30000000000000004440892098500626");
   2.124 +
   2.125 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "%05.2f %.2f %5.2f", 1.5, 1.5, 1.5);
   2.126 +    EXPECT_EQ(r, 16);
   2.127 +    EXPECT_EQ(buf, "01.50 1.50  1.50");
   2.128 +
   2.129 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "%E %e", 1.5, 1.5);
   2.130 +    EXPECT_EQ(r, 25);
   2.131 +    EXPECT_EQ(buf, "1.500000E+00 1.500000e+00");
   2.132 +
   2.133 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "%a %A", 1.5, 1.5);
   2.134 +    EXPECT_EQ(r, 17);
   2.135 +    EXPECT_EQ(buf, "0x1.8p+0 0X1.8P+0");
   2.136 +
   2.137 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "0/0=%g 1/0=%g", 0.0 / 0.0, 1.0 / 0.0);
   2.138 +    EXPECT_EQ(r, 16);
   2.139 +    EXPECT_EQ(buf, "0/0=-nan 1/0=inf");
   2.140 +
   2.141 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "'%*c'", 5, 'x');
   2.142 +    EXPECT_EQ(r, 7);
   2.143 +    EXPECT_EQ(buf, "'    x'");
   2.144 +
   2.145 +    r = cx_fprintf(&buf, PrintfFixture::write_func, "'%*c'", -5, 'x');
   2.146 +    EXPECT_EQ(r, 7);
   2.147 +    EXPECT_EQ(buf, "'x    '");
   2.148 +}
   2.149 +
   2.150 +TEST_F(PrintfFixture, BPrintfLargeString) {
   2.151 +    CxBuffer buf;
   2.152 +    cxBufferInit(&buf, nullptr, 64, &alloc, CX_BUFFER_AUTO_EXTEND);
   2.153 +
   2.154 +    auto aaa = std::string(512, 'a');
   2.155 +    auto bbb = std::string(512, 'b');
   2.156 +
   2.157 +    auto r = cx_bprintf(&buf, "After %s comes %s.", aaa.data(), bbb.data());
   2.158 +    EXPECT_EQ(r, 1038);
   2.159 +    EXPECT_EQ(buf.size, 1038);
   2.160 +    cxBufferPut(&buf, 0);
   2.161 +    EXPECT_EQ(buf.space, std::string("After ") + aaa + " comes " + bbb + ".");
   2.162 +
   2.163 +    cxBufferDestroy(&buf);
   2.164 +}
   2.165 +
   2.166 +TEST_F(PrintfFixture, BPrintfNoCap) {
   2.167 +    CxBuffer buf;
   2.168 +    char space[20];
   2.169 +    memset(space, 'a', 20);
   2.170 +    cxBufferInit(&buf, space, 16, &alloc, 0);
   2.171 +
   2.172 +    auto r = cx_bprintf(&buf, "Hello %s with more than %d chars.", "string", 16);
   2.173 +    EXPECT_EQ(r, 16);
   2.174 +    EXPECT_EQ(buf.size, 16);
   2.175 +    EXPECT_EQ(0, memcmp(space, "Hello string witaaaa", 20));
   2.176 +
   2.177 +    cxBufferDestroy(&buf);
   2.178 +}
   2.179 +
   2.180 +TEST_F(PrintfFixture, SPrintf) {
   2.181 +    auto h = "Hello";
   2.182 +
   2.183 +    std::vector<char *> fl;
   2.184 +    cxmutstr r;
   2.185 +
   2.186 +    r = cx_asprintf_a(&alloc, "teststring");
   2.187 +    EXPECT_EQ(r.length, 10);
   2.188 +    EXPECT_STREQ(r.ptr, "teststring");
   2.189 +    fl.push_back(r.ptr);
   2.190 +
   2.191 +    r = cx_asprintf_a(&alloc, "[%10s]", h);
   2.192 +    EXPECT_EQ(r.length, 12);
   2.193 +    EXPECT_STREQ(r.ptr, "[     Hello]");
   2.194 +    fl.push_back(r.ptr);
   2.195 +
   2.196 +    r = cx_asprintf_a(&alloc, "[%-10s]", h);
   2.197 +    EXPECT_EQ(r.length, 12);
   2.198 +    EXPECT_STREQ(r.ptr, "[Hello     ]");
   2.199 +    fl.push_back(r.ptr);
   2.200 +
   2.201 +    r = cx_asprintf_a(&alloc, "[%*s]", 10, h);
   2.202 +    EXPECT_EQ(r.length, 12);
   2.203 +    EXPECT_STREQ(r.ptr, "[     Hello]");
   2.204 +    fl.push_back(r.ptr);
   2.205 +
   2.206 +    r = cx_asprintf_a(&alloc, "[%-10.*s]", 4, h);
   2.207 +    EXPECT_EQ(r.length, 12);
   2.208 +    EXPECT_STREQ(r.ptr, "[Hell      ]");
   2.209 +    fl.push_back(r.ptr);
   2.210 +
   2.211 +    r = cx_asprintf_a(&alloc, "[%-*.*s]", 10, 4, h);
   2.212 +    EXPECT_EQ(r.length, 12);
   2.213 +    EXPECT_STREQ(r.ptr, "[Hell      ]");
   2.214 +    fl.push_back(r.ptr);
   2.215 +
   2.216 +    r = cx_asprintf_a(&alloc, "%c", 'A');
   2.217 +    EXPECT_EQ(r.length, 1);
   2.218 +    EXPECT_STREQ(r.ptr, "A");
   2.219 +    fl.push_back(r.ptr);
   2.220 +
   2.221 +    r = cx_asprintf_a(&alloc, "%i %d %.6i %i %.0i %+i %i", 1, 2, 3, 0, 0, 4, -4);
   2.222 +    EXPECT_EQ(r.length, 19);
   2.223 +    EXPECT_STREQ(r.ptr, "1 2 000003 0  +4 -4");
   2.224 +    fl.push_back(r.ptr);
   2.225 +
   2.226 +    r = cx_asprintf_a(&alloc, "%x %x %X %#x", 5, 10, 10, 6);
   2.227 +    EXPECT_EQ(r.length, 9);
   2.228 +    EXPECT_STREQ(r.ptr, "5 a A 0x6");
   2.229 +    fl.push_back(r.ptr);
   2.230 +
   2.231 +    r = cx_asprintf_a(&alloc, "%o %#o %#o", 10, 10, 4);
   2.232 +    EXPECT_EQ(r.length, 9);
   2.233 +    EXPECT_STREQ(r.ptr, "12 012 04");
   2.234 +    fl.push_back(r.ptr);
   2.235 +
   2.236 +    r = cx_asprintf_a(&alloc, "%f %.0f %.32f", 1.5, 1.5, 1.3);
   2.237 +    EXPECT_EQ(r.length, 45);
   2.238 +    EXPECT_STREQ(r.ptr, "1.500000 2 1.30000000000000004440892098500626");
   2.239 +    fl.push_back(r.ptr);
   2.240 +
   2.241 +    r = cx_asprintf_a(&alloc, "%05.2f %.2f %5.2f", 1.5, 1.5, 1.5);
   2.242 +    EXPECT_EQ(r.length, 16);
   2.243 +    EXPECT_STREQ(r.ptr, "01.50 1.50  1.50");
   2.244 +    fl.push_back(r.ptr);
   2.245 +
   2.246 +    r = cx_asprintf_a(&alloc, "%E %e", 1.5, 1.5);
   2.247 +    EXPECT_EQ(r.length, 25);
   2.248 +    EXPECT_STREQ(r.ptr, "1.500000E+00 1.500000e+00");
   2.249 +    fl.push_back(r.ptr);
   2.250 +
   2.251 +    r = cx_asprintf_a(&alloc, "%a %A", 1.5, 1.5);
   2.252 +    EXPECT_EQ(r.length, 17);
   2.253 +    EXPECT_STREQ(r.ptr, "0x1.8p+0 0X1.8P+0");
   2.254 +    fl.push_back(r.ptr);
   2.255 +
   2.256 +    r = cx_asprintf_a(&alloc, "0/0=%g 1/0=%g", 0.0 / 0.0, 1.0 / 0.0);
   2.257 +    EXPECT_EQ(r.length, 16);
   2.258 +    EXPECT_STREQ(r.ptr, "0/0=-nan 1/0=inf");
   2.259 +    fl.push_back(r.ptr);
   2.260 +
   2.261 +    r = cx_asprintf_a(&alloc, "'%*c'", 5, 'x');
   2.262 +    EXPECT_EQ(r.length, 7);
   2.263 +    EXPECT_STREQ(r.ptr, "'    x'");
   2.264 +    fl.push_back(r.ptr);
   2.265 +
   2.266 +    r = cx_asprintf_a(&alloc, "'%*c'", -5, 'x');
   2.267 +    EXPECT_EQ(r.length, 7);
   2.268 +    EXPECT_STREQ(r.ptr, "'x    '");
   2.269 +    fl.push_back(r.ptr);
   2.270 +
   2.271 +    for (auto c: fl) {
   2.272 +        auto s = cx_mutstrn(c, 0);
   2.273 +        cx_strfree_a(&alloc, &s);
   2.274 +    }
   2.275 +}
   2.276 +
   2.277 +TEST_F(PrintfFixture, SPrintfLargeString) {
   2.278 +    auto aaa = std::string(512, 'a');
   2.279 +    auto bbb = std::string(512, 'b');
   2.280 +
   2.281 +    auto r = cx_asprintf_a(&alloc, "After %s comes %s.", aaa.data(), bbb.data());
   2.282 +    EXPECT_EQ(r.length, 1038);
   2.283 +    EXPECT_EQ(r.ptr, std::string("After ") + aaa + " comes " + bbb + ".");
   2.284 +    EXPECT_EQ(r.ptr[1038], '\0');
   2.285 +
   2.286 +    cx_strfree_a(&alloc, &r);
   2.287 +}
   2.288 \ No newline at end of file

mercurial