Source code
Revision control
Copy as Markdown
Other Tools
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
#include "mozilla/Assertions.h"
#include "mozilla/Sprintf.h"
#include <string.h>
#include <inttypes.h>
/* Output array and poisoning method shared by all tests. */
static char gOutput[32];
static void PoisonOutput() { memset(gOutput, 0xDA, sizeof(gOutput)); }
/*
* The fprintf macros for signed integers are:
*
* PRIdN PRIdLEASTN PRIdFASTN PRIdMAX PRIdPTR
* PRIiN PRIiLEASTN PRIiFASTN PRIiMAX PRIiPTR
*
* In these names N is the width of the type as described in C99 7.18.1.
*/
static void TestPrintSigned8() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRId8, int8_t(-17));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "-17"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIi8, int8_t(42));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "42"));
}
static void TestPrintSigned16() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRId16, int16_t(-289));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "-289"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIi16, int16_t(728));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "728"));
}
static void TestPrintSigned32() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRId32, int32_t(-342178));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "-342178"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIi32, int32_t(5719283));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "5719283"));
}
static void TestPrintSigned64() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRId64, int64_t(-INT64_C(432157943248732)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "-432157943248732"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIi64, int64_t(INT64_C(325719232983)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "325719232983"));
}
static void TestPrintSignedN() {
TestPrintSigned8();
TestPrintSigned16();
TestPrintSigned32();
TestPrintSigned64();
}
static void TestPrintSignedLeast8() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIdLEAST8, int_least8_t(-17));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "-17"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIiLEAST8, int_least8_t(42));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "42"));
}
static void TestPrintSignedLeast16() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIdLEAST16, int_least16_t(-289));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "-289"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIiLEAST16, int_least16_t(728));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "728"));
}
static void TestPrintSignedLeast32() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIdLEAST32, int_least32_t(-342178));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "-342178"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIiLEAST32, int_least32_t(5719283));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "5719283"));
}
static void TestPrintSignedLeast64() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIdLEAST64,
int_least64_t(-INT64_C(432157943248732)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "-432157943248732"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIiLEAST64,
int_least64_t(INT64_C(325719232983)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "325719232983"));
}
static void TestPrintSignedLeastN() {
TestPrintSignedLeast8();
TestPrintSignedLeast16();
TestPrintSignedLeast32();
TestPrintSignedLeast64();
}
static void TestPrintSignedFast8() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIdFAST8, int_fast8_t(-17));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "-17"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIiFAST8, int_fast8_t(42));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "42"));
}
static void TestPrintSignedFast16() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIdFAST16, int_fast16_t(-289));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "-289"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIiFAST16, int_fast16_t(728));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "728"));
}
static void TestPrintSignedFast32() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIdFAST32, int_fast32_t(-342178));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "-342178"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIiFAST32, int_fast32_t(5719283));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "5719283"));
}
static void TestPrintSignedFast64() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIdFAST64,
int_fast64_t(-INT64_C(432157943248732)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "-432157943248732"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIiFAST64, int_fast64_t(INT64_C(325719232983)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "325719232983"));
}
static void TestPrintSignedFastN() {
TestPrintSignedFast8();
TestPrintSignedFast16();
TestPrintSignedFast32();
TestPrintSignedFast64();
}
static void TestPrintSignedMax() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIdMAX, intmax_t(-INTMAX_C(432157943248732)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "-432157943248732"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIiMAX, intmax_t(INTMAX_C(325719232983)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "325719232983"));
}
static void TestPrintSignedPtr() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIdPTR,
intptr_t(reinterpret_cast<void*>(12345678)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "12345678"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIiPTR,
intptr_t(reinterpret_cast<void*>(87654321)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "87654321"));
}
static void TestPrintSigned() {
TestPrintSignedN();
TestPrintSignedLeastN();
TestPrintSignedFastN();
TestPrintSignedMax();
TestPrintSignedPtr();
}
/*
* The fprintf macros for unsigned integers are:
*
* PRIoN PRIoLEASTN PRIoFASTN PRIoMAX PRIoPTR
* PRIuN PRIuLEASTN PRIuFASTN PRIuMAX PRIuPTR
* PRIxN PRIxLEASTN PRIxFASTN PRIxMAX PRIxPTR
* PRIXN PRIXLEASTN PRIXFASTN PRIXMAX PRIXPTR
*
* In these names N is the width of the type as described in C99 7.18.1.
*/
static void TestPrintUnsigned8() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIo8, uint8_t(042));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "42"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIu8, uint8_t(17));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "17"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIx8, uint8_t(0x2a));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "2a"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIX8, uint8_t(0xCD));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "CD"));
}
static void TestPrintUnsigned16() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIo16, uint16_t(04242));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "4242"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIu16, uint16_t(1717));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "1717"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIx16, uint16_t(0x2a2a));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "2a2a"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIX16, uint16_t(0xCDCD));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "CDCD"));
}
static void TestPrintUnsigned32() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIo32, uint32_t(0424242));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "424242"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIu32, uint32_t(171717));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "171717"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIx32, uint32_t(0x2a2a2a));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "2a2a2a"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIX32, uint32_t(0xCDCDCD));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "CDCDCD"));
}
static void TestPrintUnsigned64() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIo64, uint64_t(UINT64_C(0424242424242)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "424242424242"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIu64, uint64_t(UINT64_C(17171717171717171717)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "17171717171717171717"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIx64, uint64_t(UINT64_C(0x2a2a2a2a2a2a2a)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "2a2a2a2a2a2a2a"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIX64, uint64_t(UINT64_C(0xCDCDCDCDCDCD)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "CDCDCDCDCDCD"));
}
static void TestPrintUnsignedN() {
TestPrintUnsigned8();
TestPrintUnsigned16();
TestPrintUnsigned32();
TestPrintUnsigned64();
}
static void TestPrintUnsignedLeast8() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIoLEAST8, uint_least8_t(042));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "42"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIuLEAST8, uint_least8_t(17));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "17"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIxLEAST8, uint_least8_t(0x2a));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "2a"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIXLEAST8, uint_least8_t(0xCD));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "CD"));
}
static void TestPrintUnsignedLeast16() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIoLEAST16, uint_least16_t(04242));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "4242"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIuLEAST16, uint_least16_t(1717));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "1717"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIxLEAST16, uint_least16_t(0x2a2a));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "2a2a"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIXLEAST16, uint_least16_t(0xCDCD));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "CDCD"));
}
static void TestPrintUnsignedLeast32() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIoLEAST32, uint_least32_t(0424242));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "424242"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIuLEAST32, uint_least32_t(171717));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "171717"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIxLEAST32, uint_least32_t(0x2a2a2a));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "2a2a2a"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIXLEAST32, uint_least32_t(0xCDCDCD));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "CDCDCD"));
}
static void TestPrintUnsignedLeast64() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIoLEAST64,
uint_least64_t(UINT64_C(0424242424242)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "424242424242"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIuLEAST64,
uint_least64_t(UINT64_C(17171717171717171717)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "17171717171717171717"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIxLEAST64,
uint_least64_t(UINT64_C(0x2a2a2a2a2a2a2a)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "2a2a2a2a2a2a2a"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIXLEAST64,
uint_least64_t(UINT64_C(0xCDCDCDCDCDCD)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "CDCDCDCDCDCD"));
}
static void TestPrintUnsignedLeastN() {
TestPrintUnsignedLeast8();
TestPrintUnsignedLeast16();
TestPrintUnsignedLeast32();
TestPrintUnsignedLeast64();
}
static void TestPrintUnsignedFast8() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIoFAST8, uint_fast8_t(042));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "42"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIuFAST8, uint_fast8_t(17));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "17"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIxFAST8, uint_fast8_t(0x2a));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "2a"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIXFAST8, uint_fast8_t(0xCD));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "CD"));
}
static void TestPrintUnsignedFast16() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIoFAST16, uint_fast16_t(04242));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "4242"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIuFAST16, uint_fast16_t(1717));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "1717"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIxFAST16, uint_fast16_t(0x2a2a));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "2a2a"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIXFAST16, uint_fast16_t(0xCDCD));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "CDCD"));
}
static void TestPrintUnsignedFast32() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIoFAST32, uint_fast32_t(0424242));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "424242"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIuFAST32, uint_fast32_t(171717));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "171717"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIxFAST32, uint_fast32_t(0x2a2a2a));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "2a2a2a"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIXFAST32, uint_fast32_t(0xCDCDCD));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "CDCDCD"));
}
static void TestPrintUnsignedFast64() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIoFAST64,
uint_fast64_t(UINT64_C(0424242424242)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "424242424242"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIuFAST64,
uint_fast64_t(UINT64_C(17171717171717171717)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "17171717171717171717"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIxFAST64,
uint_fast64_t(UINT64_C(0x2a2a2a2a2a2a2a)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "2a2a2a2a2a2a2a"));
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIXFAST64,
uint_fast64_t(UINT64_C(0xCDCDCDCDCDCD)));
MOZ_RELEASE_ASSERT(!strcmp(gOutput, "CDCDCDCDCDCD"));
}
static void TestPrintUnsignedFastN() {
TestPrintUnsignedFast8();
TestPrintUnsignedFast16();
TestPrintUnsignedFast32();
TestPrintUnsignedFast64();
}
static void TestPrintUnsignedMax() {
PoisonOutput();
SprintfLiteral(gOutput, "%" PRIoMAX, uintmax_t(UINTMAX_C(432157943248732)));