summaryrefslogtreecommitdiff
path: root/unittest
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2015-12-09 10:06:28 +0100
committerSergei Golubchik <serg@mariadb.org>2015-12-09 13:42:16 +0100
commitfa4d4fc76eb2cc74dbccf8890aad7b5e0cac59d1 (patch)
treed2e08a612b4b47252ca8f17cafaafcd429a13bc2 /unittest
parent584c07bd8808919c0b7bbc68864074af68ae5035 (diff)
downloadmariadb-git-fa4d4fc76eb2cc74dbccf8890aad7b5e0cac59d1.tar.gz
unit tests for my_getopt
Diffstat (limited to 'unittest')
-rw-r--r--unittest/mysys/CMakeLists.txt1
-rw-r--r--unittest/mysys/my_getopt-t.c71
2 files changed, 72 insertions, 0 deletions
diff --git a/unittest/mysys/CMakeLists.txt b/unittest/mysys/CMakeLists.txt
index effdd9bea1c..c4af7828e42 100644
--- a/unittest/mysys/CMakeLists.txt
+++ b/unittest/mysys/CMakeLists.txt
@@ -14,6 +14,7 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
MY_ADD_TESTS(bitmap base64 my_vsnprintf my_atomic my_rdtsc lf my_malloc
+ my_getopt
LINK_LIBRARIES mysys)
IF(WIN32)
diff --git a/unittest/mysys/my_getopt-t.c b/unittest/mysys/my_getopt-t.c
new file mode 100644
index 00000000000..afdb5e8b3b8
--- /dev/null
+++ b/unittest/mysys/my_getopt-t.c
@@ -0,0 +1,71 @@
+/* Copyright (C) 2015 MariaDB
+
+ 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 St, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include <tap.h>
+#include <my_getopt.h>
+#include <stdarg.h>
+
+ulonglong opt_ull;
+ulong opt_ul;
+int argc, res;
+char **argv, *args[100];
+
+struct my_option my_long_options[]=
+{
+ {"ull", 0, "ull", &opt_ull, &opt_ull,
+ 0, GET_ULL, REQUIRED_ARG, 1, 0, ~0ULL, 0, 0, 0},
+ {"ul", 0, "ul", &opt_ul, &opt_ul,
+ 0, GET_ULONG, REQUIRED_ARG, 1, 0, 0xFFFFFFFF, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
+};
+
+void run(const char *arg, ...)
+{
+ va_list ap;
+ va_start(ap, arg);
+ argv= args;
+ *argv++= (char*)"<skipped>";
+ while (arg)
+ {
+ *argv++= (char*)arg;
+ arg= va_arg(ap, char*);
+ }
+ va_end(ap);
+ argc= argv - args;
+ argv= args;
+ res= handle_options(&argc, &argv, my_long_options, 0);
+}
+
+int main() {
+ plan(3);
+
+ run("--ull=100", NULL);
+ ok(res==0 && argc==0 && opt_ull==100,
+ "res:%d, argc:%d, opt_ull:%llu", res, argc, opt_ull);
+
+ /*
+ negative numbers are wrapped. this is kinda questionable,
+ we might want to fix it eventually. but it'd be a change in behavior,
+ users might've got used to "-1" meaning "max possible value"
+ */
+ run("--ull=-100", NULL);
+ ok(res==0 && argc==0 && opt_ull==18446744073709551516ULL,
+ "res:%d, argc:%d, opt_ull:%llu", res, argc, opt_ull);
+ run("--ul=-100", NULL);
+ ok(res==0 && argc==0 && opt_ul==4294967295UL,
+ "res:%d, argc:%d, opt_ul:%lu", res, argc, opt_ul);
+ return exit_status();
+}
+