mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-01 03:53:33 +00:00
301 lines
13 KiB
C
301 lines
13 KiB
C
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||
│ │
|
||
│ This program is free software; you can redistribute it and/or modify │
|
||
│ it under the terms of the GNU General Public License as published by │
|
||
│ the Free Software Foundation; version 2 of the License. │
|
||
│ │
|
||
│ This program is distributed in the hope that it will be useful, but │
|
||
│ WITHOUT ANY WARRANTY; without even the implied warranty of │
|
||
│ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU │
|
||
│ General Public License for more details. │
|
||
│ │
|
||
│ You should have received a copy of the GNU General Public License │
|
||
│ along with this program; if not, write to the Free Software │
|
||
│ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA │
|
||
│ 02110-1301 USA │
|
||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||
#include "libc/fmt/bing.h"
|
||
#include "libc/limits.h"
|
||
#include "libc/macros.h"
|
||
#include "libc/runtime/gc.h"
|
||
#include "libc/str/str.h"
|
||
#include "libc/str/varint.h"
|
||
#include "libc/testlib/testlib.h"
|
||
#include "libc/x/x.h"
|
||
|
||
#define TV(X, B, I) __FILE__, __LINE__, #X, X, #B, B, #I, I
|
||
|
||
static const struct VarintTestVectors {
|
||
const char *file;
|
||
int line;
|
||
const char *xcode;
|
||
uint64_t x;
|
||
const char *bcode;
|
||
uint16_t b[11];
|
||
const char *icode;
|
||
uint8_t i;
|
||
} kv[] = {
|
||
{TV(0x0000000000000000ul, u" ", 1)},
|
||
{TV(0x0000000000000001ul, u"☺ ", 1)},
|
||
{TV(0x0000000000000003ul, u"♥ ", 1)},
|
||
{TV(0x0000000000000007ul, u"• ", 1)},
|
||
{TV(0x000000000000000ful, u"☼ ", 1)},
|
||
{TV(0x000000000000001ful, u"▼ ", 1)},
|
||
{TV(0x000000000000003ful, u"⁇ ", 1)},
|
||
{TV(0x000000000000007ful, u"⌂ ", 1)},
|
||
{TV(0x00000000000000fful, u"λ☺ ", 2)},
|
||
{TV(0x00000000000001fful, u"λ♥ ", 2)},
|
||
{TV(0x00000000000003fful, u"λ• ", 2)},
|
||
{TV(0x00000000000007fful, u"λ☼ ", 2)},
|
||
{TV(0x0000000000000ffful, u"λ▼ ", 2)},
|
||
{TV(0x0000000000001ffful, u"λ⁇ ", 2)},
|
||
{TV(0x0000000000003ffful, u"λ⌂ ", 2)},
|
||
{TV(0x0000000000007ffful, u"λλ☺ ", 3)},
|
||
{TV(0x000000000000fffful, u"λλ♥ ", 3)},
|
||
{TV(0x000000000001fffful, u"λλ• ", 3)},
|
||
{TV(0x000000000003fffful, u"λλ☼ ", 3)},
|
||
{TV(0x000000000007fffful, u"λλ▼ ", 3)},
|
||
{TV(0x00000000000ffffful, u"λλ⁇ ", 3)},
|
||
{TV(0x00000000001ffffful, u"λλ⌂ ", 3)},
|
||
{TV(0x00000000003ffffful, u"λλλ☺ ", 4)},
|
||
{TV(0x00000000007ffffful, u"λλλ♥ ", 4)},
|
||
{TV(0x0000000000fffffful, u"λλλ• ", 4)},
|
||
{TV(0x0000000001fffffful, u"λλλ☼ ", 4)},
|
||
{TV(0x0000000003fffffful, u"λλλ▼ ", 4)},
|
||
{TV(0x0000000007fffffful, u"λλλ⁇ ", 4)},
|
||
{TV(0x000000000ffffffful, u"λλλ⌂ ", 4)},
|
||
{TV(0x000000001ffffffful, u"λλλλ☺ ", 5)},
|
||
{TV(0x000000003ffffffful, u"λλλλ♥ ", 5)},
|
||
{TV(0x000000007ffffffful, u"λλλλ• ", 5)},
|
||
{TV(0x00000000fffffffful, u"λλλλ☼ ", 5)},
|
||
{TV(0x00000001fffffffful, u"λλλλ▼ ", 5)},
|
||
{TV(0x00000003fffffffful, u"λλλλ⁇ ", 5)},
|
||
{TV(0x00000007fffffffful, u"λλλλ⌂ ", 5)},
|
||
{TV(0x0000000ffffffffful, u"λλλλλ☺ ", 6)},
|
||
{TV(0x0000001ffffffffful, u"λλλλλ♥ ", 6)},
|
||
{TV(0x0000003ffffffffful, u"λλλλλ• ", 6)},
|
||
{TV(0x0000007ffffffffful, u"λλλλλ☼ ", 6)},
|
||
{TV(0x000000fffffffffful, u"λλλλλ▼ ", 6)},
|
||
{TV(0x000001fffffffffful, u"λλλλλ⁇ ", 6)},
|
||
{TV(0x000003fffffffffful, u"λλλλλ⌂ ", 6)},
|
||
{TV(0x000007fffffffffful, u"λλλλλλ☺ ", 7)},
|
||
{TV(0x00000ffffffffffful, u"λλλλλλ♥ ", 7)},
|
||
{TV(0x00001ffffffffffful, u"λλλλλλ• ", 7)},
|
||
{TV(0x00003ffffffffffful, u"λλλλλλ☼ ", 7)},
|
||
{TV(0x00007ffffffffffful, u"λλλλλλ▼ ", 7)},
|
||
{TV(0x0000fffffffffffful, u"λλλλλλ⁇ ", 7)},
|
||
{TV(0x0001fffffffffffful, u"λλλλλλ⌂ ", 7)},
|
||
{TV(0x0003fffffffffffful, u"λλλλλλλ☺ ", 8)},
|
||
{TV(0x0007fffffffffffful, u"λλλλλλλ♥ ", 8)},
|
||
{TV(0x000ffffffffffffful, u"λλλλλλλ• ", 8)},
|
||
{TV(0x001ffffffffffffful, u"λλλλλλλ☼ ", 8)},
|
||
{TV(0x003ffffffffffffful, u"λλλλλλλ▼ ", 8)},
|
||
{TV(0x007ffffffffffffful, u"λλλλλλλ⁇ ", 8)},
|
||
{TV(0x00fffffffffffffful, u"λλλλλλλ⌂ ", 8)},
|
||
{TV(0x01fffffffffffffful, u"λλλλλλλλ☺ ", 9)},
|
||
{TV(0x03fffffffffffffful, u"λλλλλλλλ♥ ", 9)},
|
||
{TV(0x07fffffffffffffful, u"λλλλλλλλ• ", 9)},
|
||
{TV(0x0ffffffffffffffful, u"λλλλλλλλ☼ ", 9)},
|
||
{TV(0x1ffffffffffffffful, u"λλλλλλλλ▼ ", 9)},
|
||
{TV(0x3ffffffffffffffful, u"λλλλλλλλ⁇ ", 9)},
|
||
{TV(0x7ffffffffffffffful, u"λλλλλλλλ⌂ ", 9)},
|
||
{TV(0xfffffffffffffffful, u"λλλλλλλλλ☺", 10)},
|
||
};
|
||
|
||
const struct ZigzagTestVectors {
|
||
const char *file;
|
||
int line;
|
||
const char *xcode;
|
||
int64_t x;
|
||
const char *bcode;
|
||
uint16_t b[11];
|
||
const char *icode;
|
||
uint8_t i;
|
||
} kz[] = {
|
||
{TV(0, u" ", 1)},
|
||
{TV(1, u"☻", 1)},
|
||
{TV(-1, u"☺", 1)},
|
||
{TV(2, u"♦", 1)},
|
||
{TV(-2, u"♥", 1)},
|
||
{TV(4, u"◘", 1)},
|
||
{TV(-4, u"•", 1)},
|
||
{TV(8, u"►", 1)},
|
||
{TV(-8, u"☼", 1)},
|
||
{TV(16, u" ", 1)},
|
||
{TV(-16, u"▼", 1)},
|
||
{TV(32, u"@", 1)},
|
||
{TV(-32, u"⁇", 1)},
|
||
{TV(64, u"Ç☺", 2)},
|
||
{TV(-64, u"⌂", 1)},
|
||
{TV(128, u"Ç☻", 2)},
|
||
{TV(-128, u"λ☺", 2)},
|
||
{TV(256, u"Ç♦", 2)},
|
||
{TV(-256, u"λ♥", 2)},
|
||
{TV(512, u"Ç◘", 2)},
|
||
{TV(-512, u"λ•", 2)},
|
||
{TV(1024, u"Ç►", 2)},
|
||
{TV(-1024, u"λ☼", 2)},
|
||
{TV(2048, u"Ç ", 2)},
|
||
{TV(-2048, u"λ▼", 2)},
|
||
{TV(4096, u"Ç@", 2)},
|
||
{TV(-4096, u"λ⁇", 2)},
|
||
{TV(8192, u"ÇÇ☺", 3)},
|
||
{TV(-8192, u"λ⌂", 2)},
|
||
{TV(16384, u"ÇÇ☻", 3)},
|
||
{TV(-16384, u"λλ☺", 3)},
|
||
{TV(32768, u"ÇÇ♦", 3)},
|
||
{TV(-32768, u"λλ♥", 3)},
|
||
{TV(65536, u"ÇÇ◘", 3)},
|
||
{TV(-65536, u"λλ•", 3)},
|
||
{TV(131072, u"ÇÇ►", 3)},
|
||
{TV(-131072, u"λλ☼", 3)},
|
||
{TV(262144, u"ÇÇ ", 3)},
|
||
{TV(-262144, u"λλ▼", 3)},
|
||
{TV(524288, u"ÇÇ@", 3)},
|
||
{TV(-524288, u"λλ⁇", 3)},
|
||
{TV(1048576, u"ÇÇÇ☺", 4)},
|
||
{TV(-1048576, u"λλ⌂", 3)},
|
||
{TV(2097152, u"ÇÇÇ☻", 4)},
|
||
{TV(-2097152, u"λλλ☺", 4)},
|
||
{TV(4194304, u"ÇÇÇ♦", 4)},
|
||
{TV(-4194304, u"λλλ♥", 4)},
|
||
{TV(8388608, u"ÇÇÇ◘", 4)},
|
||
{TV(-8388608, u"λλλ•", 4)},
|
||
{TV(16777216, u"ÇÇÇ►", 4)},
|
||
{TV(-16777216, u"λλλ☼", 4)},
|
||
{TV(33554432, u"ÇÇÇ ", 4)},
|
||
{TV(-33554432, u"λλλ▼", 4)},
|
||
{TV(67108864, u"ÇÇÇ@", 4)},
|
||
{TV(-67108864, u"λλλ⁇", 4)},
|
||
{TV(134217728, u"ÇÇÇÇ☺", 5)},
|
||
{TV(-134217728, u"λλλ⌂", 4)},
|
||
{TV(268435456, u"ÇÇÇÇ☻", 5)},
|
||
{TV(-268435456, u"λλλλ☺", 5)},
|
||
{TV(536870912, u"ÇÇÇÇ♦", 5)},
|
||
{TV(-536870912, u"λλλλ♥", 5)},
|
||
{TV(1073741824, u"ÇÇÇÇ◘", 5)},
|
||
{TV(-1073741824, u"λλλλ•", 5)},
|
||
{TV(2147483648, u"ÇÇÇÇ►", 5)},
|
||
{TV(-2147483648, u"λλλλ☼", 5)},
|
||
{TV(4294967296, u"ÇÇÇÇ ", 5)},
|
||
{TV(-4294967296, u"λλλλ▼", 5)},
|
||
{TV(8589934592, u"ÇÇÇÇ@", 5)},
|
||
{TV(-8589934592, u"λλλλ⁇", 5)},
|
||
{TV(17179869184, u"ÇÇÇÇÇ☺", 6)},
|
||
{TV(-17179869184, u"λλλλ⌂", 5)},
|
||
{TV(34359738368, u"ÇÇÇÇÇ☻", 6)},
|
||
{TV(-34359738368, u"λλλλλ☺", 6)},
|
||
{TV(68719476736, u"ÇÇÇÇÇ♦", 6)},
|
||
{TV(-68719476736, u"λλλλλ♥", 6)},
|
||
{TV(137438953472, u"ÇÇÇÇÇ◘", 6)},
|
||
{TV(-137438953472, u"λλλλλ•", 6)},
|
||
{TV(274877906944, u"ÇÇÇÇÇ►", 6)},
|
||
{TV(-274877906944, u"λλλλλ☼", 6)},
|
||
{TV(549755813888, u"ÇÇÇÇÇ ", 6)},
|
||
{TV(-549755813888, u"λλλλλ▼", 6)},
|
||
{TV(1099511627776, u"ÇÇÇÇÇ@", 6)},
|
||
{TV(-1099511627776, u"λλλλλ⁇", 6)},
|
||
{TV(2199023255552, u"ÇÇÇÇÇÇ☺", 7)},
|
||
{TV(-2199023255552, u"λλλλλ⌂", 6)},
|
||
{TV(4398046511104, u"ÇÇÇÇÇÇ☻", 7)},
|
||
{TV(-4398046511104, u"λλλλλλ☺", 7)},
|
||
{TV(8796093022208, u"ÇÇÇÇÇÇ♦", 7)},
|
||
{TV(-8796093022208, u"λλλλλλ♥", 7)},
|
||
{TV(17592186044416, u"ÇÇÇÇÇÇ◘", 7)},
|
||
{TV(-17592186044416, u"λλλλλλ•", 7)},
|
||
{TV(35184372088832, u"ÇÇÇÇÇÇ►", 7)},
|
||
{TV(-35184372088832, u"λλλλλλ☼", 7)},
|
||
{TV(70368744177664, u"ÇÇÇÇÇÇ ", 7)},
|
||
{TV(-70368744177664, u"λλλλλλ▼", 7)},
|
||
{TV(140737488355328, u"ÇÇÇÇÇÇ@", 7)},
|
||
{TV(-140737488355328, u"λλλλλλ⁇", 7)},
|
||
{TV(281474976710656, u"ÇÇÇÇÇÇÇ☺", 8)},
|
||
{TV(-281474976710656, u"λλλλλλ⌂", 7)},
|
||
{TV(562949953421312, u"ÇÇÇÇÇÇÇ☻", 8)},
|
||
{TV(-562949953421312, u"λλλλλλλ☺", 8)},
|
||
{TV(1125899906842624, u"ÇÇÇÇÇÇÇ♦", 8)},
|
||
{TV(-1125899906842624, u"λλλλλλλ♥", 8)},
|
||
{TV(2251799813685248, u"ÇÇÇÇÇÇÇ◘", 8)},
|
||
{TV(-2251799813685248, u"λλλλλλλ•", 8)},
|
||
{TV(4503599627370496, u"ÇÇÇÇÇÇÇ►", 8)},
|
||
{TV(-4503599627370496, u"λλλλλλλ☼", 8)},
|
||
{TV(9007199254740992, u"ÇÇÇÇÇÇÇ ", 8)},
|
||
{TV(-9007199254740992, u"λλλλλλλ▼", 8)},
|
||
{TV(18014398509481984, u"ÇÇÇÇÇÇÇ@", 8)},
|
||
{TV(-18014398509481984, u"λλλλλλλ⁇", 8)},
|
||
{TV(36028797018963968, u"ÇÇÇÇÇÇÇÇ☺", 9)},
|
||
{TV(-36028797018963968, u"λλλλλλλ⌂", 8)},
|
||
{TV(72057594037927936, u"ÇÇÇÇÇÇÇÇ☻", 9)},
|
||
{TV(-72057594037927936, u"λλλλλλλλ☺", 9)},
|
||
{TV(144115188075855872, u"ÇÇÇÇÇÇÇÇ♦", 9)},
|
||
{TV(-144115188075855872, u"λλλλλλλλ♥", 9)},
|
||
{TV(288230376151711744, u"ÇÇÇÇÇÇÇÇ◘", 9)},
|
||
{TV(-288230376151711744, u"λλλλλλλλ•", 9)},
|
||
{TV(576460752303423488, u"ÇÇÇÇÇÇÇÇ►", 9)},
|
||
{TV(-576460752303423488, u"λλλλλλλλ☼", 9)},
|
||
{TV(1152921504606846976, u"ÇÇÇÇÇÇÇÇ ", 9)},
|
||
{TV(-1152921504606846976, u"λλλλλλλλ▼", 9)},
|
||
{TV(2305843009213693952, u"ÇÇÇÇÇÇÇÇ@", 9)},
|
||
{TV(-2305843009213693952, u"λλλλλλλλ⁇", 9)},
|
||
{TV(4611686018427387904, u"ÇÇÇÇÇÇÇÇÇ☺", 10)},
|
||
{TV(-4611686018427387904, u"λλλλλλλλ⌂", 9)},
|
||
{TV(INT64_MIN, u"λλλλλλλλλ☺", 10)},
|
||
{TV(INT64_MAX, u"■λλλλλλλλ☺", 10)}, /* wut */
|
||
};
|
||
|
||
TEST(writevint, test) {
|
||
size_t i;
|
||
uint8_t b[10], *p;
|
||
for (i = 0; i < ARRAYLEN(kv); ++i) {
|
||
memset(b, 0, sizeof(b));
|
||
p = writevint(b, kv[i].x);
|
||
__TEST_EQ(assert, kz[i].file, kz[i].line, __FUNCTION__, kz[i].icode,
|
||
kz[i].xcode, kv[i].i, p - b);
|
||
assertBinaryEquals$cp437(kz[i].file, kz[i].line, __FUNCTION__, kv[i].b, b,
|
||
strlen(kv[i].b), "", false);
|
||
}
|
||
}
|
||
|
||
TEST(readvint, test) {
|
||
size_t i;
|
||
uint64_t x;
|
||
uint8_t *b, *p;
|
||
for (i = 0; i < ARRAYLEN(kv); ++i) {
|
||
b = gc(unbingstr(kv[i].b));
|
||
p = readvint(b, b + strlen(kv[i].b), &x);
|
||
__TEST_EQ(assert, kv[i].file, kv[i].line, __FUNCTION__, kv[i].icode,
|
||
kv[i].xcode, kv[i].i, (intptr_t)(p - b));
|
||
assertBinaryEquals$cp437(kv[i].file, kv[i].line, __FUNCTION__, kv[i].b, b,
|
||
strlen(kv[i].b), "", false);
|
||
}
|
||
}
|
||
|
||
TEST(writesint, test) {
|
||
size_t i;
|
||
uint8_t b[10], *p;
|
||
for (i = 0; i < ARRAYLEN(kz); ++i) {
|
||
memset(b, 0, sizeof(b));
|
||
p = writesint(b, kz[i].x);
|
||
__TEST_EQ(assert, kz[i].file, kz[i].line, __FUNCTION__, kz[i].icode,
|
||
kz[i].xcode, kz[i].i, (intptr_t)(p - b));
|
||
assertBinaryEquals$cp437(kz[i].file, kz[i].line, __FUNCTION__, kz[i].b, b,
|
||
strlen(kz[i].b), "", false);
|
||
}
|
||
}
|
||
|
||
TEST(readsint, test) {
|
||
size_t i;
|
||
int64_t x;
|
||
uint8_t *b, *p;
|
||
for (i = 0; i < ARRAYLEN(kz); ++i) {
|
||
b = gc(unbingstr(kz[i].b));
|
||
p = readsint(b, b + strlen(kz[i].b), &x);
|
||
__TEST_EQ(assert, kz[i].file, kz[i].line, __FUNCTION__, kz[i].icode,
|
||
kz[i].xcode, kz[i].i, (intptr_t)(p - b));
|
||
assertBinaryEquals$cp437(kz[i].file, kz[i].line, __FUNCTION__, kz[i].b, b,
|
||
strlen(kz[i].b), "", false);
|
||
}
|
||
}
|