185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/********************************************************************
285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * COPYRIGHT:
38393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * Copyright (C) 2008-2012 IBM, Inc.   All Rights Reserved.
485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *
585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ********************************************************************/
685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/**
785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * This program tests string search performance.
885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * APIs tested:
985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * ICU4C
1085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */
1185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "strsrchperf.h"
1385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
1485bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoStringSearchPerformanceTest::StringSearchPerformanceTest(int32_t argc, const char *argv[], UErrorCode &status)
1585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho:UPerfTest(argc,argv,status){
1685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int32_t start, end;
1785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    srch = NULL;
1885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    pttrn = NULL;
1985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(status== U_ILLEGAL_ARGUMENT_ERROR || line_mode){
2085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       fprintf(stderr,gUsageString, "strsrchperf");
2185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       return;
2285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
2385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Get the Text */
2485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    src = getBuffer(srcLen, status);
2585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
2685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if 0
2785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Get a word to find. Do this by selecting a random word with a word breakiterator. */
2885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UBreakIterator* brk = ubrk_open(UBRK_WORD, locale, src, srcLen, &status);
2985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(U_FAILURE(status)){
3085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        fprintf(stderr, "FAILED to create pattern for searching. Error: %s\n", u_errorName(status));
3185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
3285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
3385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    start = ubrk_preceding(brk, 1000);
3485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    end = ubrk_following(brk, start);
3585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    pttrnLen = end - start;
3685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar* temp = (UChar*)malloc(sizeof(UChar)*(pttrnLen));
3785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    for (int i = 0; i < pttrnLen; i++) {
3885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        temp[i] = src[start++];
3985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
4085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    pttrn = temp; /* store word in pttrn */
4185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ubrk_close(brk);
4285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#else
4385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* The first line of the file contains the pattern */
4485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    start = 0;
4585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
4685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    for(end = start; ; end += 1) {
4785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UChar ch = src[end];
4885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
4985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if (ch == 0x000A || ch == 0x000D || ch == 0x2028) {
5085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            break;
5185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
5285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
5385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
5485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    pttrnLen = end - start;
5585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UChar* temp = (UChar*)malloc(sizeof(UChar)*(pttrnLen));
5685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    for (int i = 0; i < pttrnLen; i++) {
5785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        temp[i] = src[start++];
5885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
5985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    pttrn = temp; /* store word in pttrn */
6085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif
6185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
6285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Create the StringSearch object to be use in performance test. */
6385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    srch = usearch_open(pttrn, pttrnLen, src, srcLen, locale, NULL, &status);
6485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
6585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(U_FAILURE(status)){
6685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        fprintf(stderr, "FAILED to create UPerfTest object. Error: %s\n", u_errorName(status));
6785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
6885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
6985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
7085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
7185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoStringSearchPerformanceTest::~StringSearchPerformanceTest() {
7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (pttrn != NULL) {
7485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        free(pttrn);
7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
7685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (srch != NULL) {
7785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        usearch_close(srch);
7885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
7985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
8085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoUPerfFunction* StringSearchPerformanceTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char *par) {
8285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    switch (index) {
8385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        TESTCASE(0,Test_ICU_Forward_Search);
8485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        TESTCASE(1,Test_ICU_Backward_Search);
8585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
8685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        default:
8785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            name = "";
8885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            return NULL;
8985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
9085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return NULL;
9185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
9285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
9385bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoUPerfFunction* StringSearchPerformanceTest::Test_ICU_Forward_Search(){
9485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    StringSearchPerfFunction* func = new StringSearchPerfFunction(ICUForwardSearch, srch, src, srcLen, pttrn, pttrnLen);
9585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return func;
9685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
9785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
9885bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoUPerfFunction* StringSearchPerformanceTest::Test_ICU_Backward_Search(){
9985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    StringSearchPerfFunction* func = new StringSearchPerfFunction(ICUBackwardSearch, srch, src, srcLen, pttrn, pttrnLen);
10085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return func;
10185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
10285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
10385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint main (int argc, const char* argv[]) {
10485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
10585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    StringSearchPerformanceTest test(argc, argv, status);
10685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(U_FAILURE(status)){
10785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return status;
10885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
10985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if(test.run()==FALSE){
11085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        fprintf(stderr,"FAILED: Tests could not be run please check the arguments.\n");
11185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return -1;
11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
11385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return 0;
11485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
115