summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/asmjit/test/broken.h
diff options
context:
space:
mode:
author Patrick Mackinlay <pmackinlay@hotmail.com>2020-05-28 20:24:40 +0700
committer Patrick Mackinlay <pmackinlay@hotmail.com>2020-05-28 20:24:40 +0700
commit45615b7f4b7b50df29dc14bcb74fd13850bb7633 (patch)
treed2c8c1b93d68b3fb87c06060ff3f2435301dd3b9 /3rdparty/asmjit/test/broken.h
parent3ed842c01cb666533da31a0bc0907ef8bd4a0f63 (diff)
asmjit: new 3rdparty library
Diffstat (limited to '3rdparty/asmjit/test/broken.h')
-rw-r--r--3rdparty/asmjit/test/broken.h148
1 files changed, 148 insertions, 0 deletions
diff --git a/3rdparty/asmjit/test/broken.h b/3rdparty/asmjit/test/broken.h
new file mode 100644
index 00000000000..701bc8b6e3c
--- /dev/null
+++ b/3rdparty/asmjit/test/broken.h
@@ -0,0 +1,148 @@
+// Broken - Lightweight unit testing for C++
+//
+// This is free and unencumbered software released into the public domain.
+//
+// Anyone is free to copy, modify, publish, use, compile, sell, or
+// distribute this software, either in source code form or as a compiled
+// binary, for any purpose, commercial or non-commercial, and by any
+// means.
+//
+// In jurisdictions that recognize copyright laws, the author or authors
+// of this software dedicate any and all copyright interest in the
+// software to the public domain. We make this dedication for the benefit
+// of the public at large and to the detriment of our heirs and
+// successors. We intend this dedication to be an overt act of
+// relinquishment in perpetuity of all present and future rights to this
+// software under copyright law.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+// For more information, please refer to <http://unlicense.org>
+
+#ifndef BROKEN_H_INCLUDED
+#define BROKEN_H_INCLUDED
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <utility>
+
+// Hide everything when using Doxygen. Ideally this can be protected by a macro,
+// but there is not globally and widely used one across multiple projects.
+
+//! \cond
+
+// ============================================================================
+// [Broken - API]
+// ============================================================================
+
+struct BrokenAPI {
+ //! Entry point of a unit test defined by `UNIT` macro.
+ typedef void (*Entry)(void);
+
+ enum Flags : unsigned {
+ kFlagFinished = 0x1
+ };
+
+ //! Test defined by `UNIT` macro.
+ struct Unit {
+ Entry entry;
+ const char* name;
+ int priority;
+ unsigned flags;
+ Unit* next;
+ };
+
+ //! Automatic unit registration by using static initialization.
+ struct AutoUnit : Unit {
+ inline AutoUnit(Entry entry_, const char* name_, int priority_ = 0, int dummy_ = 0) noexcept {
+ // Not used, only to trick `UNIT()` macro.
+ (void)dummy_;
+
+ this->entry = entry_;
+ this->name = name_;
+ this->priority = priority_;
+ this->flags = 0;
+ this->next = nullptr;
+ BrokenAPI::add(this);
+ }
+ };
+
+ static bool hasArg(const char* name) noexcept;
+
+ //! Register a new unit test (called automatically by `AutoUnit` and `UNIT`).
+ static void add(Unit* unit) noexcept;
+
+ //! Set output file to a `file`.
+ static void setOutputFile(FILE* file) noexcept;
+
+ //! Initialize `Broken` framework.
+ //!
+ //! Returns `true` if `run()` should be called.
+ static int run(int argc, const char* argv[], Entry onBeforeRun = nullptr, Entry onAfterRun = nullptr);
+
+ //! Log message, adds automatically new line if not present.
+ static void info(const char* fmt, ...) noexcept;
+
+ //! Called on `EXPECT()` failure.
+ static void fail(const char* file, int line, const char* expression, const char* fmt, ...) noexcept;
+
+ //! Used internally by `EXPECT` macro.
+ template<typename T>
+ static inline void expect(const char* file, int line, const char* expression, const T& result) noexcept {
+ if (!result)
+ fail(file, line, expression, nullptr);
+ }
+
+ //! Used internally by `EXPECT` macro.
+ template<typename T, typename... Args>
+ static inline void expect(const char* file, int line, const char* expression, const T& result, const char* fmt, Args&&... args) noexcept {
+ if (!result)
+ fail(file, line, expression, fmt, std::forward<Args>(args)...);
+ }
+};
+
+// ============================================================================
+// [Broken - Macros]
+// ============================================================================
+
+//! Internal macro used by `UNIT()`.
+#define BROKEN_UNIT_INTERNAL(NAME, PRIORITY) \
+ static void unit_##NAME##_entry(void); \
+ static ::BrokenAPI::AutoUnit unit_##NAME##_autoinit(unit_##NAME##_entry, #NAME, PRIORITY); \
+ static void unit_##NAME##_entry(void)
+
+//! Stringifies the expression used by EXPECT().
+#define BROKEN_STRINFIGY_EXPRESSION_INTERNAL(EXP, ...) #EXP
+
+//! \def UNIT(NAME [, PRIORITY])
+//!
+//! Define a unit test with an optional priority.
+//!
+//! `NAME` can only contain ASCII characters, numbers and underscore. It has
+//! the same rules as identifiers in C and C++.
+//!
+//! `PRIORITY` specifies the order in which unit tests are run. Lesses value
+//! increases the priority. At the moment all units are first sorted by
+//! priority and then by name - this makes the run always deterministic.
+#define UNIT(NAME, ...) BROKEN_UNIT_INTERNAL(NAME, __VA_ARGS__ + 0)
+
+//! #define INFO(FORMAT [, ...])
+//!
+//! Informative message printed to `stdout`.
+#define INFO(...) ::BrokenAPI::info(__VA_ARGS__)
+
+//! #define INFO(EXP [, FORMAT [, ...]])
+//!
+//! Expect `EXP` to be true or evaluates to true, fail otherwise.
+#define EXPECT(...) ::BrokenAPI::expect(__FILE__, __LINE__, BROKEN_STRINFIGY_EXPRESSION_INTERNAL(__VA_ARGS__), __VA_ARGS__)
+
+//! \endcond
+
+#endif // BROKEN_H_INCLUDED