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