blob: 064ec892f468d2a963bf1fe6c0dfeb11eba2c67f [file] [log] [blame]
/*
* "$Id: testarray.c 6649 2007-07-11 21:46:42Z mike $"
*
* Array test program for the Common UNIX Printing System (CUPS).
*
* Copyright 2007 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Apple Inc. and are protected by Federal copyright
* law. Distribution and use rights are outlined in the file "LICENSE.txt"
* which should have been included with this file. If this file is
* file is missing or damaged, see the license at "http://www.cups.org/".
*
* This file is subject to the Apple OS-Developed Software exception.
*
* Contents:
*
* main() - Main entry.
* get_seconds() - Get the current time in seconds...
* load_words() - Load words from a file.
*/
/*
* Include necessary headers...
*/
#include <stdio.h>
#include <stdlib.h>
#include <cups/string.h>
#include <errno.h>
#include "array.h"
#include "dir.h"
#include "debug.h"
/*
* Local functions...
*/
static double get_seconds(void);
static int load_words(const char *filename, cups_array_t *array);
/*
* 'main()' - Main entry.
*/
int /* O - Exit status */
main(int argc, /* I - Number of command-line arguments */
char *argv[]) /* I - Command-line arguments */
{
int i; /* Looping var */
cups_array_t *array, /* Test array */
*dup_array; /* Duplicate array */
int status; /* Exit status */
char *text; /* Text from array */
char word[256]; /* Word from file */
double start, /* Start time */
end; /* End time */
cups_dir_t *dir; /* Current directory */
cups_dentry_t *dent; /* Directory entry */
char *saved[32]; /* Saved entries */
void *data; /* User data for arrays */
/*
* No errors so far...
*/
status = 0;
/*
* cupsArrayNew()
*/
fputs("cupsArrayNew: ", stdout);
data = (void *)"testarray";
array = cupsArrayNew((cups_array_func_t)strcmp, data);
if (array)
puts("PASS");
else
{
puts("FAIL (returned NULL, expected pointer)");
status ++;
}
/*
* cupsArrayUserData()
*/
fputs("cupsArrayUserData: ", stdout);
if (cupsArrayUserData(array) == data)
puts("PASS");
else
{
printf("FAIL (returned %p instead of %p!)\n", cupsArrayUserData(array),
data);
status ++;
}
/*
* cupsArrayAdd()
*/
fputs("cupsArrayAdd: ", stdout);
if (!cupsArrayAdd(array, strdup("One Fish")))
{
puts("FAIL (\"One Fish\")");
status ++;
}
else
{
#ifdef DEBUG
putchar('\n');
for (text = (char *)cupsArrayFirst(array), i = 0;
text;
text = (char *)cupsArrayNext(array), i ++)
printf(" #1 array[%d]=\"%s\"\n", i, text);
#endif /* DEBUG */
if (!cupsArrayAdd(array, strdup("Two Fish")))
{
puts("FAIL (\"Two Fish\")");
status ++;
}
else
{
#ifdef DEBUG
for (text = (char *)cupsArrayFirst(array), i = 0;
text;
text = (char *)cupsArrayNext(array), i ++)
printf(" #2 array[%d]=\"%s\"\n", i, text);
#endif /* DEBUG */
if (!cupsArrayAdd(array, strdup("Red Fish")))
{
puts("FAIL (\"Red Fish\")");
status ++;
}
else
{
#ifdef DEBUG
for (text = (char *)cupsArrayFirst(array), i = 0;
text;
text = (char *)cupsArrayNext(array), i ++)
printf(" #3 array[%d]=\"%s\"\n", i, text);
#endif /* DEBUG */
if (!cupsArrayAdd(array, strdup("Blue Fish")))
{
puts("FAIL (\"Blue Fish\")");
status ++;
}
else
{
#ifdef DEBUG
for (text = (char *)cupsArrayFirst(array), i = 0;
text;
text = (char *)cupsArrayNext(array), i ++)
printf(" #4 array[%d]=\"%s\"\n", i, text);
#endif /* DEBUG */
puts("PASS");
}
}
}
}
/*
* cupsArrayCount()
*/
fputs("cupsArrayCount: ", stdout);
if (cupsArrayCount(array) == 4)
puts("PASS");
else
{
printf("FAIL (returned %d, expected 4)\n", cupsArrayCount(array));
status ++;
}
/*
* cupsArrayFirst()
*/
fputs("cupsArrayFirst: ", stdout);
if ((text = (char *)cupsArrayFirst(array)) != NULL &&
!strcmp(text, "Blue Fish"))
puts("PASS");
else
{
printf("FAIL (returned \"%s\", expected \"Blue Fish\")\n", text);
status ++;
}
/*
* cupsArrayNext()
*/
fputs("cupsArrayNext: ", stdout);
if ((text = (char *)cupsArrayNext(array)) != NULL &&
!strcmp(text, "One Fish"))
puts("PASS");
else
{
printf("FAIL (returned \"%s\", expected \"One Fish\")\n", text);
status ++;
}
/*
* cupsArrayLast()
*/
fputs("cupsArrayLast: ", stdout);
if ((text = (char *)cupsArrayLast(array)) != NULL &&
!strcmp(text, "Two Fish"))
puts("PASS");
else
{
printf("FAIL (returned \"%s\", expected \"Two Fish\")\n", text);
status ++;
}
/*
* cupsArrayPrev()
*/
fputs("cupsArrayPrev: ", stdout);
if ((text = (char *)cupsArrayPrev(array)) != NULL &&
!strcmp(text, "Red Fish"))
puts("PASS");
else
{
printf("FAIL (returned \"%s\", expected \"Red Fish\")\n", text);
status ++;
}
/*
* cupsArrayFind()
*/
fputs("cupsArrayFind: ", stdout);
if ((text = (char *)cupsArrayFind(array, (void *)"One Fish")) != NULL &&
!strcmp(text, "One Fish"))
puts("PASS");
else
{
printf("FAIL (returned \"%s\", expected \"One Fish\")\n", text);
status ++;
}
/*
* cupsArrayCurrent()
*/
fputs("cupsArrayCurrent: ", stdout);
if ((text = (char *)cupsArrayCurrent(array)) != NULL &&
!strcmp(text, "One Fish"))
puts("PASS");
else
{
printf("FAIL (returned \"%s\", expected \"One Fish\")\n", text);
status ++;
}
/*
* cupsArrayDup()
*/
fputs("cupsArrayDup: ", stdout);
if ((dup_array = cupsArrayDup(array)) != NULL &&
cupsArrayCount(dup_array) == 4)
puts("PASS");
else
{
printf("FAIL (returned %p with %d elements, expected pointer with 4 elements)\n",
dup_array, cupsArrayCount(dup_array));
status ++;
}
/*
* cupsArrayRemove()
*/
fputs("cupsArrayRemove: ", stdout);
if (cupsArrayRemove(array, (void *)"One Fish") &&
cupsArrayCount(array) == 3)
puts("PASS");
else
{
printf("FAIL (returned 0 with %d elements, expected 1 with 4 elements)\n",
cupsArrayCount(array));
status ++;
}
/*
* cupsArrayClear()
*/
fputs("cupsArrayClear: ", stdout);
cupsArrayClear(array);
if (cupsArrayCount(array) == 0)
puts("PASS");
else
{
printf("FAIL (%d elements, expected 0 elements)\n",
cupsArrayCount(array));
status ++;
}
/*
* Now load this source file and grab all of the unique words...
*/
fputs("Load unique words: ", stdout);
fflush(stdout);
start = get_seconds();
if ((dir = cupsDirOpen(".")) == NULL)
{
puts("FAIL (cupsDirOpen failed)");
status ++;
}
else
{
while ((dent = cupsDirRead(dir)) != NULL)
{
i = strlen(dent->filename) - 2;
if (i > 0 && dent->filename[i] == '.' &&
(dent->filename[i + 1] == 'c' ||
dent->filename[i + 1] == 'h'))
load_words(dent->filename, array);
}
cupsDirClose(dir);
end = get_seconds();
printf("%d words in %.3f seconds (%.0f words/sec), ", cupsArrayCount(array),
end - start, cupsArrayCount(array) / (end - start));
fflush(stdout);
for (text = (char *)cupsArrayFirst(array); text;)
{
/*
* Copy this word to the word buffer (safe because we strdup'd from
* the same buffer in the first place... :)
*/
strcpy(word, text);
/*
* Grab the next word and compare...
*/
if ((text = (char *)cupsArrayNext(array)) == NULL)
break;
if (strcmp(word, text) >= 0)
break;
}
if (text)
{
printf("FAIL (\"%s\" >= \"%s\"!)\n", word, text);
status ++;
}
else
puts("PASS");
}
/*
* Test deleting with iteration...
*/
fputs("Delete While Iterating: ", stdout);
text = (char *)cupsArrayFirst(array);
cupsArrayRemove(array, text);
free(text);
text = (char *)cupsArrayNext(array);
if (!text)
{
puts("FAIL (cupsArrayNext returned NULL!)");
status ++;
}
else
puts("PASS");
/*
* Test save/restore...
*/
fputs("cupsArraySave: ", stdout);
for (i = 0, text = (char *)cupsArrayFirst(array);
i < 32;
i ++, text = (char *)cupsArrayNext(array))
{
saved[i] = text;
if (!cupsArraySave(array))
break;
}
if (i < 32)
printf("FAIL (depth = %d)\n", i);
else
puts("PASS");
fputs("cupsArrayRestore: ", stdout);
while (i > 0)
{
i --;
text = cupsArrayRestore(array);
if (text != saved[i])
break;
}
if (i)
printf("FAIL (depth = %d)\n", i);
else
puts("PASS");
/*
* Delete the arrays...
*/
cupsArrayDelete(array);
cupsArrayDelete(dup_array);
/*
* Summarize the results and return...
*/
if (!status)
puts("\nALL TESTS PASSED!");
else
printf("\n%d TEST(S) FAILED!\n", status);
return (status);
}
/*
* 'get_seconds()' - Get the current time in seconds...
*/
#ifdef WIN32
# include <windows.h>
static double
get_seconds(void)
{
}
#else
# include <sys/time.h>
static double
get_seconds(void)
{
struct timeval curtime; /* Current time */
gettimeofday(&curtime, NULL);
return (curtime.tv_sec + 0.000001 * curtime.tv_usec);
}
#endif /* WIN32 */
/*
* 'load_words()' - Load words from a file.
*/
static int /* O - 1 on success, 0 on failure */
load_words(const char *filename, /* I - File to load */
cups_array_t *array) /* I - Array to add to */
{
FILE *fp; /* Test file */
char word[256]; /* Word from file */
DEBUG_printf((" Loading \"%s\"...\n", filename));
if ((fp = fopen(filename, "r")) == NULL)
{
perror(filename);
return (0);
}
while (fscanf(fp, "%255s", word) == 1)
{
if (!cupsArrayFind(array, word))
{
DEBUG_printf((" Adding \"%s\"...\n", word));
cupsArrayAdd(array, strdup(word));
}
}
fclose(fp);
return (1);
}
/*
* End of "$Id: testarray.c 6649 2007-07-11 21:46:42Z mike $".
*/