美文网首页
C++ getopt 库使用

C++ getopt 库使用

作者: wyrover | 来源:发表于2016-11-28 14:46 被阅读235次
    #include "getopt.h"
    
    #include "testfx.h"
    
    #include "testsupport.h"
    
    option null_opt = {0};
    
    TEST_F(getopt_fixture, test_getopt_long_empty) {
    
    char* argv[] = {"foo.exe"};
    
    option opts[] = {null_opt};
    
    assert_equal(-1, (char)getopt_long(count(argv), argv, "abc", opts, NULL));
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_only_nonoptions) {
    
    char* argv[] = {"foo.exe", "nonoption"};
    
    option opts[] = {null_opt};
    
    assert_equal(-1, (char)getopt_long(count(argv), argv, "a", opts, NULL));
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_only_shortopts) {
    
    char* argv[] = {"foo.exe", "-a", "-b"};
    
    option opts[] = {null_opt};
    
    assert_equal('a', (char)getopt_long(count(argv), argv, "ab", opts, NULL));
    
    assert_equal('b', (char)getopt_long(count(argv), argv, "ab", opts, NULL));
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_one_longopt) {
    
    char* argv[] = {"foo.exe", "--first", "-a"};
    
    option opts[] = {
    
    {"first", no_argument, NULL, 'f'},
    
    null_opt
    
    };
    
    assert_equal('f', (char)getopt_long(count(argv), argv, "ab", opts, NULL));
    
    assert_equal('a', (char)getopt_long(count(argv), argv, "ab", opts, NULL));
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_two_longopts) {
    
    char* argv[] = {"foo.exe", "--second", "--first"};
    
    option opts[] = {
    
    {"first", no_argument, NULL, 'f'},
    
    {"second", no_argument, NULL, 's'},
    
    null_opt
    
    };
    
    assert_equal('s', (char)getopt_long(count(argv), argv, "fs", opts, NULL));
    
    assert_equal('f', (char)getopt_long(count(argv), argv, "fs", opts, NULL));
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_abbreviated) {
    
    char* argv[] = {"foo.exe", "--fir", "--fif"};
    
    option opts[] = {
    
    {"first", no_argument, NULL, '1'},
    
    {"fifth", no_argument, NULL, '5'},
    
    null_opt
    
    };
    
    assert_equal('1', (char)getopt_long(count(argv), argv, "15", opts, NULL));
    
    assert_equal('5', (char)getopt_long(count(argv), argv, "15", opts, NULL));
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_abbreviated_with_params) {
    
    char* argv[] = {"foo.exe", "--fir=100", "--fif=500"};
    
    option opts[] = {
    
    {"first", required_argument, NULL, '1'},
    
    {"fifth", required_argument, NULL, '5'},
    
    null_opt
    
    };
    
    assert_equal('1', (char)getopt_long(count(argv), argv, "15", opts, NULL));
    
    assert_equal("100", optarg);
    
    assert_equal('5', (char)getopt_long(count(argv), argv, "15", opts, NULL));
    
    assert_equal("500", optarg);
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_ambiguous_abbrev) {
    
    char* argv[] = {"foo.exe", "--fi", "--fi"};
    
    option opts[] = {
    
    {"first", no_argument, NULL, '1'},
    
    {"fifth", no_argument, NULL, '5'},
    
    null_opt
    
    };
    
    // Ambiguous match
    
    assert_equal('?', (char)getopt_long(count(argv), argv, "15", opts, NULL));
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_longindex) {
    
    char* argv[] = {"foo.exe", "--second", "--first"};
    
    option opts[] = {
    
    {"first", no_argument, NULL, '1'},
    
    {"second", no_argument, NULL, '2'},
    
    null_opt
    
    };
    
    int longindex = -1;
    
    getopt_long(count(argv), argv, "", opts, &longindex);
    
    assert_equal(1, longindex);
    
    getopt_long(count(argv), argv, "", opts, &longindex);
    
    assert_equal(0, longindex);
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_flag) {
    
    char* argv[] = {"foo.exe", "--second", "--first"};
    
    int flag = 0;
    
    option opts[] = {
    
    {"first", no_argument, &flag, '1'},
    
    {"second", no_argument, NULL, '2'},
    
    null_opt
    
    };
    
    assert_equal('2', getopt_long(count(argv), argv, "12", opts, NULL));
    
    assert_equal(0, getopt_long(count(argv), argv, "12", opts, NULL));
    
    assert_equal('1', flag);
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_unknown) {
    
    char* argv[] = {"foo.exe", "--unknown"};
    
    option opts[] = {
    
    {"first", no_argument, NULL, '1'},
    
    {"second", no_argument, NULL, '2'},
    
    null_opt
    
    };
    
    assert_equal('?', getopt_long(count(argv), argv, "12", opts, NULL));
    
    assert_equal(2, optind); // optind should be incremented
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_required_argument_same_argv) {
    
    char* argv[] = {"foo.exe", "--arg=value"};
    
    option opts[] = {
    
    {"arg", required_argument, NULL, 'a'},
    
    null_opt
    
    };
    
    assert_equal('a', getopt_long(count(argv), argv, "a:", opts, NULL));
    
    assert_equal("value", optarg);
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_required_argument_separate_argv) {
    
    char* argv[] = {"foo.exe", "--arg", "value"};
    
    option opts[] = {
    
    {"arg", required_argument, NULL, 'a'},
    
    null_opt
    
    };
    
    assert_equal('a', getopt_long(count(argv), argv, "a:", opts, NULL));
    
    assert_equal("value", optarg);
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_missing_required_argument) {
    
    char* argv[] = {"foo.exe", "--arg"};
    
    option opts[] = {
    
    {"arg", required_argument, NULL, 'a'},
    
    null_opt
    
    };
    
    assert_equal(':', getopt_long(count(argv), argv, "a:", opts, NULL));
    
    assert_equal((char*)NULL, optarg);
    
    assert_equal(3, optind); // optind should be incremented past argc looking
    
    // for args
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_extraneous_argument) {
    
    option opts[] = {
    
    {"arg", no_argument, NULL, 'a'},
    
    null_opt
    
    };
    
    char* argv[] = {"foo.exe", "--arg=bar"};
    
    assert_equal('?', getopt_long(count(argv), argv, "a", opts, NULL));
    
    assert_equal((char*)NULL, optarg);
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_empty_required_argument) {
    
    char* argv[] = {"foo.exe", "--arg="};
    
    option opts[] = {
    
    {"arg", required_argument, NULL, 'a'},
    
    null_opt
    
    };
    
    assert_equal('a', getopt_long(count(argv), argv, "a:", opts, NULL));
    
    assert_equal("", optarg);
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_optional_argument_same_argv) {
    
    char* argv[] = {"foo.exe", "--arg=value"};
    
    option opts[] = {
    
    {"arg", optional_argument, NULL, 'a'},
    
    null_opt
    
    };
    
    assert_equal('a', getopt_long(count(argv), argv, "a::", opts, NULL));
    
    assert_equal("value", optarg);
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_optional_argument_separate_argv) {
    
    char* argv[] = {"foo.exe", "--arg", "value"};
    
    option opts[] = {
    
    {"arg", optional_argument, NULL, 'a'},
    
    null_opt
    
    };
    
    assert_equal('a', getopt_long(count(argv), argv, "a::", opts, NULL));
    
    assert_equal((char*)NULL, optarg);
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_missing_optional_argument) {
    
    char* argv[] = {"foo.exe", "--arg"};
    
    option opts[] = {
    
    {"arg", optional_argument, NULL, 'a'},
    
    null_opt
    
    };
    
    assert_equal('a', getopt_long(count(argv), argv, "a::", opts, NULL));
    
    assert_equal((char*)NULL, optarg);
    
    assert_equal(2, optind);
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_empty_optional_argument) {
    
    char* argv[] = {"foo.exe", "--arg="};
    
    option opts[] = {
    
    {"arg", optional_argument, NULL, 'a'},
    
    null_opt
    
    };
    
    assert_equal('a', getopt_long(count(argv), argv, "a::", opts, NULL));
    
    assert_equal("", optarg);
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_resets_optarg) {
    
    // First use getopt() to put something into optarg.
    
    char* argv[] = {"foo.exe", "-avalue"};
    
    assert_equal('a', getopt(count(argv), argv, "a:"));
    
    assert_equal("value", optarg);
    
    optind = 1;
    
    // Then make sure that getopt_long() doesn't get that value out
    
    // when a non-option is processed
    
    option opts[] = {
    
    {"arg", optional_argument, NULL, 'a'},
    
    null_opt
    
    };
    
    char* long_argv[] = {"foo.exe", "this"};
    
    assert_equal(-1, getopt_long(count(long_argv), long_argv, "a::", opts, NULL));
    
    assert_equal((char*)NULL, optarg);
    
    }
    
    TEST_F(getopt_fixture, test_getopt_long_resets_optopt) {
    
    // First use getopt() to put something into optopt.
    
    char* argv[] = {"foo.exe", "-z"};
    
    assert_equal('?', getopt(count(argv), argv, "a"));
    
    assert_equal('z', optopt);
    
    optind = 1;
    
    // Then make sure that getopt_long() doesn't get that value out
    
    // when a non-option is processed
    
    option opts[] = {
    
    {"arg", no_argument, NULL, 'a'},
    
    null_opt
    
    };
    
    char* long_argv[] = {"foo.exe", "--zarg"};
    
    assert_equal('?', getopt_long(count(long_argv), long_argv, "a", opts, NULL));
    
    assert_equal(0, optopt);
    
    }
    

    相关文章

      网友评论

          本文标题:C++ getopt 库使用

          本文链接:https://www.haomeiwen.com/subject/xbsopttx.html