/* HEADER Testing copy_nword */

#define ASSERT1(cond)                                           \
  do {                                                          \
    ++__test_counter;                                           \
    if ((cond))                                                 \
      printf("ok %d\n", __test_counter);                        \
    else {                                                      \
      printf("not ok %d - %d: %s failed\n",                     \
             __test_counter, __LINE__, #cond);                  \
    }                                                           \
  } while (0)

#define ASSERT2(cond, on_error)                                 \
  do {                                                          \
    ++__test_counter;                                           \
    if ((cond))                                                 \
      printf("ok %d\n", __test_counter);                        \
    else {                                                      \
      printf("not ok %d - %d: %s failed, ",                     \
             __test_counter, __LINE__, #cond);                  \
      printf on_error ;                                         \
    }                                                           \
  } while (0)

{
  /* A quoted string */
  char input[] = "\"The red rose\"";
  char output[sizeof(input)] = "";
  char* run = copy_nword(input, output, sizeof(output));
  ASSERT2(strcmp(output, "The red rose") == 0,
          ("output = >%s<\n", output));
  ASSERT1(run == NULL);
}

{
  /* Escaped quotes */
  char input[] = "\\\"The red rose\\\"";
  char output[sizeof(input)] = "";
  char* run = copy_nword(input, output, sizeof(output));
  ASSERT2(strcmp(output, "\"The") == 0, ("output = >%s<\n", output));
  ASSERT2(run == input + 6, ("run = input + %d\n", (int)(run - input)));
  run = copy_nword(run, output, sizeof(output));
  ASSERT2(strcmp(output, "red") == 0, ("output = >%s<\n", output));
  ASSERT2(run == input + 10, ("run = input + %d\n", (int)(run - input)));
  run = copy_nword(run, output, sizeof(output));
  ASSERT2(strcmp(output, "rose\"") == 0, ("output = >%s<\n", output));
  ASSERT1(run == NULL);
}

{
  /* Unterminated "-quote */
  char input[] = "\"The";
  char output[sizeof(input)] = "";
  char* run = copy_nword(input, output, sizeof(output));
  ASSERT2(strcmp(output, "The") == 0, ("output = >%s<\n", output));
  ASSERT1(run == NULL);
}

{
  /* Unterminated '-quote */
  char input[] = "\'The";
  char output[sizeof(input)] = "";
  char* run = copy_nword(input, output, sizeof(output));
  ASSERT2(strcmp(output, "The") == 0, ("output = >%s<\n", output));
  ASSERT1(run == NULL);
}

{
  /* Extract from NULL */
  char output[10] = "";
  char* run = NULL;
  run = copy_nword(run, output, sizeof(output));
  ASSERT1(run == NULL);
}

{
  /* Extract to NULL */
  char input[] = "The red rose";
  char* output = NULL;
  char* run = copy_nword(input, output, sizeof(output));
  ASSERT1(run == NULL);
}

{
  /* Long token */
  char input[] = "\"Very long token that overflows the buffer\" foo";
  char output[10] = "";
  char* run = copy_nword(input, output, sizeof(output));
  ASSERT2(strcmp(output, "Very long") == 0, ("output = >%s<\n", output));
  ASSERT2(run == input + 44, ("run = input + %d\n", (int)(run - input)));
}

{
  /* Quoted end of string / embedded \0 */
  char input[] = "The\\\0red rose";
  char output[sizeof(input)] = "";
  char* run = copy_nword(input, output, sizeof(output));
  ASSERT2(strcmp(output, "The\\") == 0, ("output = >%s<\n", output));
  ASSERT1(run == NULL);
}

{
  /* Empty string */
  char input[] = "";
  char output[sizeof(input) + 1] = "X";
  char* run = copy_nword(input, output, sizeof(output));
  ASSERT2(strcmp(output, "") == 0, ("output = >%s<\n", output));
  ASSERT2(run == NULL, ("run = >%s<\n", run));
}

{
  /* Whitespace string */
  char input[] = "    \t   ";
  char output[sizeof(input)] = "X";
  char* run = copy_nword(input, output, sizeof(output));
  ASSERT2(strcmp(output, "") == 0, ("output = >%s<\n", output));
  ASSERT2(run == NULL, ("run = >%s<\n", run));
}

{
  /* Quote, no whitespace after */
  char input[] = "\"The\"red rose";
  char output[sizeof(input)] = "";
  char* run = copy_nword(input, output, sizeof(output));
  ASSERT2(strcmp(output, "The") == 0, ("output = >%s<\n", output));
  ASSERT2(run == input + 5, ("run = input + %d\n", (int)(run - input)));
}

{
  /* Quote, no whitespace before */
  char input[] = "The\"red\" rose";
  char output[sizeof(input)] = "";
  char* run = copy_nword(input, output, sizeof(output));
  ASSERT2(strcmp(output, "The\"red\"") == 0, ("output = >%s<\n", output));
  ASSERT2(run == input + 9, ("run = input + %d\n", (int)(run - input)));
}
