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