summaryrefslogtreecommitdiffhomepage
path: root/public/frameworks/KernelTest.fwrk/headers/TestCase.h
blob: c040ca0f197f0ec9743f44bfd8a85472bdf73fb9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/* ========================================

  Copyright (C) 2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.

======================================== */

#pragma once

#include <KernelTest.fwrk/headers/SourceLocation.h>

/// ================================================================================
/// @brief Kernel Test Framework main header.
/// @file TestCase.h
/// ================================================================================

#define KT_RUN_TEST(OBJECT) {KTTestCase##OBJECT{}.Run();}

#define KT_MUST_PASS(MSG, LEFT_COND, RIGHT_COND)                                          \
  if (LEFT_COND != RIGHT_COND) {                                                          \
    (Kernel::Void)(Kernel::kout << "[KERNEL-TEST] BREAK: LEFT_COND: " << #LEFT_COND       \
                                << " RIGHT_COND: " << #RIGHT_COND << Kernel::kendl);      \
    (Kernel::Void)(Kernel::kout << "[KERNEL-TEST] BREAK: MSG: " << MSG << Kernel::kendl); \
    MUST_PASS(NO);                                                                        \
  } else {                                                                                \
    (Kernel::Void)(Kernel::kout << "[KERNEL-TEST] PASS: MSG: " << MSG << Kernel::kendl);  \
  }

#define KT_DECL_TEST(NAME, FN)                                       \
  class KTTestCase##NAME final {                                     \
   public:                                                           \
    explicit KTTestCase##NAME() = default;                           \
    ~KTTestCase##NAME()         = default;                           \
    LIBSYS_COPY_DELETE(KTTestCase##NAME);                            \
    Kernel::Void        Run();                                       \
    const Kernel::Char* ToString();                                  \
  };                                                                 \
  inline Kernel::Void KTTestCase##NAME::Run() {                      \
    auto ret = FN() == YES;                                          \
    if (!ret) {                                                      \
      Kernel::kout << "[KERNEL-TEST] TEST FAILED!" << Kernel::kendl; \
      MUST_PASS(ret);                                                \
    }                                                                \
  }                                                                  \
  inline const Kernel::Char* KTTestCase##NAME::ToString() {          \
    return #FN;                                                      \
  }

KT_DECL_TEST(AlwaysBreak, []() -> bool {
  KT_MUST_PASS("AlwaysBreak", YES, NO);
  return NO;
});

KT_DECL_TEST(AlwaysPass, []() -> bool {
  KT_MUST_PASS("AlwaysPass", YES, YES);
  return YES;
});