#include #include #include "../Calculator.h" #include "TestHarness.h" // Feed a sequence of command chars through the engine, threading the // output string back in as the next input (as the UI does). static void feed(calc& c, const wchar_t* keys, wchar_t* out) { wcscpy(out, L"0"); wchar_t in[1024]; for (const wchar_t* p = keys; *p; ++p) { wcscpy(in, out); c.change_state(*p, in, out); } } TEST(add) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"2+3=", out); EXPECT_WSTR(out, L"5"); return true; } TEST(subtract) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"7-2=", out); EXPECT_WSTR(out, L"5"); return true; } TEST(multiply) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"6*7=", out); EXPECT_WSTR(out, L"42"); return true; } TEST(divide) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"8/2=", out); EXPECT_WSTR(out, L"4"); return true; } TEST(decimal_and_add) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"1.5+1.5=", out); EXPECT_WSTR(out, L"3"); return true; } TEST(chained_operations) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"2+3+4=", out); EXPECT_WSTR(out, L"9"); return true; } TEST(square_root) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"9Q", out); // Q = CALC_SQRT EXPECT_WSTR(out, L"3"); return true; } TEST(reciprocal) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"4I", out); // I = CALC_I (inverse, 1/x) EXPECT_WSTR(out, L"0.25"); return true; } TEST(percent) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"200*10%", out); // % = CALC_PERC EXPECT_WSTR(out, L"20"); return true; } TEST(negate) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"5P", out); // P = CALC_NEG EXPECT_WSTR(out, L"-5"); return true; } TEST(triple_zero) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"5Z", out); // Z = CALC_000 EXPECT_WSTR(out, L"5000"); return true; } TEST(reset) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"123N", out); // N = CALC_RESET EXPECT_WSTR(out, L"0"); return true; } TEST(divide_by_zero) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"5/0=", out); EXPECT_WSTR(out, L"Error: division by zero"); return true; } TEST(overflow) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"99999999999999999999999999", out); // 26 digits > MAX_LEN_RESULT (25) EXPECT_WSTR(out, L"Error: overflow"); return true; } TEST(euro_key_is_noop) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"5R", out); // R = CALC_EURO (removed) -> must not convert EXPECT_WSTR(out, L"5"); return true; } TEST(hex_toggle_key_is_noop) { calc c; c.set_precision(2); wchar_t out[1024]; feed(c, L"255X", out); // X = CALC_X (removed) -> stays decimal text EXPECT_WSTR(out, L"255"); return true; } int wmain() { return run_all(); }