| /* Copyright 2000-2004 Ryan Bloom | |
| * | |
| * Licensed 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. | |
| */ | |
| #include <stdarg.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <vector> | |
| #include <string> | |
| #ifdef _WIN32 | |
| #include <io.h> | |
| #else | |
| #include <unistd.h> | |
| #endif | |
| #ifndef ABTS_H | |
| #define ABTS_H | |
| #ifndef FALSE | |
| #define FALSE 0 | |
| #endif | |
| #ifndef TRUE | |
| #define TRUE 1 | |
| #endif | |
| struct sub_suite | |
| { | |
| std::string name; | |
| int num_test; | |
| std::vector<const char*> failed; | |
| int not_run; | |
| int not_impl; | |
| struct sub_suite* next; | |
| }; | |
| typedef struct sub_suite sub_suite; | |
| struct abts_suite | |
| { | |
| sub_suite* head; | |
| sub_suite* tail; | |
| }; | |
| typedef struct abts_suite abts_suite; | |
| struct abts_case | |
| { | |
| int failed; | |
| sub_suite* suite; | |
| }; | |
| typedef struct abts_case abts_case; | |
| typedef void (*test_func)(abts_case* tc, void* data); | |
| #define ADD_SUITE(suite) abts_add_suite(suite, __FILE__); | |
| abts_suite* abts_add_suite(abts_suite* suite, const char* suite_name); | |
| void abts_run_test(abts_suite* ts, const char* name, test_func f, void* value); | |
| void abts_log_message(const char* fmt, ...); | |
| void abts_int_equal(abts_case* tc, const int expected, const int actual, int lineno); | |
| void abts_int_nequal(abts_case* tc, const int expected, const int actual, int lineno); | |
| void abts_str_equal(abts_case* tc, const char* expected, const char* actual, int lineno); | |
| void abts_str_nequal(abts_case* tc, const char* expected, const char* actual, | |
| size_t n, int lineno); | |
| void abts_ptr_notnull(abts_case* tc, const void* ptr, int lineno); | |
| void abts_ptr_equal(abts_case* tc, const void* expected, const void* actual, int lineno); | |
| void abts_true(abts_case* tc, int condition, int lineno); | |
| void abts_fail(abts_case* tc, const char* message, int lineno); | |
| void abts_not_impl(abts_case* tc, const char* message, int lineno); | |
| void abts_assert(abts_case* tc, const char* message, int condition, int lineno); | |
| void abts_size_equal(abts_case* tc, size_t expected, size_t actual, int lineno); | |
| /* Convenience macros. Ryan hates these! */ | |
| #define ABTS_INT_EQUAL(a, b, c) abts_int_equal(a, b, c, __LINE__) | |
| #define ABTS_INT_NEQUAL(a, b, c) abts_int_nequal(a, b, c, __LINE__) | |
| #define ABTS_STR_EQUAL(a, b, c) abts_str_equal(a, b, c, __LINE__) | |
| #define ABTS_STR_NEQUAL(a, b, c, d) abts_str_nequal(a, b, c, d, __LINE__) | |
| #define ABTS_PTR_NOTNULL(a, b) abts_ptr_notnull(a, b, __LINE__) | |
| #define ABTS_PTR_EQUAL(a, b, c) abts_ptr_equal(a, b, c, __LINE__) | |
| #define ABTS_TRUE(a, b) abts_true(a, b, __LINE__); | |
| #define ABTS_FAIL(a, b) abts_fail(a, b, __LINE__); | |
| #define ABTS_NOT_IMPL(a, b) abts_not_impl(a, b, __LINE__); | |
| #define ABTS_ASSERT(a, b, c) abts_assert(a, b, c, __LINE__); | |
| #define ABTS_SIZE_EQUAL(a, b, c) abts_size_equal(a, b, c, __LINE__) | |
| abts_suite* run_tests(abts_suite* suite); | |
| abts_suite* run_tests1(abts_suite* suite); | |
| #endif | |