pub const TESTING: &str = "// stdlib/testing.aether\n// Aether \u{6d4b}\u{8bd5}\u{6846}\u{67b6}\n// \u{63d0}\u{4f9b}\u{5355}\u{5143}\u{6d4b}\u{8bd5}\u{529f}\u{80fd}\n\n// ==================== \u{5168}\u{5c40}\u{6d4b}\u{8bd5}\u{72b6}\u{6001} ====================\n\nSet TEST_TOTAL 0\nSet TEST_PASSED 0\nSet TEST_FAILED 0\nSet TEST_CURRENT_SUITE \"\"\nSet TEST_FAILURES []\n\n// ==================== \u{65ad}\u{8a00}\u{51fd}\u{6570} ====================\n\n// \u{65ad}\u{8a00}\u{503c}\u{4e3a}\u{771f}\nFunc ASSERT_TRUE(VALUE, MESSAGE) {\n Set TEST_TOTAL (TEST_TOTAL + 1)\n \n If (VALUE) {\n Set TEST_PASSED (TEST_PASSED + 1)\n PRINTLN(\" \u{2713} \" + MESSAGE)\n Return True\n } Else {\n Set TEST_FAILED (TEST_FAILED + 1)\n Set FAILURE_MSG (\"\u{2717} \" + MESSAGE + \" - Expected True, got False\")\n PRINTLN(\" \" + FAILURE_MSG)\n Set TEST_FAILURES PUSH(TEST_FAILURES, FAILURE_MSG)\n Return False\n }\n}\n\n// \u{65ad}\u{8a00}\u{503c}\u{4e3a}\u{5047}\nFunc ASSERT_FALSE(VALUE, MESSAGE) {\n Set TEST_TOTAL (TEST_TOTAL + 1)\n \n If (!VALUE) {\n Set TEST_PASSED (TEST_PASSED + 1)\n PRINTLN(\" \u{2713} \" + MESSAGE)\n Return True\n } Else {\n Set TEST_FAILED (TEST_FAILED + 1)\n Set FAILURE_MSG (\"\u{2717} \" + MESSAGE + \" - Expected False, got True\")\n PRINTLN(\" \" + FAILURE_MSG)\n Set TEST_FAILURES PUSH(TEST_FAILURES, FAILURE_MSG)\n Return False\n }\n}\n\n// \u{65ad}\u{8a00}\u{4e24}\u{4e2a}\u{503c}\u{76f8}\u{7b49}\nFunc ASSERT_EQUAL(ACTUAL, EXPECTED, MESSAGE) {\n Set TEST_TOTAL (TEST_TOTAL + 1)\n \n If (ACTUAL == EXPECTED) {\n Set TEST_PASSED (TEST_PASSED + 1)\n PRINTLN(\" \u{2713} \" + MESSAGE)\n Return True\n } Else {\n Set TEST_FAILED (TEST_FAILED + 1)\n Set FAILURE_MSG (\"\u{2717} \" + MESSAGE + \" - Expected: \" + TO_STRING(EXPECTED) + \", Got: \" + TO_STRING(ACTUAL))\n PRINTLN(\" \" + FAILURE_MSG)\n Set TEST_FAILURES PUSH(TEST_FAILURES, FAILURE_MSG)\n Return False\n }\n}\n\n// \u{65ad}\u{8a00}\u{4e24}\u{4e2a}\u{503c}\u{4e0d}\u{76f8}\u{7b49}\nFunc ASSERT_NOT_EQUAL(ACTUAL, EXPECTED, MESSAGE) {\n Set TEST_TOTAL (TEST_TOTAL + 1)\n \n If (ACTUAL != EXPECTED) {\n Set TEST_PASSED (TEST_PASSED + 1)\n PRINTLN(\" \u{2713} \" + MESSAGE)\n Return True\n } Else {\n Set TEST_FAILED (TEST_FAILED + 1)\n Set FAILURE_MSG (\"\u{2717} \" + MESSAGE + \" - Expected values to be different, but both are: \" + TO_STRING(ACTUAL))\n PRINTLN(\" \" + FAILURE_MSG)\n Set TEST_FAILURES PUSH(TEST_FAILURES, FAILURE_MSG)\n Return False\n }\n}\n\n// \u{65ad}\u{8a00}\u{503c}\u{4e3a} null\nFunc ASSERT_NULL(VALUE, MESSAGE) {\n Set TEST_TOTAL (TEST_TOTAL + 1)\n \n If (VALUE == Null) {\n Set TEST_PASSED (TEST_PASSED + 1)\n PRINTLN(\" \u{2713} \" + MESSAGE)\n Return True\n } Else {\n Set TEST_FAILED (TEST_FAILED + 1)\n Set FAILURE_MSG (\"\u{2717} \" + MESSAGE + \" - Expected null, got: \" + TO_STRING(VALUE))\n PRINTLN(\" \" + FAILURE_MSG)\n Set TEST_FAILURES PUSH(TEST_FAILURES, FAILURE_MSG)\n Return False\n }\n}\n\n// \u{65ad}\u{8a00}\u{503c}\u{4e0d}\u{4e3a} null\nFunc ASSERT_NOT_NULL(VALUE, MESSAGE) {\n Set TEST_TOTAL (TEST_TOTAL + 1)\n \n If (VALUE != Null) {\n Set TEST_PASSED (TEST_PASSED + 1)\n PRINTLN(\" \u{2713} \" + MESSAGE)\n Return True\n } Else {\n Set TEST_FAILED (TEST_FAILED + 1)\n Set FAILURE_MSG (\"\u{2717} \" + MESSAGE + \" - Expected non-null VALUE, got null\")\n PRINTLN(\" \" + FAILURE_MSG)\n Set TEST_FAILURES PUSH(TEST_FAILURES, FAILURE_MSG)\n Return False\n }\n}\n\n// \u{65ad}\u{8a00}\u{503c}\u{5927}\u{4e8e}\u{9884}\u{671f}\u{503c}\nFunc ASSERT_GREATER(ACTUAL, EXPECTED, MESSAGE) {\n Set TEST_TOTAL (TEST_TOTAL + 1)\n \n If (ACTUAL > EXPECTED) {\n Set TEST_PASSED (TEST_PASSED + 1)\n PRINTLN(\" \u{2713} \" + MESSAGE)\n Return True\n } Else {\n Set TEST_FAILED (TEST_FAILED + 1)\n Set FAILURE_MSG (\"\u{2717} \" + MESSAGE + \" - Expected \" + TO_STRING(ACTUAL) + \" > \" + TO_STRING(EXPECTED))\n PRINTLN(\" \" + FAILURE_MSG)\n Set TEST_FAILURES PUSH(TEST_FAILURES, FAILURE_MSG)\n Return False\n }\n}\n\n// \u{65ad}\u{8a00}\u{503c}\u{5c0f}\u{4e8e}\u{9884}\u{671f}\u{503c}\nFunc ASSERT_LESS(ACTUAL, EXPECTED, MESSAGE) {\n Set TEST_TOTAL (TEST_TOTAL + 1)\n \n If (ACTUAL < EXPECTED) {\n Set TEST_PASSED (TEST_PASSED + 1)\n PRINTLN(\" \u{2713} \" + MESSAGE)\n Return True\n } Else {\n Set TEST_FAILED (TEST_FAILED + 1)\n Set FAILURE_MSG (\"\u{2717} \" + MESSAGE + \" - Expected \" + TO_STRING(ACTUAL) + \" < \" + TO_STRING(EXPECTED))\n PRINTLN(\" \" + FAILURE_MSG)\n Set TEST_FAILURES PUSH(TEST_FAILURES, FAILURE_MSG)\n Return False\n }\n}\n\n// \u{65ad}\u{8a00}\u{503c}\u{5927}\u{4e8e}\u{7b49}\u{4e8e}\u{9884}\u{671f}\u{503c}\nFunc ASSERT_GREATER_EQUAL(ACTUAL, EXPECTED, MESSAGE) {\n Set TEST_TOTAL (TEST_TOTAL + 1)\n \n If (ACTUAL >= EXPECTED) {\n Set TEST_PASSED (TEST_PASSED + 1)\n PRINTLN(\" \u{2713} \" + MESSAGE)\n Return True\n } Else {\n Set TEST_FAILED (TEST_FAILED + 1)\n Set FAILURE_MSG (\"\u{2717} \" + MESSAGE + \" - Expected \" + TO_STRING(ACTUAL) + \" >= \" + TO_STRING(EXPECTED))\n PRINTLN(\" \" + FAILURE_MSG)\n Set TEST_FAILURES PUSH(TEST_FAILURES, FAILURE_MSG)\n Return False\n }\n}\n\n// \u{65ad}\u{8a00}\u{503c}\u{5c0f}\u{4e8e}\u{7b49}\u{4e8e}\u{9884}\u{671f}\u{503c}\nFunc ASSERT_LESS_EQUAL(ACTUAL, EXPECTED, MESSAGE) {\n Set TEST_TOTAL (TEST_TOTAL + 1)\n \n If (ACTUAL <= EXPECTED) {\n Set TEST_PASSED (TEST_PASSED + 1)\n PRINTLN(\" \u{2713} \" + MESSAGE)\n Return True\n } Else {\n Set TEST_FAILED (TEST_FAILED + 1)\n Set FAILURE_MSG (\"\u{2717} \" + MESSAGE + \" - Expected \" + TO_STRING(ACTUAL) + \" <= \" + TO_STRING(EXPECTED))\n PRINTLN(\" \" + FAILURE_MSG)\n Set TEST_FAILURES PUSH(TEST_FAILURES, FAILURE_MSG)\n Return False\n }\n}\n\n// \u{65ad}\u{8a00}\u{6570}\u{7ec4}\u{5305}\u{542b}\u{67d0}\u{4e2a}\u{503c}\nFunc ASSERT_CONTAINS(ARR, VALUE, MESSAGE) {\n Set TEST_TOTAL (TEST_TOTAL + 1)\n Set LEN LEN(ARR)\n Set FOUND False\n Set I 0\n \n While (I < LEN) {\n If (ARR[I] == VALUE) {\n Set FOUND True\n Break\n }\n Set I (I + 1)\n }\n \n If (FOUND) {\n Set TEST_PASSED (TEST_PASSED + 1)\n PRINTLN(\" \u{2713} \" + MESSAGE)\n Return True\n } Else {\n Set TEST_FAILED (TEST_FAILED + 1)\n Set FAILURE_MSG (\"\u{2717} \" + MESSAGE + \" - Array does not contain: \" + TO_STRING(VALUE))\n PRINTLN(\" \" + FAILURE_MSG)\n Set TEST_FAILURES PUSH(TEST_FAILURES, FAILURE_MSG)\n Return False\n }\n}\n\n// \u{65ad}\u{8a00}\u{6570}\u{7ec4}\u{957f}\u{5ea6}\nFunc ASSERT_LENGTH(ARR, EXPECTED_LEN, MESSAGE) {\n Set TEST_TOTAL (TEST_TOTAL + 1)\n Set ACTUAL_LEN LEN(ARR)\n \n If (ACTUAL_LEN == EXPECTED_LEN) {\n Set TEST_PASSED (TEST_PASSED + 1)\n PRINTLN(\" \u{2713} \" + MESSAGE)\n Return True\n } Else {\n Set TEST_FAILED (TEST_FAILED + 1)\n Set FAILURE_MSG (\"\u{2717} \" + MESSAGE + \" - Expected length: \" + TO_STRING(EXPECTED_LEN) + \", Got: \" + TO_STRING(ACTUAL_LEN))\n PRINTLN(\" \" + FAILURE_MSG)\n Set TEST_FAILURES PUSH(TEST_FAILURES, FAILURE_MSG)\n Return False\n }\n}\n\n// \u{65ad}\u{8a00}\u{7c7b}\u{578b}\nFunc ASSERT_TYPE(VALUE, EXPECTED_TYPE, MESSAGE) {\n Set TEST_TOTAL (TEST_TOTAL + 1)\n Set ACTUAL_TYPE TYPE(VALUE)\n \n If (ACTUAL_TYPE == EXPECTED_TYPE) {\n Set TEST_PASSED (TEST_PASSED + 1)\n PRINTLN(\" \u{2713} \" + MESSAGE)\n Return True\n } Else {\n Set TEST_FAILED (TEST_FAILED + 1)\n Set FAILURE_MSG (\"\u{2717} \" + MESSAGE + \" - Expected type: \" + EXPECTED_TYPE + \", Got: \" + ACTUAL_TYPE)\n PRINTLN(\" \" + FAILURE_MSG)\n Set TEST_FAILURES PUSH(TEST_FAILURES, FAILURE_MSG)\n Return False\n }\n}\n\n// ==================== \u{6d4b}\u{8bd5}\u{5957}\u{4ef6}\u{7ba1}\u{7406} ====================\n\n// \u{5f00}\u{59cb}\u{4e00}\u{4e2a}\u{65b0}\u{7684}\u{6d4b}\u{8bd5}\u{5957}\u{4ef6}\nFunc TEST_SUITE(SUITE_NAME) {\n Set TEST_CURRENT_SUITE SUITE_NAME\n PRINTLN(\"\")\n PRINTLN(\"\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\")\n PRINTLN(\"Test Suite: \" + SUITE_NAME)\n PRINTLN(\"\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\")\n}\n\n// \u{5f00}\u{59cb}\u{4e00}\u{4e2a}\u{6d4b}\u{8bd5}\u{7528}\u{4f8b}\nFunc TEST_CASE(CASE_NAME) {\n PRINTLN(\"\")\n PRINTLN(\"\u{25b6} \" + CASE_NAME)\n}\n\n// ==================== \u{6d4b}\u{8bd5}\u{7ed3}\u{679c}\u{62a5}\u{544a} ====================\n\n// \u{6253}\u{5370}\u{6d4b}\u{8bd5}\u{6458}\u{8981}\nFunc TEST_SUMMARY() {\n PRINTLN(\"\")\n PRINTLN(\"\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\")\n PRINTLN(\"Test Summary\")\n PRINTLN(\"\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\")\n PRINTLN(\"Total Tests: \" + TO_STRING(TEST_TOTAL))\n PRINTLN(\"Passed: \" + TO_STRING(TEST_PASSED) + \" \u{2713}\")\n PRINTLN(\"Failed: \" + TO_STRING(TEST_FAILED) + \" \u{2717}\")\n \n If (TEST_TOTAL > 0) {\n Set PASS_RATE ((TEST_PASSED * 100) / TEST_TOTAL)\n PRINTLN(\"Pass Rate: \" + TO_STRING(PASS_RATE) + \"%\")\n }\n \n If (TEST_FAILED > 0) {\n PRINTLN(\"\")\n PRINTLN(\"Failed Tests:\")\n PRINTLN(\"\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\")\n Set I 0\n Set FAIL_LEN LEN(TEST_FAILURES)\n While (I < FAIL_LEN) {\n PRINTLN(TO_STRING(I + 1) + \". \" + TEST_FAILURES[I])\n Set I (I + 1)\n }\n }\n \n PRINTLN(\"\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\u{2550}\")\n \n If (TEST_FAILED == 0) {\n PRINTLN(\"\u{1f389} All tests passed!\")\n Return True\n } Else {\n PRINTLN(\"\u{274c} Some tests failed.\")\n Return False\n }\n}\n\n// \u{91cd}\u{7f6e}\u{6d4b}\u{8bd5}\u{8ba1}\u{6570}\u{5668}\nFunc TEST_RESET() {\n Set TEST_TOTAL 0\n Set TEST_PASSED 0\n Set TEST_FAILED 0\n Set TEST_CURRENT_SUITE \"\"\n Set TEST_FAILURES []\n PRINTLN(\"Test counters reset.\")\n}\n\n// ==================== \u{6027}\u{80fd}\u{6d4b}\u{8bd5} ====================\n\n// \u{6027}\u{80fd}\u{6d4b}\u{8bd5}\u{8f85}\u{52a9}\u{51fd}\u{6570}\u{ff08}\u{8bb0}\u{5f55}\u{5f00}\u{59cb}\u{65f6}\u{95f4}\u{ff09}\nFunc PERF_START() {\n PRINTLN(\"\u{23f1} Performance test started...\")\n // \u{6ce8}\u{610f}\u{ff1a}Aether \u{53ef}\u{80fd}\u{6ca1}\u{6709}\u{5185}\u{7f6e}\u{65f6}\u{95f4}\u{51fd}\u{6570}\u{ff0c}\u{8fd9}\u{91cc}\u{53ea}\u{662f}\u{5360}\u{4f4d}\n Return 0\n}\n\n// \u{6027}\u{80fd}\u{6d4b}\u{8bd5}\u{8f85}\u{52a9}\u{51fd}\u{6570}\u{ff08}\u{8bb0}\u{5f55}\u{7ed3}\u{675f}\u{65f6}\u{95f4}\u{5e76}\u{62a5}\u{544a}\u{ff09}\nFunc PERF_END(START_TIME, OPERATION_NAME) {\n // \u{6ce8}\u{610f}\u{ff1a}Aether \u{53ef}\u{80fd}\u{6ca1}\u{6709}\u{5185}\u{7f6e}\u{65f6}\u{95f4}\u{51fd}\u{6570}\u{ff0c}\u{8fd9}\u{91cc}\u{53ea}\u{662f}\u{5360}\u{4f4d}\n Set END_TIME 0\n Set ELAPSED (END_TIME - START_TIME)\n PRINTLN(\"\u{23f1} \" + OPERATION_NAME + \" completed in \" + TO_STRING(ELAPSED) + \"ms\")\n Return ELAPSED\n}\n\n// ==================== Mock \u{8f85}\u{52a9}\u{51fd}\u{6570} ====================\n\n// \u{521b}\u{5efa}\u{4e00}\u{4e2a}\u{7b80}\u{5355}\u{7684} mock \u{5bf9}\u{8c61}\u{ff08}\u{5b57}\u{5178}\u{ff09}\nFunc MOCK_CREATE() {\n Set MOCK {\"called\": False, \"call_count\": 0, \"last_args\": []}\n Return MOCK\n}\n\n// \u{8bb0}\u{5f55} mock \u{88ab}\u{8c03}\u{7528}\nFunc MOCK_CALL(MOCK, ARGS) {\n Set MOCK[\"called\"] True\n Set COUNT MOCK[\"call_count\"]\n Set MOCK[\"call_count\"] (COUNT + 1)\n Set MOCK[\"last_args\"] ARGS\n Return MOCK\n}\n\n// \u{68c0}\u{67e5} mock \u{662f}\u{5426}\u{88ab}\u{8c03}\u{7528}\nFunc MOCK_WAS_CALLED(MOCK) {\n Return MOCK[\"called\"]\n}\n\n// \u{83b7}\u{53d6} mock \u{7684}\u{8c03}\u{7528}\u{6b21}\u{6570}\nFunc MOCK_CALL_COUNT(MOCK) {\n Return MOCK[\"call_count\"]\n}\n\n// ==================== \u{6d4b}\u{8bd5}\u{6570}\u{636e}\u{751f}\u{6210} ====================\n\n// \u{751f}\u{6210}\u{6d4b}\u{8bd5}\u{7528}\u{7684}\u{6574}\u{6570}\u{6570}\u{7ec4}\nFunc TEST_DATA_INT_ARRAY(SIZE, START) {\n Set RESULT []\n Set I 0\n \n While (I < SIZE) {\n Set RESULT PUSH(RESULT, START + I)\n Set I (I + 1)\n }\n \n Return RESULT\n}\n\n// \u{751f}\u{6210}\u{6d4b}\u{8bd5}\u{7528}\u{7684}\u{5b57}\u{7b26}\u{4e32}\u{6570}\u{7ec4}\nFunc TEST_DATA_STR_ARRAY(SIZE, PREFIX) {\n Set RESULT []\n Set I 0\n \n While (I < SIZE) {\n Set ITEM (PREFIX + TO_STRING(I))\n Set RESULT PUSH(RESULT, ITEM)\n Set I (I + 1)\n }\n \n Return RESULT\n}\n\n// \u{751f}\u{6210}\u{6d4b}\u{8bd5}\u{7528}\u{7684}\u{7a7a}\u{6570}\u{7ec4}\nFunc TEST_DATA_EMPTY_ARRAY() {\n Return []\n}\n\n// \u{751f}\u{6210}\u{6d4b}\u{8bd5}\u{7528}\u{7684}\u{5355}\u{5143}\u{7d20}\u{6570}\u{7ec4}\nFunc TEST_DATA_SINGLE_ARRAY(VALUE) {\n Set RESULT []\n Set RESULT PUSH(RESULT, VALUE)\n Return RESULT\n}\n\n// ==================== \u{65ad}\u{8a00}\u{7ec4}\u{5408} ====================\n\n// \u{65ad}\u{8a00}\u{8303}\u{56f4}\u{ff08}\u{503c}\u{5728}min\u{548c}max\u{4e4b}\u{95f4}\u{ff09}\nFunc ASSERT_IN_RANGE(VALUE, MIN, MAX, MESSAGE) {\n Set IN_RANGE (VALUE >= MIN && VALUE <= MAX)\n \n If (IN_RANGE) {\n Return ASSERT_TRUE(True, MESSAGE)\n } Else {\n Set FAILURE_MSG (MESSAGE + \" - Value \" + TO_STRING(VALUE) + \" not in range [\" + TO_STRING(MIN) + \", \" + TO_STRING(MAX) + \"]\")\n Return ASSERT_TRUE(False, FAILURE_MSG)\n }\n}\n\n// \u{65ad}\u{8a00}\u{6570}\u{7ec4}\u{4e3a}\u{7a7a}\nFunc ASSERT_EMPTY(ARR, MESSAGE) {\n Set LEN LEN(ARR)\n Return ASSERT_EQUAL(LEN, 0, MESSAGE)\n}\n\n// \u{65ad}\u{8a00}\u{6570}\u{7ec4}\u{4e0d}\u{4e3a}\u{7a7a}\nFunc ASSERT_NOT_EMPTY(ARR, MESSAGE) {\n Set LEN LEN(ARR)\n Return ASSERT_GREATER(LEN, 0, MESSAGE)\n}\n\n// ==================== \u{8f85}\u{52a9}\u{5de5}\u{5177} ====================\n\n// \u{6253}\u{5370}\u{5206}\u{9694}\u{7ebf}\nFunc TEST_DIVIDER() {\n PRINTLN(\"\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\")\n}\n\n// \u{6253}\u{5370}\u{6d4b}\u{8bd5}\u{4fe1}\u{606f}\nFunc TEST_INFO(MESSAGE) {\n PRINTLN(\"\u{2139} \" + MESSAGE)\n}\n\n// \u{6253}\u{5370}\u{8b66}\u{544a}\u{4fe1}\u{606f}\nFunc TEST_WARN(MESSAGE) {\n PRINTLN(\"\u{26a0} \" + MESSAGE)\n}\n\n// \u{8df3}\u{8fc7}\u{6d4b}\u{8bd5}\nFunc TEST_SKIP(REASON) {\n PRINTLN(\"\u{2298} Test skipped: \" + REASON)\n}\n\n";Expand description
测试框架