1/********************************************************************
2 * COPYRIGHT:
3 * Copyright (c) 2002-2006, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
6
7/* Created by weiv 05/09/2002 */
8
9/* Base class for data driven tests */
10
11#ifndef U_TESTFW_TESTDATA
12#define U_TESTFW_TESTDATA
13
14#include "unicode/tstdtmod.h"
15#include "unicode/datamap.h"
16
17
18 /** This is the class that abstracts one of the tests in a data file
19  *  It is usually instantiated using TestDataModule::CreateTestData method
20  *  This class provides two important methods: nextSettings and nextCase
21  *  Usually, one walks through all settings and executes all cases for
22  *  each setting. Each call to nextSettings resets the cases iterator.
23  *  Individual test cases have to have the same number of fields as the
24  *  number of entries in headers. Default headers can be specified in
25  *  the TestDataModule info section. The default headers will be overriden
26  *  by per-test headers.
27  *  Example:
28  *  DataMap *settings = NULL;
29  *  DataMap *cases = NULL;
30  *  while(nextSettings(settings, status)) {
31  *    // set settings for the subtest
32  *    while(nextCase(cases, status) {
33  *      // process testcase
34  *    }
35  *   }
36  */
37
38class T_CTEST_EXPORT_API TestData {
39  const char* name;
40
41protected:
42  DataMap *fInfo;
43  DataMap *fCurrSettings;
44  DataMap *fCurrCase;
45  int32_t fSettingsSize;
46  int32_t fCasesSize;
47  int32_t fCurrentSettings;
48  int32_t fCurrentCase;
49  /** constructor - don't use */
50  TestData(const char* name);
51
52public:
53  virtual ~TestData();
54
55  const char* getName() const;
56
57  /** Get a pointer to an object owned DataMap that contains more information on this
58   *  TestData object.
59   *  Usual fields is "Description".
60   *  @param info pass in a const DataMap pointer. If no info, it will be set to NULL
61   */
62  virtual UBool getInfo(const DataMap *& info, UErrorCode &status) const = 0;
63
64  /** Gets the next set of settings for the test. Resets the cases iterator.
65   *  DataMap is owned by the object and should not be deleted.
66   *  @param settings a DataMap pointer provided by the user. Will be NULL if
67   *                  no more settings are available.
68   *  @param status for reporting unexpected errors.
69   *  @return A boolean, TRUE if there are settings, FALSE if there is no more
70   *          settings.
71   */
72  virtual UBool nextSettings(const DataMap *& settings, UErrorCode &status) = 0;
73
74  /** Gets the next test case.
75   *  DataMap is owned by the object and should not be deleted.
76   *  @param data a DataMap pointer provided by the user. Will be NULL if
77   *                  no more cases are available.
78   *  @param status for reporting unexpected errors.
79   *  @return A boolean, TRUE if there are cases, FALSE if there is no more
80   *          cases.
81   */
82  virtual UBool nextCase(const DataMap *& data, UErrorCode &status) = 0;
83};
84
85// implementation of TestData that uses resource bundles
86
87class T_CTEST_EXPORT_API RBTestData : public TestData {
88  UResourceBundle *fData;
89  UResourceBundle *fHeaders;
90  UResourceBundle *fSettings;
91  UResourceBundle *fCases;
92
93public:
94  RBTestData(const char* name);
95  RBTestData(UResourceBundle *data, UResourceBundle *headers, UErrorCode& status);
96private:
97//  RBTestData() {};
98//  RBTestData(const RBTestData& original) {};
99  RBTestData& operator=(const RBTestData& /*original*/);
100
101public:
102  virtual ~RBTestData();
103
104  virtual UBool getInfo(const DataMap *& info, UErrorCode &status) const;
105
106  virtual UBool nextSettings(const DataMap *& settings, UErrorCode &status);
107  virtual UBool nextCase(const DataMap *& nextCase, UErrorCode &status);
108};
109
110#endif
111
112