1 1.1 mrg /* 2 1.1 mrg * Copyright (c) 2023, Oracle and/or its affiliates. 3 1.1 mrg * 4 1.1 mrg * Permission is hereby granted, free of charge, to any person obtaining a 5 1.1 mrg * copy of this software and associated documentation files (the "Software"), 6 1.1 mrg * to deal in the Software without restriction, including without limitation 7 1.1 mrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 1.1 mrg * and/or sell copies of the Software, and to permit persons to whom the 9 1.1 mrg * Software is furnished to do so, subject to the following conditions: 10 1.1 mrg * 11 1.1 mrg * The above copyright notice and this permission notice (including the next 12 1.1 mrg * paragraph) shall be included in all copies or substantial portions of the 13 1.1 mrg * Software. 14 1.1 mrg * 15 1.1 mrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 1.1 mrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 1.1 mrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 1.1 mrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 1.1 mrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 1.1 mrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 1.1 mrg * DEALINGS IN THE SOFTWARE. 22 1.1 mrg */ 23 1.1 mrg 24 1.1 mrg /* Test code for functions in src/StrToLong.c */ 25 1.1 mrg #include "config.h" 26 1.1 mrg #include <X11/Xmu/Converters.h> 27 1.1 mrg #include <X11/Xmd.h> 28 1.1 mrg #include <glib.h> 29 1.1 mrg 30 1.1 mrg struct TestData { 31 1.1 mrg const char *name; 32 1.1 mrg long value; 33 1.1 mrg }; 34 1.1 mrg 35 1.1 mrg static const struct TestData data[] = { 36 1.1 mrg { "0", 0 }, 37 1.1 mrg { "12345678", 12345678 }, 38 1.1 mrg { "2147483647", 2147483647 }, 39 1.1 mrg { "-2147483647", -2147483647 }, 40 1.1 mrg #ifdef LONG64 41 1.1 mrg { "9223372036854775807", 9223372036854775807L }, 42 1.1 mrg { "-9223372036854775807", -9223372036854775807L } 43 1.1 mrg #endif 44 1.1 mrg }; 45 1.1 mrg #define DATA_ENTRIES (sizeof(data) / sizeof(data[0])) 46 1.1 mrg 47 1.1 mrg static int warning_count; 48 1.1 mrg 49 1.1 mrg static void 50 1.1 mrg xt_warning_handler(String message) 51 1.1 mrg { 52 1.1 mrg g_test_message("Caught warning: %s", message ? message : "<NULL>"); 53 1.1 mrg warning_count++; 54 1.1 mrg } 55 1.1 mrg 56 1.1 mrg 57 1.1 mrg 58 1.1 mrg static void 59 1.1 mrg test_XmuCvtStringToLong(void) 60 1.1 mrg { 61 1.1 mrg XrmValue from, to, args; 62 1.1 mrg Cardinal nargs = 0; 63 1.1 mrg 64 1.1 mrg char namebuf[32]; 65 1.1 mrg 66 1.1 mrg for (unsigned int i = 0; i < DATA_ENTRIES; i++) { 67 1.1 mrg g_test_message("StringToLong(%s)", data[i].name); 68 1.1 mrg 69 1.1 mrg strncpy(namebuf, data[i].name, sizeof(namebuf) - 1); 70 1.1 mrg namebuf[sizeof(namebuf) - 1] = 0; 71 1.1 mrg from.addr = namebuf; 72 1.1 mrg from.size = sizeof(char *); 73 1.1 mrg XmuCvtStringToLong(NULL, &nargs, &from, &to); 74 1.1 mrg g_assert_cmpint(*(long *)to.addr, ==, data[i].value); 75 1.1 mrg g_assert_cmpint(to.size, ==, sizeof(long)); 76 1.1 mrg } 77 1.1 mrg 78 1.1 mrg /* Verify warning is issued for unused args */ 79 1.1 mrg warning_count = 0; 80 1.1 mrg nargs = 1; 81 1.1 mrg g_test_message("StringToLong with extra args"); 82 1.1 mrg XmuCvtStringToLong(&args, &nargs, &from, &to); 83 1.1 mrg g_assert_cmpint(warning_count, >, 0); 84 1.1 mrg 85 1.1 mrg /* Verify warning issued for non-numeric string */ 86 1.1 mrg warning_count = 0; 87 1.1 mrg from.addr = (char *) "DoesNotExist"; 88 1.1 mrg nargs = 0; 89 1.1 mrg g_test_message("StringToLong(%s)", from.addr); 90 1.1 mrg XmuCvtStringToLong(NULL, &nargs, &from, &to); 91 1.1 mrg g_assert_cmpint(warning_count, >, 0); 92 1.1 mrg 93 1.1 mrg /* Verify warning issued for empty string */ 94 1.1 mrg warning_count = 0; 95 1.1 mrg from.addr = (char *) ""; 96 1.1 mrg nargs = 0; 97 1.1 mrg g_test_message("StringToLong(%s)", from.addr); 98 1.1 mrg XmuCvtStringToLong(NULL, &nargs, &from, &to); 99 1.1 mrg g_assert_cmpint(warning_count, >, 0); 100 1.1 mrg } 101 1.1 mrg 102 1.1 mrg static void 103 1.1 mrg test_XmuCvtLongToString(void) 104 1.1 mrg { 105 1.1 mrg XrmValue from, to, args; 106 1.1 mrg long value; 107 1.1 mrg Cardinal nargs = 0; 108 1.1 mrg Boolean ret; 109 1.1 mrg char namebuf[32]; 110 1.1 mrg 111 1.1 mrg 112 1.1 mrg for (unsigned int i = 0; i < DATA_ENTRIES; i++) { 113 1.1 mrg g_test_message("LongToString(%ld)", data[i].value); 114 1.1 mrg 115 1.1 mrg value = data[i].value; 116 1.1 mrg from.addr = (XPointer) &value; 117 1.1 mrg from.size = sizeof(long *); 118 1.1 mrg 119 1.1 mrg /* First test without providing a buffer to copy the string into */ 120 1.1 mrg to.addr = NULL; 121 1.1 mrg to.size = 0; 122 1.1 mrg ret = XmuCvtLongToString(NULL, NULL, &nargs, &from, &to, NULL); 123 1.1 mrg g_assert_cmpint(ret, ==, True); 124 1.1 mrg g_assert_cmpstr(to.addr, ==, data[i].name); 125 1.1 mrg g_assert_cmpint(to.size, ==, sizeof(char *)); 126 1.1 mrg 127 1.1 mrg /* Then test with a buffer that's too small to copy the string into */ 128 1.1 mrg to.addr = namebuf; 129 1.1 mrg to.size = 1; 130 1.1 mrg ret = XmuCvtLongToString(NULL, NULL, &nargs, &from, &to, NULL); 131 1.1 mrg g_assert_cmpint(ret, ==, False); 132 1.1 mrg g_assert_cmpint(to.size, ==, strlen(data[i].name) + 1); 133 1.1 mrg 134 1.1 mrg /* Then test with a buffer that's big enough to copy the string into */ 135 1.1 mrg to.addr = namebuf; 136 1.1 mrg to.size = sizeof(namebuf); 137 1.1 mrg ret = XmuCvtLongToString(NULL, NULL, &nargs, &from, &to, NULL); 138 1.1 mrg g_assert_cmpint(ret, ==, True); 139 1.1 mrg g_assert_cmpstr(to.addr, ==, data[i].name); 140 1.1 mrg g_assert_cmpint(to.size, ==, sizeof(char *)); 141 1.1 mrg } 142 1.1 mrg 143 1.1 mrg /* Verify warning is issued for unused args */ 144 1.1 mrg warning_count = 0; 145 1.1 mrg nargs = 1; 146 1.1 mrg g_test_message("LongToString with extra args"); 147 1.1 mrg XmuCvtLongToString(NULL, &args, &nargs, &from, &to, NULL); 148 1.1 mrg g_assert_cmpint(warning_count, >, 0); 149 1.1 mrg } 150 1.1 mrg 151 1.1 mrg int 152 1.1 mrg main(int argc, char** argv) 153 1.1 mrg { 154 1.1 mrg g_test_init(&argc, &argv, NULL); 155 1.1 mrg g_test_bug_base(PACKAGE_BUGREPORT); 156 1.1 mrg 157 1.1 mrg XtSetWarningHandler(xt_warning_handler); 158 1.1 mrg 159 1.1 mrg g_test_add_func("/StrToLong/XmuCvtStringToLong", 160 1.1 mrg test_XmuCvtStringToLong); 161 1.1 mrg g_test_add_func("/StrToLong/XmuCvtLongToString", 162 1.1 mrg test_XmuCvtLongToString); 163 1.1 mrg 164 1.1 mrg 165 1.1 mrg return g_test_run(); 166 1.1 mrg } 167