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 writes4
// a tiny .purr that calls a single math function, compiles it with purrc, runs it5
// under the cheatah runtime, and asserts the exact stdout. Complements the6
// in-process unit tests (stdlib/tests/math_test.cpp) and the per-module7
// system-level test (StdlibE2E.Math).8
#include "e2e_harness.hpp"10
TEST(MathCompileRun, Sqrt) {11
e2e::expect_e2e("math_sqrt", R"PURR(import io12
import math13
io.print(math.sqrt(2.0))14
)PURR", "1.41421\n");15
}17
TEST(MathCompileRun, Cbrt) {18
e2e::expect_e2e("math_cbrt", R"PURR(import io19
import math20
io.print(math.cbrt(27.0))21
)PURR", "3\n");22
}24
TEST(MathCompileRun, Fabs) {25
e2e::expect_e2e("math_fabs", R"PURR(import io26
import math27
io.print(math.fabs(-3.5))28
)PURR", "3.5\n");29
}31
TEST(MathCompileRun, Floor) {32
e2e::expect_e2e("math_floor", R"PURR(import io33
import math34
io.print(math.floor(3.7))35
)PURR", "3\n");36
}38
TEST(MathCompileRun, Ceil) {39
e2e::expect_e2e("math_ceil", R"PURR(import io40
import math41
io.print(math.ceil(3.2))42
)PURR", "4\n");43
}45
TEST(MathCompileRun, Trunc) {46
e2e::expect_e2e("math_trunc", R"PURR(import io47
import math48
io.print(math.trunc(-2.9))49
)PURR", "-2\n");50
}52
TEST(MathCompileRun, Round) {53
e2e::expect_e2e("math_round", R"PURR(import io54
import math55
io.print(math.round(2.5))56
)PURR", "3\n");57
}59
TEST(MathCompileRun, Exp) {60
e2e::expect_e2e("math_exp", R"PURR(import io61
import math62
io.print(math.exp(1.0))63
)PURR", "2.71828\n");64
}66
TEST(MathCompileRun, Log) {67
e2e::expect_e2e("math_log", R"PURR(import io68
import math69
io.print(math.log(math.e))70
)PURR", "1\n");71
}73
TEST(MathCompileRun, Log2) {74
e2e::expect_e2e("math_log2", R"PURR(import io75
import math76
io.print(math.log2(8.0))77
)PURR", "3\n");78
}80
TEST(MathCompileRun, Log10) {81
e2e::expect_e2e("math_log10", R"PURR(import io82
import math83
io.print(math.log10(1000.0))84
)PURR", "3\n");85
}87
TEST(MathCompileRun, Sin) {88
e2e::expect_e2e("math_sin", R"PURR(import io89
import math90
io.print(math.sin(0.0))91
)PURR", "0\n");92
}94
TEST(MathCompileRun, Cos) {95
e2e::expect_e2e("math_cos", R"PURR(import io96
import math97
io.print(math.cos(0.0))98
)PURR", "1\n");99
}101
TEST(MathCompileRun, Tan) {102
e2e::expect_e2e("math_tan", R"PURR(import io103
import math104
io.print(math.tan(0.0))105
)PURR", "0\n");106
}108
TEST(MathCompileRun, Asin) {109
e2e::expect_e2e("math_asin", R"PURR(import io110
import math111
io.print(math.asin(1.0))112
)PURR", "1.5708\n");113
}115
TEST(MathCompileRun, Acos) {116
e2e::expect_e2e("math_acos", R"PURR(import io117
import math118
io.print(math.acos(1.0))119
)PURR", "0\n");120
}122
TEST(MathCompileRun, Atan) {123
e2e::expect_e2e("math_atan", R"PURR(import io124
import math125
io.print(math.atan(1.0))126
)PURR", "0.785398\n");127
}129
TEST(MathCompileRun, Atan2) {130
e2e::expect_e2e("math_atan2", R"PURR(import io131
import math132
io.print(math.atan2(1.0, 1.0))133
)PURR", "0.785398\n");134
}136
TEST(MathCompileRun, Hypot) {137
e2e::expect_e2e("math_hypot", R"PURR(import io138
import math139
io.print(math.hypot(3.0, 4.0))140
)PURR", "5\n");141
}143
TEST(MathCompileRun, Fmod) {144
e2e::expect_e2e("math_fmod", R"PURR(import io145
import math146
io.print(math.fmod(7.0, 3.0))147
)PURR", "1\n");148
}150
TEST(MathCompileRun, Copysign) {151
e2e::expect_e2e("math_copysign", R"PURR(import io152
import math153
io.print(math.copysign(3.0, -1.0))154
)PURR", "-3\n");155
}157
TEST(MathCompileRun, Degrees) {158
e2e::expect_e2e("math_degrees", R"PURR(import io159
import math160
io.print(math.degrees(math.pi))161
)PURR", "180\n");162
}164
TEST(MathCompileRun, Radians) {165
e2e::expect_e2e("math_radians", R"PURR(import io166
import math167
io.print(math.radians(180.0))168
)PURR", "3.14159\n");169
}171
TEST(MathCompileRun, Isnan) {172
e2e::expect_e2e("math_isnan", R"PURR(import io173
import math174
io.print(math.isnan(math.nan))175
)PURR", "True\n");176
}178
TEST(MathCompileRun, Isinf) {179
e2e::expect_e2e("math_isinf", R"PURR(import io180
import math181
io.print(math.isinf(math.inf))182
)PURR", "True\n");183
}185
TEST(MathCompileRun, Isfinite) {186
e2e::expect_e2e("math_isfinite", R"PURR(import io187
import math188
io.print(math.isfinite(1.0))189
)PURR", "True\n");190
}192
TEST(MathCompileRun, Gcd) {193
e2e::expect_e2e("math_gcd", R"PURR(import io194
import math195
io.print(math.gcd(12, 18))196
)PURR", "6\n");197
}199
TEST(MathCompileRun, Factorial) {200
e2e::expect_e2e("math_factorial", R"PURR(import io201
import math202
io.print(math.factorial(5))203
)PURR", "120\n");204
}206
TEST(MathCompileRun, Abs) {207
e2e::expect_e2e("math_abs", R"PURR(import io208
import math209
io.print(math.abs(-7))210
)PURR", "7\n");211
}213
TEST(MathCompileRun, Min) {214
e2e::expect_e2e("math_min", R"PURR(import io215
import math216
io.print(math.min(3, 9, 1, 5))217
)PURR", "1\n");218
}220
TEST(MathCompileRun, Max) {221
e2e::expect_e2e("math_max", R"PURR(import io222
import math223
io.print(math.max(3, 9, 1, 5))224
)PURR", "9\n");225
}227
TEST(MathCompileRun, Pow) {228
e2e::expect_e2e("math_pow", R"PURR(import io229
import math230
io.print(math.pow(2, 10))231
)PURR", "1024\n");232
}234
TEST(MathCompileRun, ConstPi) {235
e2e::expect_e2e("math_pi", R"PURR(import io236
import math237
io.print(math.pi)238
)PURR", "3.14159\n");239
}241
TEST(MathCompileRun, ConstE) {242
e2e::expect_e2e("math_const_e", R"PURR(import io243
import math244
io.print(math.e)245
)PURR", "2.71828\n");246
}248
TEST(MathCompileRun, ConstTau) {249
e2e::expect_e2e("math_tau", R"PURR(import io250
import math251
io.print(math.tau)252
)PURR", "6.28319\n");253
}255
TEST(MathCompileRun, ConstInf) {256
e2e::expect_e2e("math_inf", R"PURR(import io257
import math258
io.print(math.inf)259
)PURR", "inf\n");260
}262
TEST(MathCompileRun, ConstNan) {263
e2e::expect_e2e("math_const_nan", R"PURR(import io264
import math265
io.print(math.nan)266
)PURR", "nan\n");267
}