diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2011-07-06 10:50:25 +0100 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2011-07-06 10:52:04 +0100 |
commit | f7a11c60437afa700775eaa86a9be1a543427959 (patch) | |
tree | f6de945333ecfd1ca84c3302e5236c799a24f3db | |
parent | 24fb2c1255f751dad98dd1739b3ed3a52ce06f70 (diff) | |
download | libguestfs-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.ml | 44 |
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 |