summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2011-07-06 10:50:25 +0100
committerRichard W.M. Jones <rjones@redhat.com>2011-07-06 10:52:04 +0100
commitf7a11c60437afa700775eaa86a9be1a543427959 (patch)
treef6de945333ecfd1ca84c3302e5236c799a24f3db
parent24fb2c1255f751dad98dd1739b3ed3a52ce06f70 (diff)
downloadlibguestfs-f7a11c60437afa700775eaa86a9be1a543427959.tar.gz
libguestfs-f7a11c60437afa700775eaa86a9be1a543427959.tar.xz
libguestfs-f7a11c60437afa700775eaa86a9be1a543427959.zip
capitests: Allow tests to properly test optional arguments.
For optional arguments, you can now specify empty string to mean no argument, except for String optional arguments where you must use "NOARG" (empty string meaning a supplied empty string argument).
-rw-r--r--generator/generator_capitests.ml44
1 files changed, 31 insertions, 13 deletions
diff --git a/generator/generator_capitests.ml b/generator/generator_capitests.ml
index 196b1fb8..963ed514 100644
--- a/generator/generator_capitests.ml
+++ b/generator/generator_capitests.ml
@@ -774,22 +774,40 @@ and generate_test_command_call ?(expect_error = false) ?test test_name cmd =
assert false
) args;
- (* Currently can only deal with a complete, in-order list of optargs. *)
if optargs <> [] then (
pr " struct guestfs_%s_argv optargs;\n" name;
- let len = List.length style_optargs in
- let bitmask = Int64.pred (Int64.shift_left 1L len) in
+ let bitmask = List.fold_left (
+ fun bitmask optarg ->
+ let is_set =
+ match optarg with
+ | Bool n, "" -> false
+ | Bool n, "true" ->
+ pr " optargs.%s = 1;\n" n; true
+ | Bool n, "false" ->
+ pr " optargs.%s = 0;\n" n; true
+ | Bool n, arg ->
+ failwithf "boolean optional arg '%s' should be empty string or \"true\" or \"false\"" n
+ | Int n, "" -> false
+ | Int n, i ->
+ let i =
+ try int_of_string i
+ with Failure _ -> failwithf "integer optional arg '%s' should be empty string or number" n in
+ pr " optargs.%s = %d;\n" n i; true
+ | Int64 n, "" -> false
+ | Int64 n, i ->
+ let i =
+ try Int64.of_string i
+ with Failure _ -> failwithf "int64 optional arg '%s' should be empty string or number" n in
+ pr " optargs.%s = %Ld;\n" n i; true
+ | String n, "NOARG" -> false
+ | String n, arg ->
+ pr " optargs.%s = \"%s\";\n" n (c_quote arg); true
+ | _ -> assert false in
+ let bitmask = Int64.shift_left bitmask 1 in
+ let bitmask = if is_set then Int64.succ bitmask else bitmask in
+ bitmask
+ ) 0L optargs in
pr " optargs.bitmask = UINT64_C(0x%Lx);\n" bitmask;
- List.iter (
- function
- | Bool n, arg
- | Int n, arg
- | Int64 n, arg ->
- pr " optargs.%s = %s;\n" n arg
- | String n, arg ->
- pr " optargs.%s = \"%s\";\n" n (c_quote arg);
- | _ -> assert false
- ) optargs;
);
(match style_ret with