ROOT logo
// $Id$

/**************************************************************************
 * This file is property of and copyright by the ALICE HLT Project        * 
 * ALICE Experiment at CERN, All rights reserved.                         *
 *                                                                        *
 * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
 *                  for The ALICE HLT Project.                            *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/** @file   testAliHLTBlockDataCollection.C
    @author Matthias Richter
    @date   
    @brief  Test macro/program for the AliHLTBlockDataCollection
 */

#ifndef __CINT__
#include <ostream>
#include <vector>
#include "AliHLTBlockDataCollection.h"
#include "AliHLTComponent.h"
#else
#define EINVAL 22
#define EPROTO 71
#endif //__CINT__

typedef struct init_t {
  const char* arguments;
  int result;
} init_t;

typedef struct select_t {
  const char* id;
  const char* origin;
  UInt_t specification;
  int result;
} select_t;

init_t gInits[]={
  {"-datatype 'ESD_TREE' 'TPC ' ", 3},
  {"-datatype 'ESD_TREE' 'TPC ' "
   "-origin PHOS "
   "-verbosity "
   "-origin 'TRD ' "
   "-dataspec 0xdeadbeef ", 9},
  {"-datatype 'ESD_TREE'", -EPROTO},
  {NULL, 0}
};

select_t gSelections[]={
  {"ESD_TREE", "TPC ", 0, 1},
  {"DDL_RAW ", "TPC ", 0xaffe, 0},
  {"ESD_TREE", "TRD ", 0xaffe, 0},
  {"ESD_TREE", "TRD ", 0xdeadbeef, 1},
  {NULL, NULL, 0, 0}
};

int gVerbosity=0;

int InitCollection(AliHLTBlockDataCollection& collection, const char* init)
{
  // build argument vector
  int iResult=0;
  char* arguments=new char[strlen(init)+1];
  strcpy(arguments, init);
  vector<int> positions;
  bool bQuote=false;
  int i=0;
  int iStart=0;
  for (;arguments[i]!=0; i++) {
    if (arguments[i]=='\'') {
      if ((bQuote=(!bQuote))) {
	// opening quote, set start
      } else {
	// closing quote, add argument
	arguments[i]=0;
	if (i-iStart>0) positions.push_back(iStart);
      }
      iStart=i+1;
    } else if ((arguments[i]==' ' && !bQuote) ||
	       arguments[i]==0) {
      arguments[i]=0;
      if (i-iStart>0) positions.push_back(iStart);
      iStart=i+1;
    }
  }
  if (i-iStart>0) positions.push_back(iStart);

  int argc=positions.size();
  const char** argv=new const char*[argc];
  for (int j=0; j<argc ; j++) {
    argv[j]=&arguments[positions[j]];
  }

  // test argument scan
  for (i=0; i<argc; i++) {
    if (gVerbosity>1) cout << "scanning " << argc-i << " arguments: " << argv[i] << endl;
    int result=collection.ScanArgument(argc-i, &argv[i]);
    if (result>0) {
      iResult+=result;
      i+=result-1;
    } else if (result<0) {
      iResult=result;
      break;
    }
  }

  // cleanup
  delete [] argv;
  delete [] arguments;

  return iResult;
}

int testAliHLTBlockDataCollection(int verbosity=0)
{
  gVerbosity=verbosity;
  AliHLTBlockDataCollection collection;
  for (int initNo=0; gInits[initNo].arguments!=NULL; initNo++) {
    if (gVerbosity>0) cout << "checking: " << gInits[initNo].arguments << endl;
    int result=InitCollection(collection, gInits[initNo].arguments);
    if (result!=gInits[initNo].result) {
      cerr << "failed: " << initNo << " (" << gInits[initNo].arguments << ") " << ": result " << result << ", expected " << gInits[initNo].result << endl;
      return -1;
    } else {
      if (gVerbosity>1) cout << "init " << initNo << " (" << gInits[initNo].arguments << ") " << "succeeded: result " << result << endl;
    }
  }

  AliHLTComponentBlockData bd;
  AliHLTComponent::FillBlockData(bd);

  for (int selectNo=0; gSelections[selectNo].id!=NULL; selectNo++) {
    AliHLTComponent::SetDataType(bd.fDataType, gSelections[selectNo].id, gSelections[selectNo].origin );
    bd.fSpecification=gSelections[selectNo].specification;
    int result=collection.IsSelected(bd);
    if (result!=gSelections[selectNo].result) {
      cerr << "failed: block " << gSelections[selectNo].id << ":" << gSelections[selectNo].origin << " 0x" << hex << gSelections[selectNo].specification << ": result " << result << ", expected " << gSelections[selectNo].result << endl;
      return -1;
    } else {
      if (gVerbosity>0) cout << "checking: block " << gSelections[selectNo].id << ":" << gSelections[selectNo].origin << " 0x" << hex << gSelections[selectNo].specification << (result==1?" selected":" not selected") << " (correctly)" << endl;
    }
  }

  return 0;
}

