Skip to content

Commit

Permalink
unit tests for my_getopt
Browse files Browse the repository at this point in the history
  • Loading branch information
vuvova committed Dec 9, 2015
1 parent 584c07b commit fa4d4fc
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 0 deletions.
1 change: 1 addition & 0 deletions unittest/mysys/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
71 changes: 71 additions & 0 deletions unittest/mysys/my_getopt-t.c
Original file line number Diff line number Diff line change
@@ -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();
}

0 comments on commit fa4d4fc

Please sign in to comment.