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 
38 class T_CTEST_EXPORT_API TestData {
39   const char* name;
40 
41 protected:
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 
52 public:
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 
87 class T_CTEST_EXPORT_API RBTestData : public TestData {
88   UResourceBundle *fData;
89   UResourceBundle *fHeaders;
90   UResourceBundle *fSettings;
91   UResourceBundle *fCases;
92 
93 public:
94   RBTestData(const char* name);
95   RBTestData(UResourceBundle *data, UResourceBundle *headers, UErrorCode& status);
96 private:
97 //  RBTestData() {};
98 //  RBTestData(const RBTestData& original) {};
99   RBTestData& operator=(const RBTestData& /*original*/);
100 
101 public:
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