int main(int /*argc*/, const char** /*argv*/)
{
  int iResult=0;
  if ((iResult=testAliHLTBlockDataCollection(1))<0) {
    cerr << "<<<<< re-run with higher verbosity >>>>>>>" << endl;
    testAliHLTBlockDataCollection(2);
  }
  return iResult;
}
 testAliHLTBlockDataCollection.C:1
 testAliHLTBlockDataCollection.C:2
 testAliHLTBlockDataCollection.C:3
 testAliHLTBlockDataCollection.C:4
 testAliHLTBlockDataCollection.C:5
 testAliHLTBlockDataCollection.C:6
 testAliHLTBlockDataCollection.C:7
 testAliHLTBlockDataCollection.C:8
 testAliHLTBlockDataCollection.C:9
 testAliHLTBlockDataCollection.C:10
 testAliHLTBlockDataCollection.C:11
 testAliHLTBlockDataCollection.C:12
 testAliHLTBlockDataCollection.C:13
 testAliHLTBlockDataCollection.C:14
 testAliHLTBlockDataCollection.C:15
 testAliHLTBlockDataCollection.C:16
 testAliHLTBlockDataCollection.C:17
 testAliHLTBlockDataCollection.C:18
 testAliHLTBlockDataCollection.C:19
 testAliHLTBlockDataCollection.C:20
 testAliHLTBlockDataCollection.C:21
 testAliHLTBlockDataCollection.C:22
 testAliHLTBlockDataCollection.C:23
 testAliHLTBlockDataCollection.C:24
 testAliHLTBlockDataCollection.C:25
 testAliHLTBlockDataCollection.C:26
 testAliHLTBlockDataCollection.C:27
 testAliHLTBlockDataCollection.C:28
 testAliHLTBlockDataCollection.C:29
 testAliHLTBlockDataCollection.C:30
 testAliHLTBlockDataCollection.C:31
 testAliHLTBlockDataCollection.C:32
 testAliHLTBlockDataCollection.C:33
 testAliHLTBlockDataCollection.C:34
 testAliHLTBlockDataCollection.C:35
 testAliHLTBlockDataCollection.C:36
 testAliHLTBlockDataCollection.C:37
 testAliHLTBlockDataCollection.C:38
 testAliHLTBlockDataCollection.C:39
 testAliHLTBlockDataCollection.C:40
 testAliHLTBlockDataCollection.C:41
 testAliHLTBlockDataCollection.C:42
 testAliHLTBlockDataCollection.C:43
 testAliHLTBlockDataCollection.C:44
 testAliHLTBlockDataCollection.C:45
 testAliHLTBlockDataCollection.C:46
 testAliHLTBlockDataCollection.C:47
 testAliHLTBlockDataCollection.C:48
 testAliHLTBlockDataCollection.C:49
 testAliHLTBlockDataCollection.C:50
 testAliHLTBlockDataCollection.C:51
 testAliHLTBlockDataCollection.C:52
 testAliHLTBlockDataCollection.C:53
 testAliHLTBlockDataCollection.C:54
 testAliHLTBlockDataCollection.C:55
 testAliHLTBlockDataCollection.C:56
 testAliHLTBlockDataCollection.C:57
 testAliHLTBlockDataCollection.C:58
 testAliHLTBlockDataCollection.C:59
 testAliHLTBlockDataCollection.C:60
 testAliHLTBlockDataCollection.C:61
 testAliHLTBlockDataCollection.C:62
 testAliHLTBlockDataCollection.C:63
 testAliHLTBlockDataCollection.C:64
 testAliHLTBlockDataCollection.C:65
 testAliHLTBlockDataCollection.C:66
 testAliHLTBlockDataCollection.C:67
 testAliHLTBlockDataCollection.C:68
 testAliHLTBlockDataCollection.C:69
 testAliHLTBlockDataCollection.C:70
 testAliHLTBlockDataCollection.C:71
 testAliHLTBlockDataCollection.C:72
 testAliHLTBlockDataCollection.C:73
 testAliHLTBlockDataCollection.C:74
 testAliHLTBlockDataCollection.C:75
 testAliHLTBlockDataCollection.C:76
 testAliHLTBlockDataCollection.C:77
 testAliHLTBlockDataCollection.C:78
 testAliHLTBlockDataCollection.C:79
 testAliHLTBlockDataCollection.C:80
 testAliHLTBlockDataCollection.C:81
 testAliHLTBlockDataCollection.C:82
 testAliHLTBlockDataCollection.C:83
 testAliHLTBlockDataCollection.C:84
 testAliHLTBlockDataCollection.C:85
 testAliHLTBlockDataCollection.C:86
 testAliHLTBlockDataCollection.C:87
 testAliHLTBlockDataCollection.C:88
 testAliHLTBlockDataCollection.C:89
 testAliHLTBlockDataCollection.C:90
 testAliHLTBlockDataCollection.C:91
 testAliHLTBlockDataCollection.C:92
 testAliHLTBlockDataCollection.C:93
 testAliHLTBlockDataCollection.C:94
 testAliHLTBlockDataCollection.C:95
 testAliHLTBlockDataCollection.C:96
 testAliHLTBlockDataCollection.C:97
 testAliHLTBlockDataCollection.C:98
 testAliHLTBlockDataCollection.C:99
 testAliHLTBlockDataCollection.C:100
 testAliHLTBlockDataCollection.C:101
 testAliHLTBlockDataCollection.C:102
 testAliHLTBlockDataCollection.C:103
 testAliHLTBlockDataCollection.C:104
 testAliHLTBlockDataCollection.C:105
 testAliHLTBlockDataCollection.C:106
 testAliHLTBlockDataCollection.C:107
 testAliHLTBlockDataCollection.C:108
 testAliHLTBlockDataCollection.C:109
 testAliHLTBlockDataCollection.C:110
 testAliHLTBlockDataCollection.C:111
 testAliHLTBlockDataCollection.C:112
 testAliHLTBlockDataCollection.C:113
 testAliHLTBlockDataCollection.C:114
 testAliHLTBlockDataCollection.C:115
 testAliHLTBlockDataCollection.C:116
 testAliHLTBlockDataCollection.C:117
 testAliHLTBlockDataCollection.C:118
 testAliHLTBlockDataCollection.C:119
 testAliHLTBlockDataCollection.C:120
 testAliHLTBlockDataCollection.C:121
 testAliHLTBlockDataCollection.C:122
 testAliHLTBlockDataCollection.C:123
 testAliHLTBlockDataCollection.C:124
 testAliHLTBlockDataCollection.C:125
 testAliHLTBlockDataCollection.C:126
 testAliHLTBlockDataCollection.C:127
 testAliHLTBlockDataCollection.C:128
 testAliHLTBlockDataCollection.C:129
 testAliHLTBlockDataCollection.C:130
 testAliHLTBlockDataCollection.C:131
 testAliHLTBlockDataCollection.C:132
 testAliHLTBlockDataCollection.C:133
 testAliHLTBlockDataCollection.C:134
 testAliHLTBlockDataCollection.C:135
 testAliHLTBlockDataCollection.C:136
 testAliHLTBlockDataCollection.C:137
 testAliHLTBlockDataCollection.C:138
 testAliHLTBlockDataCollection.C:139
 testAliHLTBlockDataCollection.C:140
 testAliHLTBlockDataCollection.C:141
 testAliHLTBlockDataCollection.C:142
 testAliHLTBlockDataCollection.C:143
 testAliHLTBlockDataCollection.C:144
 testAliHLTBlockDataCollection.C:145
 testAliHLTBlockDataCollection.C:146
 testAliHLTBlockDataCollection.C:147
 testAliHLTBlockDataCollection.C:148
 testAliHLTBlockDataCollection.C:149
 testAliHLTBlockDataCollection.C:150
 testAliHLTBlockDataCollection.C:151
 testAliHLTBlockDataCollection.C:152
 testAliHLTBlockDataCollection.C:153
 testAliHLTBlockDataCollection.C:154
 testAliHLTBlockDataCollection.C:155
 testAliHLTBlockDataCollection.C:156
 testAliHLTBlockDataCollection.C:157
 testAliHLTBlockDataCollection.C:158
 testAliHLTBlockDataCollection.C:159
 testAliHLTBlockDataCollection.C:160
 testAliHLTBlockDataCollection.C:161
 testAliHLTBlockDataCollection.C:162
 testAliHLTBlockDataCollection.C:163
 testAliHLTBlockDataCollection.C:164
 testAliHLTBlockDataCollection.C:165