1313010Sdes/* $OpenBSD: tests.c,v 1.2 2016/05/30 12:05:56 schwarze Exp $ */ 2313010Sdes/* 3313010Sdes * Regress test for the utf8.h *mprintf() API 4313010Sdes * 5313010Sdes * Written by Ingo Schwarze <schwarze@openbsd.org> in 2016 6313010Sdes * and placed in the public domain. 7313010Sdes */ 8313010Sdes 9313010Sdes#include <locale.h> 10313010Sdes#include <string.h> 11313010Sdes 12313010Sdes#include "test_helper.h" 13313010Sdes 14313010Sdes#include "utf8.h" 15313010Sdes 16313010Sdesvoid badarg(void); 17313010Sdesvoid one(const char *, const char *, int, int, int, const char *); 18313010Sdes 19313010Sdesvoid 20313010Sdesbadarg(void) 21313010Sdes{ 22313010Sdes char buf[16]; 23313010Sdes int len, width; 24313010Sdes 25313010Sdes width = 1; 26313010Sdes TEST_START("utf8_badarg"); 27313010Sdes len = snmprintf(buf, sizeof(buf), &width, "\377"); 28313010Sdes ASSERT_INT_EQ(len, -1); 29313010Sdes ASSERT_STRING_EQ(buf, ""); 30313010Sdes ASSERT_INT_EQ(width, 0); 31313010Sdes TEST_DONE(); 32313010Sdes} 33313010Sdes 34313010Sdesvoid 35313010Sdesone(const char *name, const char *mbs, int width, 36313010Sdes int wantwidth, int wantlen, const char *wants) 37313010Sdes{ 38313010Sdes char buf[16]; 39313010Sdes int *wp; 40313010Sdes int len; 41313010Sdes 42313010Sdes if (wantlen == -2) 43313010Sdes wantlen = strlen(wants); 44313010Sdes (void)strlcpy(buf, "utf8_", sizeof(buf)); 45313010Sdes (void)strlcat(buf, name, sizeof(buf)); 46313010Sdes TEST_START(buf); 47313010Sdes wp = wantwidth == -2 ? NULL : &width; 48313010Sdes len = snmprintf(buf, sizeof(buf), wp, "%s", mbs); 49313010Sdes ASSERT_INT_EQ(len, wantlen); 50313010Sdes ASSERT_STRING_EQ(buf, wants); 51313010Sdes ASSERT_INT_EQ(width, wantwidth); 52313010Sdes TEST_DONE(); 53313010Sdes} 54313010Sdes 55313010Sdesvoid 56313010Sdestests(void) 57313010Sdes{ 58313010Sdes char *loc; 59313010Sdes 60313010Sdes TEST_START("utf8_setlocale"); 61313010Sdes loc = setlocale(LC_CTYPE, "en_US.UTF-8"); 62313010Sdes ASSERT_PTR_NE(loc, NULL); 63313010Sdes TEST_DONE(); 64313010Sdes 65313010Sdes badarg(); 66313010Sdes one("null", NULL, 8, 6, 6, "(null)"); 67313010Sdes one("empty", "", 2, 0, 0, ""); 68313010Sdes one("ascii", "x", -2, -2, -2, "x"); 69313010Sdes one("newline", "a\nb", -2, -2, -2, "a\nb"); 70313010Sdes one("cr", "a\rb", -2, -2, -2, "a\rb"); 71313010Sdes one("tab", "a\tb", -2, -2, -2, "a\tb"); 72313010Sdes one("esc", "\033x", -2, -2, -2, "\\033x"); 73313010Sdes one("inv_badbyte", "\377x", -2, -2, -2, "\\377x"); 74313010Sdes one("inv_nocont", "\341x", -2, -2, -2, "\\341x"); 75313010Sdes one("inv_nolead", "a\200b", -2, -2, -2, "a\\200b"); 76313010Sdes one("sz_ascii", "1234567890123456", -2, -2, 16, "123456789012345"); 77313010Sdes one("sz_esc", "123456789012\033", -2, -2, 16, "123456789012"); 78313010Sdes one("width_ascii", "123", 2, 2, -1, "12"); 79313010Sdes one("width_double", "a\343\201\201", 2, 1, -1, "a"); 80313010Sdes one("double_fit", "a\343\201\201", 3, 3, 4, "a\343\201\201"); 81313010Sdes one("double_spc", "a\343\201\201", 4, 3, 4, "a\343\201\201"); 82313010Sdes} 83