text: /* Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  /** Clownfish::CFC::Test - An object to collect results from test runs and
   * print summaries in multiple formats.
   */
  
  #ifndef H_CFCTEST
  #define H_CFCTEST
  
  #include "charmony.h"
  
  #include <time.h>
  
  #ifdef CFC_USE_TEST_MACROS
    #define OK      CFCTest_test_true
    #define STR_EQ  CFCTest_test_string_equals
    #define INT_EQ  CFCTest_test_int_equals
    #define UINT_EQ CFCTest_test_uint_equals
    #define SKIP    CFCTest_skip
  #endif
  
  typedef struct CFCTest CFCTest;
  
  typedef struct CFCTestBatch {
      const char *name;
      int num_planned;
      void (*run)(CFCTest *test);
  } CFCTestBatch;
  
  struct CFCClass;
  struct CFCFunction;
  struct CFCMethod;
  struct CFCParamList;
  struct CFCParcel;
  struct CFCParser;
  struct CFCType;
  struct CFCVariable;
  
  /** Create a new test object.
   *
   * @param formatter_name Name of the built-in formatter that should be used
   * to create the output. Supported values are "tap" for TAP output and
   * "clownfish" for the generic Clownfish format.
   * @return a new test object.
   */
  CFCTest*
  CFCTest_new(const char *formatter_name);
  
  CFCTest*
  CFCTest_init(CFCTest *self, const char *formatter_name);
  
  void
  CFCTest_destroy(CFCTest *self);
  
  /** Run all test batches.
   *
   * @return true if all tests were successful.
   */
  int
  CFCTest_run_all(CFCTest *self, const char *test_files_dir);
  
  /** Run a test batch by name.
   *
   * @param name Name of the test batch.
   * @return true if all tests in the batch were successful.
   */
  int
  CFCTest_run_batch(CFCTest *self, const char *name, const char *test_files_dir);
  
  /** Return the full path for a test file or directory.
   */
  char*
  CFCTest_path(const char *path);
  
  /* Collect result of a test.
   *
   * @param cond Test condition. True if the test succeeded, false if it failed.
   * @param fmt printf-like format string describing the test.
   */
  void
  CFCTest_test_true(CFCTest *self, int cond, const char *fmt, ...);
  
  /* Test strings for equality and collect result.
   *
   * @param result Result string to be tested.
   * @param expected Expected result string.
   * @param fmt printf-like format string describing the test.
   */
  void
  CFCTest_test_string_equals(CFCTest *self, const char *result,
                             const char *expected, const char *fmt, ...);
  
  /* Test integers for equality and collect result.
   *
   * @param result Result integer to be tested.
   * @param expected Expected result integer.
   * @param fmt printf-like format string describing the test.
   */
  void
  CFCTest_test_int_equals(CFCTest *self, int64_t result, int64_t expected,
                          const char *fmt, ...);
  
  /* Test unsigned integers for equality and collect result.
   *
   * @param result Result integer to be tested.
   * @param expected Expected result integer.
   * @param fmt printf-like format string describing the test.
   */
  void
  CFCTest_test_uint_equals(CFCTest *self, uint64_t result, uint64_t expected,
                           const char *fmt, ...);
  
  /* Skip tests.
   *
   * @param num Number of tests to skip.
   */
  void
  CFCTest_skip(CFCTest *self, int num, const char *fmt, ...);
  
  /* Finish testing.
   *
   * @return true if tests were run and all tests were successful.
   */
  int
  CFCTest_finish(CFCTest *self);
  
  /* Utility functions for tests. */
  
  struct CFCParcel*
  CFCTest_parse_parcel(CFCTest *test, struct CFCParser *parser, const char *src);
  
  struct CFCType*
  CFCTest_parse_type(CFCTest *test, struct CFCParser *parser, const char *src);
  
  struct CFCVariable*
  CFCTest_parse_variable(CFCTest *test, struct CFCParser *parser,
                         const char *src);
  
  struct CFCParamList*
  CFCTest_parse_param_list(CFCTest *test, struct CFCParser *parser,
                           const char *src);
  
  struct CFCFunction*
  CFCTest_parse_function(CFCTest *test, struct CFCParser *parser,
                         const char *src);
  
  struct CFCMethod*
  CFCTest_parse_method(CFCTest *test, struct CFCParser *parser, const char *src);
  
  struct CFCClass*
  CFCTest_parse_class(CFCTest *test, struct CFCParser *parser, const char *src);
  
  time_t
  CFCTest_get_file_mtime(const char *path);
  
  void
  CFCTest_set_file_times(const char *path, time_t time);
  
  /* Test batch structs. */
  
  extern const CFCTestBatch CFCTEST_BATCH_CLASS;
  extern const CFCTestBatch CFCTEST_BATCH_C_BLOCK;
  extern const CFCTestBatch CFCTEST_BATCH_DOCU_COMMENT;
  extern const CFCTestBatch CFCTEST_BATCH_FILE;
  extern const CFCTestBatch CFCTEST_BATCH_FILE_SPEC;
  extern const CFCTestBatch CFCTEST_BATCH_FUNCTION;
  extern const CFCTestBatch CFCTEST_BATCH_HIERARCHY;
  extern const CFCTestBatch CFCTEST_BATCH_METHOD;
  extern const CFCTestBatch CFCTEST_BATCH_PARAM_LIST;
  extern const CFCTestBatch CFCTEST_BATCH_PARCEL;
  extern const CFCTestBatch CFCTEST_BATCH_PARSER;
  extern const CFCTestBatch CFCTEST_BATCH_SYMBOL;
  extern const CFCTestBatch CFCTEST_BATCH_TYPE;
  extern const CFCTestBatch CFCTEST_BATCH_UTIL;
  extern const CFCTestBatch CFCTEST_BATCH_VARIABLE;
  extern const CFCTestBatch CFCTEST_BATCH_VERSION;
  
  #endif /* H_CFCTEST */
  
  