1*fbf5b9f8SEnji Cooper /* $NetBSD: tfmtcheck.c,v 1.3 2008/04/28 20:23:04 martin Exp $ */ 2*fbf5b9f8SEnji Cooper 3*fbf5b9f8SEnji Cooper /*- 4*fbf5b9f8SEnji Cooper * Copyright (c) 2000 The NetBSD Foundation, Inc. 5*fbf5b9f8SEnji Cooper * All rights reserved. 6*fbf5b9f8SEnji Cooper * 7*fbf5b9f8SEnji Cooper * This code was contributed to The NetBSD Foundation by Allen Briggs. 8*fbf5b9f8SEnji Cooper * 9*fbf5b9f8SEnji Cooper * Redistribution and use in source and binary forms, with or without 10*fbf5b9f8SEnji Cooper * modification, are permitted provided that the following conditions 11*fbf5b9f8SEnji Cooper * are met: 12*fbf5b9f8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 13*fbf5b9f8SEnji Cooper * notice, this list of conditions and the following disclaimer. 14*fbf5b9f8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 15*fbf5b9f8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 16*fbf5b9f8SEnji Cooper * documentation and/or other materials provided with the distribution. 17*fbf5b9f8SEnji Cooper * 18*fbf5b9f8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19*fbf5b9f8SEnji Cooper * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20*fbf5b9f8SEnji Cooper * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21*fbf5b9f8SEnji Cooper * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22*fbf5b9f8SEnji Cooper * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*fbf5b9f8SEnji Cooper * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*fbf5b9f8SEnji Cooper * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*fbf5b9f8SEnji Cooper * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*fbf5b9f8SEnji Cooper * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*fbf5b9f8SEnji Cooper * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*fbf5b9f8SEnji Cooper * POSSIBILITY OF SUCH DAMAGE. 29*fbf5b9f8SEnji Cooper */ 30*fbf5b9f8SEnji Cooper 31*fbf5b9f8SEnji Cooper #include <sys/cdefs.h> 32*fbf5b9f8SEnji Cooper __FBSDID("$FreeBSD$"); 33*fbf5b9f8SEnji Cooper 34*fbf5b9f8SEnji Cooper #include <sys/param.h> 35*fbf5b9f8SEnji Cooper #include <err.h> 36*fbf5b9f8SEnji Cooper #include <stdio.h> 37*fbf5b9f8SEnji Cooper #include <stdlib.h> 38*fbf5b9f8SEnji Cooper 39*fbf5b9f8SEnji Cooper #include <atf-c.h> 40*fbf5b9f8SEnji Cooper 41*fbf5b9f8SEnji Cooper struct test_fmt { 42*fbf5b9f8SEnji Cooper char *fmt1; 43*fbf5b9f8SEnji Cooper char *fmt2; 44*fbf5b9f8SEnji Cooper int correct; 45*fbf5b9f8SEnji Cooper } test_fmts[] = { 46*fbf5b9f8SEnji Cooper { "%d", "%d", 1 }, 47*fbf5b9f8SEnji Cooper { "%2d", "%2.2d", 1 }, 48*fbf5b9f8SEnji Cooper { "%x", "%d", 1 }, 49*fbf5b9f8SEnji Cooper { "%u", "%d", 1 }, 50*fbf5b9f8SEnji Cooper { "%03d", "%d", 1 }, 51*fbf5b9f8SEnji Cooper { "%-2d", "%d", 1 }, 52*fbf5b9f8SEnji Cooper { "%d", "%-12.1d", 1 }, 53*fbf5b9f8SEnji Cooper { "%d", "%-01.3d", 1 }, 54*fbf5b9f8SEnji Cooper { "%X", "%-01.3d", 1 }, 55*fbf5b9f8SEnji Cooper { "%D", "%ld", 1 }, 56*fbf5b9f8SEnji Cooper { "%s", "%s", 1 }, 57*fbf5b9f8SEnji Cooper { "%s", "This is a %s test", 1 }, 58*fbf5b9f8SEnji Cooper { "Hi, there. This is a %s test", "%s", 1 }, 59*fbf5b9f8SEnji Cooper { "%d", "%s", 2 }, 60*fbf5b9f8SEnji Cooper { "%e", "%s", 2 }, 61*fbf5b9f8SEnji Cooper { "%r", "%d", 2 }, 62*fbf5b9f8SEnji Cooper { "%*.2d", "%*d", 1 }, 63*fbf5b9f8SEnji Cooper { "%2.*d", "%*d", 2 }, 64*fbf5b9f8SEnji Cooper { "%*d", "%*d", 1 }, 65*fbf5b9f8SEnji Cooper { "%-3", "%d", 2 }, 66*fbf5b9f8SEnji Cooper { "%d %s", "%d", 2 }, 67*fbf5b9f8SEnji Cooper { "%*.*.*d", "%*.*.*d", 2 }, 68*fbf5b9f8SEnji Cooper { "%d", "%d %s", 1 }, 69*fbf5b9f8SEnji Cooper { "%40s", "%20s", 1 }, 70*fbf5b9f8SEnji Cooper { "%x %x %x", "%o %u %d", 1 }, 71*fbf5b9f8SEnji Cooper { "%o %u %d", "%x %x %X", 1 }, 72*fbf5b9f8SEnji Cooper { "%#o %u %#-d", "%x %#x %X", 1 }, 73*fbf5b9f8SEnji Cooper { "%qd", "%llx", 1 }, 74*fbf5b9f8SEnji Cooper { "%%", "%llx", 1 }, 75*fbf5b9f8SEnji Cooper { "%p %30s %#llx %-10.*e", "This number %lu%% and string %s has %qd numbers and %.*g floats", 1 }, 76*fbf5b9f8SEnji Cooper }; 77*fbf5b9f8SEnji Cooper 78*fbf5b9f8SEnji Cooper ATF_TC_WITHOUT_HEAD(fmtcheck_test); 79*fbf5b9f8SEnji Cooper ATF_TC_BODY(fmtcheck_test, tc) 80*fbf5b9f8SEnji Cooper { 81*fbf5b9f8SEnji Cooper int i; 82*fbf5b9f8SEnji Cooper const char *f, *cf, *f1, *f2; 83*fbf5b9f8SEnji Cooper 84*fbf5b9f8SEnji Cooper for (i = 0; i < nitems(test_fmts); i++) { 85*fbf5b9f8SEnji Cooper f1 = test_fmts[i].fmt1; 86*fbf5b9f8SEnji Cooper f2 = test_fmts[i].fmt2; 87*fbf5b9f8SEnji Cooper f = fmtcheck(f1, f2); 88*fbf5b9f8SEnji Cooper if (test_fmts[i].correct == 1) 89*fbf5b9f8SEnji Cooper cf = f1; 90*fbf5b9f8SEnji Cooper else 91*fbf5b9f8SEnji Cooper cf = f2; 92*fbf5b9f8SEnji Cooper ATF_CHECK_MSG(f == cf, 93*fbf5b9f8SEnji Cooper "Test %d: (%s) vs. (%s) failed " 94*fbf5b9f8SEnji Cooper "(should have returned %s)", i + 1, f1, f2, 95*fbf5b9f8SEnji Cooper (test_fmts[i].correct == 1) ? "1st" : "2nd"); 96*fbf5b9f8SEnji Cooper } 97*fbf5b9f8SEnji Cooper } 98*fbf5b9f8SEnji Cooper 99*fbf5b9f8SEnji Cooper ATF_TP_ADD_TCS(tp) 100*fbf5b9f8SEnji Cooper { 101*fbf5b9f8SEnji Cooper 102*fbf5b9f8SEnji Cooper ATF_TP_ADD_TC(tp, fmtcheck_test); 103*fbf5b9f8SEnji Cooper 104*fbf5b9f8SEnji Cooper return (atf_no_error()); 105*fbf5b9f8SEnji Cooper } 106