File size: 3,536 Bytes
78d2150 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
#include "../../unity/unity.h"
#include <stddef.h>
#include <stdbool.h>
#include <string.h>
/* setUp and tearDown required by Unity */
void setUp(void) {
/* No global setup needed. Each test initializes args appropriately. */
}
void tearDown(void) {
/* No global teardown needed. */
}
/* Tests for static bool nextarg (char const *str)
Note: 'args' is a static global declared in the program source and is visible here. */
/* Helper to assert pointer equality for args */
static void assert_args_is(char **expected) {
TEST_ASSERT_EQUAL_PTR(expected, args);
}
/* 1) No tokens: should return false and not advance */
void test_nextarg_no_tokens_returns_false_and_no_advance(void) {
char *argv[] = { NULL };
args = argv;
char **before = args;
bool r = nextarg("anything");
TEST_ASSERT_FALSE(r);
assert_args_is(before);
}
/* 2) Exact match advances once, then next call behaves from new position */
void test_nextarg_match_advances_pointer(void) {
char *argv[] = { (char*)"foo", (char*)"bar", NULL };
args = argv;
bool r1 = nextarg("foo");
TEST_ASSERT_TRUE(r1);
assert_args_is(&argv[1]);
bool r2 = nextarg("bar");
TEST_ASSERT_TRUE(r2);
assert_args_is(&argv[2]); /* Now pointing at NULL (end) */
/* At end: should return false and remain at end */
char **before = args;
bool r3 = nextarg("baz");
TEST_ASSERT_FALSE(r3);
assert_args_is(before);
}
/* 3) Non-match does not advance */
void test_nextarg_nonmatch_does_not_advance(void) {
char *argv[] = { (char*)"foo", (char*)"bar", NULL };
args = argv;
bool r = nextarg("qux");
TEST_ASSERT_FALSE(r);
assert_args_is(argv);
}
/* 4) Matching is exact, not prefix */
void test_nextarg_exact_match_only_not_prefix(void) {
char *argv[] = { (char*)"foobar", NULL };
args = argv;
bool r1 = nextarg("foo");
TEST_ASSERT_FALSE(r1);
assert_args_is(argv);
bool r2 = nextarg("foobar");
TEST_ASSERT_TRUE(r2);
assert_args_is(&argv[1]);
}
/* 5) Empty-string token and pattern handling */
void test_nextarg_empty_string_token_and_pattern(void) {
char *argv[] = { (char*)"", (char*)"x", NULL };
args = argv;
bool r1 = nextarg("");
TEST_ASSERT_TRUE(r1);
assert_args_is(&argv[1]);
bool r2 = nextarg("");
TEST_ASSERT_FALSE(r2);
assert_args_is(&argv[1]); /* Still at "x" */
}
/* 6) Interleaved matches and non-matches update pointer correctly */
void test_nextarg_interleaved_calls(void) {
char *argv[] = { (char*)"a", (char*)"b", (char*)"c", NULL };
args = argv;
/* Non-match first: no advance */
TEST_ASSERT_FALSE(nextarg("z"));
assert_args_is(argv);
/* Match 'a': advance to 'b' */
TEST_ASSERT_TRUE(nextarg("a"));
assert_args_is(&argv[1]);
/* Non-match 'a' at 'b': no advance */
TEST_ASSERT_FALSE(nextarg("a"));
assert_args_is(&argv[1]);
/* Match 'b': advance to 'c' */
TEST_ASSERT_TRUE(nextarg("b"));
assert_args_is(&argv[2]);
/* Match 'c': advance to end */
TEST_ASSERT_TRUE(nextarg("c"));
assert_args_is(&argv[3]);
/* End: further calls return false and keep pointer */
char **endpos = args;
TEST_ASSERT_FALSE(nextarg("anything"));
assert_args_is(endpos);
}
/* Unity main */
int main(void) {
UNITY_BEGIN();
RUN_TEST(test_nextarg_no_tokens_returns_false_and_no_advance);
RUN_TEST(test_nextarg_match_advances_pointer);
RUN_TEST(test_nextarg_nonmatch_does_not_advance);
RUN_TEST(test_nextarg_exact_match_only_not_prefix);
RUN_TEST(test_nextarg_empty_string_token_and_pattern);
RUN_TEST(test_nextarg_interleaved_calls);
return UNITY_END();
} |