16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT:
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (C) 2008-2012 IBM, Inc.   All Rights Reserved.
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This program tests string search performance.
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * APIs tested:
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICU4C
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "strsrchperf.h"
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringSearchPerformanceTest::StringSearchPerformanceTest(int32_t argc, const char *argv[], UErrorCode &status)
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org:UPerfTest(argc,argv,status){
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t start, end;
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srch = NULL;
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pttrn = NULL;
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status== U_ILLEGAL_ARGUMENT_ERROR || line_mode){
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       fprintf(stderr,gUsageString, "strsrchperf");
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       return;
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Get the Text */
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    src = getBuffer(srcLen, status);
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if 0
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Get a word to find. Do this by selecting a random word with a word breakiterator. */
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIterator* brk = ubrk_open(UBRK_WORD, locale, src, srcLen, &status);
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "FAILED to create pattern for searching. Error: %s\n", u_errorName(status));
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    start = ubrk_preceding(brk, 1000);
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    end = ubrk_following(brk, start);
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pttrnLen = end - start;
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar* temp = (UChar*)malloc(sizeof(UChar)*(pttrnLen));
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int i = 0; i < pttrnLen; i++) {
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        temp[i] = src[start++];
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pttrn = temp; /* store word in pttrn */
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_close(brk);
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* The first line of the file contains the pattern */
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    start = 0;
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(end = start; ; end += 1) {
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar ch = src[end];
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (ch == 0x000A || ch == 0x000D || ch == 0x2028) {
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pttrnLen = end - start;
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar* temp = (UChar*)malloc(sizeof(UChar)*(pttrnLen));
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int i = 0; i < pttrnLen; i++) {
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        temp[i] = src[start++];
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pttrn = temp; /* store word in pttrn */
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Create the StringSearch object to be use in performance test. */
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srch = usearch_open(pttrn, pttrnLen, src, srcLen, locale, NULL, &status);
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, "FAILED to create UPerfTest object. Error: %s\n", u_errorName(status));
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringSearchPerformanceTest::~StringSearchPerformanceTest() {
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pttrn != NULL) {
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        free(pttrn);
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (srch != NULL) {
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(srch);
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUPerfFunction* StringSearchPerformanceTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char *par) {
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch (index) {
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TESTCASE(0,Test_ICU_Forward_Search);
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TESTCASE(1,Test_ICU_Backward_Search);
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        default:
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            name = "";
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return NULL;
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return NULL;
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUPerfFunction* StringSearchPerformanceTest::Test_ICU_Forward_Search(){
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    StringSearchPerfFunction* func = new StringSearchPerfFunction(ICUForwardSearch, srch, src, srcLen, pttrn, pttrnLen);
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return func;
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUPerfFunction* StringSearchPerformanceTest::Test_ICU_Backward_Search(){
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    StringSearchPerfFunction* func = new StringSearchPerfFunction(ICUBackwardSearch, srch, src, srcLen, pttrn, pttrnLen);
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return func;
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint main (int argc, const char* argv[]) {
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    StringSearchPerformanceTest test(argc, argv, status);
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return status;
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test.run()==FALSE){
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr,"FAILED: Tests could not be run please check the arguments.\n");
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return -1;
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return 0;
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
115