cheatah
Source

tests/purrc/math_cr_test.cpp

1// Copyright (c) 2026 BigBrain LLC. MIT-licensed (see LICENSE).
2// Original work; see ACKNOWLEDGMENTS.md for the open-source ideas we build upon.
3// Compile-run unit tests for the `math` module: one test per function. Each writes
4// a tiny .purr that calls a single math function, compiles it with purrc, runs it
5// under the cheatah runtime, and asserts the exact stdout. Complements the
6// in-process unit tests (stdlib/tests/math_test.cpp) and the per-module
7// system-level test (StdlibE2E.Math).
8#include "e2e_harness.hpp"
10TEST(MathCompileRun, Sqrt) {
11 e2e::expect_e2e("math_sqrt", R"PURR(import io
12import math
13io.print(math.sqrt(2.0))
14)PURR", "1.41421\n");
17TEST(MathCompileRun, Cbrt) {
18 e2e::expect_e2e("math_cbrt", R"PURR(import io
19import math
20io.print(math.cbrt(27.0))
21)PURR", "3\n");
24TEST(MathCompileRun, Fabs) {
25 e2e::expect_e2e("math_fabs", R"PURR(import io
26import math
27io.print(math.fabs(-3.5))
28)PURR", "3.5\n");
31TEST(MathCompileRun, Floor) {
32 e2e::expect_e2e("math_floor", R"PURR(import io
33import math
34io.print(math.floor(3.7))
35)PURR", "3\n");
38TEST(MathCompileRun, Ceil) {
39 e2e::expect_e2e("math_ceil", R"PURR(import io
40import math
41io.print(math.ceil(3.2))
42)PURR", "4\n");
45TEST(MathCompileRun, Trunc) {
46 e2e::expect_e2e("math_trunc", R"PURR(import io
47import math
48io.print(math.trunc(-2.9))
49)PURR", "-2\n");
52TEST(MathCompileRun, Round) {
53 e2e::expect_e2e("math_round", R"PURR(import io
54import math
55io.print(math.round(2.5))
56)PURR", "3\n");
59TEST(MathCompileRun, Exp) {
60 e2e::expect_e2e("math_exp", R"PURR(import io
61import math
62io.print(math.exp(1.0))
63)PURR", "2.71828\n");
66TEST(MathCompileRun, Log) {
67 e2e::expect_e2e("math_log", R"PURR(import io
68import math
69io.print(math.log(math.e))
70)PURR", "1\n");
73TEST(MathCompileRun, Log2) {
74 e2e::expect_e2e("math_log2", R"PURR(import io
75import math
76io.print(math.log2(8.0))
77)PURR", "3\n");
80TEST(MathCompileRun, Log10) {
81 e2e::expect_e2e("math_log10", R"PURR(import io
82import math
83io.print(math.log10(1000.0))
84)PURR", "3\n");
87TEST(MathCompileRun, Sin) {
88 e2e::expect_e2e("math_sin", R"PURR(import io
89import math
90io.print(math.sin(0.0))
91)PURR", "0\n");
94TEST(MathCompileRun, Cos) {
95 e2e::expect_e2e("math_cos", R"PURR(import io
96import math
97io.print(math.cos(0.0))
98)PURR", "1\n");
101TEST(MathCompileRun, Tan) {
102 e2e::expect_e2e("math_tan", R"PURR(import io
103import math
104io.print(math.tan(0.0))
105)PURR", "0\n");
108TEST(MathCompileRun, Asin) {
109 e2e::expect_e2e("math_asin", R"PURR(import io
110import math
111io.print(math.asin(1.0))
112)PURR", "1.5708\n");
115TEST(MathCompileRun, Acos) {
116 e2e::expect_e2e("math_acos", R"PURR(import io
117import math
118io.print(math.acos(1.0))
119)PURR", "0\n");
122TEST(MathCompileRun, Atan) {
123 e2e::expect_e2e("math_atan", R"PURR(import io
124import math
125io.print(math.atan(1.0))
126)PURR", "0.785398\n");
129TEST(MathCompileRun, Atan2) {
130 e2e::expect_e2e("math_atan2", R"PURR(import io
131import math
132io.print(math.atan2(1.0, 1.0))
133)PURR", "0.785398\n");
136TEST(MathCompileRun, Hypot) {
137 e2e::expect_e2e("math_hypot", R"PURR(import io
138import math
139io.print(math.hypot(3.0, 4.0))
140)PURR", "5\n");
143TEST(MathCompileRun, Fmod) {
144 e2e::expect_e2e("math_fmod", R"PURR(import io
145import math
146io.print(math.fmod(7.0, 3.0))
147)PURR", "1\n");
150TEST(MathCompileRun, Copysign) {
151 e2e::expect_e2e("math_copysign", R"PURR(import io
152import math
153io.print(math.copysign(3.0, -1.0))
154)PURR", "-3\n");
157TEST(MathCompileRun, Degrees) {
158 e2e::expect_e2e("math_degrees", R"PURR(import io
159import math
160io.print(math.degrees(math.pi))
161)PURR", "180\n");
164TEST(MathCompileRun, Radians) {
165 e2e::expect_e2e("math_radians", R"PURR(import io
166import math
167io.print(math.radians(180.0))
168)PURR", "3.14159\n");
171TEST(MathCompileRun, Isnan) {
172 e2e::expect_e2e("math_isnan", R"PURR(import io
173import math
174io.print(math.isnan(math.nan))
175)PURR", "True\n");
178TEST(MathCompileRun, Isinf) {
179 e2e::expect_e2e("math_isinf", R"PURR(import io
180import math
181io.print(math.isinf(math.inf))
182)PURR", "True\n");
185TEST(MathCompileRun, Isfinite) {
186 e2e::expect_e2e("math_isfinite", R"PURR(import io
187import math
188io.print(math.isfinite(1.0))
189)PURR", "True\n");
192TEST(MathCompileRun, Gcd) {
193 e2e::expect_e2e("math_gcd", R"PURR(import io
194import math
195io.print(math.gcd(12, 18))
196)PURR", "6\n");
199TEST(MathCompileRun, Factorial) {
200 e2e::expect_e2e("math_factorial", R"PURR(import io
201import math
202io.print(math.factorial(5))
203)PURR", "120\n");
206TEST(MathCompileRun, Abs) {
207 e2e::expect_e2e("math_abs", R"PURR(import io
208import math
209io.print(math.abs(-7))
210)PURR", "7\n");
213TEST(MathCompileRun, Min) {
214 e2e::expect_e2e("math_min", R"PURR(import io
215import math
216io.print(math.min(3, 9, 1, 5))
217)PURR", "1\n");
220TEST(MathCompileRun, Max) {
221 e2e::expect_e2e("math_max", R"PURR(import io
222import math
223io.print(math.max(3, 9, 1, 5))
224)PURR", "9\n");
227TEST(MathCompileRun, Pow) {
228 e2e::expect_e2e("math_pow", R"PURR(import io
229import math
230io.print(math.pow(2, 10))
231)PURR", "1024\n");
234TEST(MathCompileRun, ConstPi) {
235 e2e::expect_e2e("math_pi", R"PURR(import io
236import math
237io.print(math.pi)
238)PURR", "3.14159\n");
241TEST(MathCompileRun, ConstE) {
242 e2e::expect_e2e("math_const_e", R"PURR(import io
243import math
244io.print(math.e)
245)PURR", "2.71828\n");
248TEST(MathCompileRun, ConstTau) {
249 e2e::expect_e2e("math_tau", R"PURR(import io
250import math
251io.print(math.tau)
252)PURR", "6.28319\n");
255TEST(MathCompileRun, ConstInf) {
256 e2e::expect_e2e("math_inf", R"PURR(import io
257import math
258io.print(math.inf)
259)PURR", "inf\n");
262TEST(MathCompileRun, ConstNan) {
263 e2e::expect_e2e("math_const_nan", R"PURR(import io
264import math
265io.print(math.nan)
266)PURR", "nan\n");