|
24 | 24 |
|
25 | 25 | /* |
26 | 26 | * TINYEXPR++ - Tiny recursive descent parser and evaluation engine in C++ |
27 | | - * Copyright (c) 2020-2023 Blake Madden |
| 27 | + * Copyright (c) 2020-2026 Blake Madden |
28 | 28 | * |
29 | 29 | * C++ version of the TinyExpr library. |
30 | 30 | * |
@@ -4193,6 +4193,84 @@ TEST_CASE("NaN Comparison", "[nan]") |
4193 | 4193 | } |
4194 | 4194 |
|
4195 | 4195 | // Financial functions |
| 4196 | +// -------------------------------------------------- |
| 4197 | +// PV |
| 4198 | +// -------------------------------------------------- |
| 4199 | +TEST_CASE("PV", "[finance]") |
| 4200 | + { |
| 4201 | + te_parser tep; |
| 4202 | + |
| 4203 | + // Excel: =PV(0.05/12, 60, -200) |
| 4204 | + CHECK_THAT(WITHIN_TYPE_CAST(tep.evaluate("PV(0.05/12, 60, -200)")), |
| 4205 | + Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(10598.14), WITHIN_TYPE_CAST(0.0001))); |
| 4206 | + |
| 4207 | + // Excel: =PV(0.05/12, 60, -200, 0, 1) |
| 4208 | + CHECK_THAT(WITHIN_TYPE_CAST(tep.evaluate("PV(0.05/12, 60, -200, 0, 1)")), |
| 4209 | + Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(10642.30), WITHIN_TYPE_CAST(0.0001))); |
| 4210 | + |
| 4211 | + // Excel: =PV(0.1, 1, -100) |
| 4212 | + CHECK_THAT(WITHIN_TYPE_CAST(tep.evaluate("PV(0.1, 1, -100)")), |
| 4213 | + Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(90.91), WITHIN_TYPE_CAST(0.0001))); |
| 4214 | + |
| 4215 | + // Excel: =PV(0, 60, -200) |
| 4216 | + CHECK_THAT(WITHIN_TYPE_CAST(tep.evaluate("PV(0, 60, -200)")), |
| 4217 | + Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(12000))); |
| 4218 | + |
| 4219 | + // Excel: =PV(0, 10, 0, 1000) |
| 4220 | + CHECK_THAT(WITHIN_TYPE_CAST(tep.evaluate("PV(0, 10, 0, 1000)")), |
| 4221 | + Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(-1000))); |
| 4222 | + |
| 4223 | + // Excel: =PV(0.05, 10, -100) |
| 4224 | + CHECK_THAT(WITHIN_TYPE_CAST(tep.evaluate("PV(0.05, 10, -100)")), |
| 4225 | + Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(772.17), WITHIN_TYPE_CAST(0.0001))); |
| 4226 | + |
| 4227 | + // Excel: =PV(0.05, 10, -100, 0) |
| 4228 | + CHECK_THAT(WITHIN_TYPE_CAST(tep.evaluate("PV(0.05, 10, -100, 0)")), |
| 4229 | + Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(772.17), WITHIN_TYPE_CAST(0.0001))); |
| 4230 | + |
| 4231 | + // Excel: =PV(0.05, 10, -100, 0, 0) |
| 4232 | + CHECK_THAT(WITHIN_TYPE_CAST(tep.evaluate("PV(0.05, 10, -100, 0, 0)")), |
| 4233 | + Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(772.17), WITHIN_TYPE_CAST(0.0001))); |
| 4234 | + |
| 4235 | + // Excel: =PV(0.05, 10, -100, 0, 2) |
| 4236 | + CHECK_THAT(WITHIN_TYPE_CAST(tep.evaluate("PV(0.05, 10, -100, 0, 2)")), |
| 4237 | + Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(810.78), WITHIN_TYPE_CAST(0.0001))); |
| 4238 | + |
| 4239 | + // Excel: =PV(0.05, 10, -100, 0, -1) |
| 4240 | + CHECK_THAT(WITHIN_TYPE_CAST(tep.evaluate("PV(0.05, 10, -100, 0, -1)")), |
| 4241 | + Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(810.78), WITHIN_TYPE_CAST(0.0001))); |
| 4242 | + |
| 4243 | + // Excel: =PV(-0.5, 5, -100) |
| 4244 | + CHECK_THAT(WITHIN_TYPE_CAST(tep.evaluate("PV(-0.5, 5, -100)")), |
| 4245 | + Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(6200), WITHIN_TYPE_CAST(0.0001))); |
| 4246 | + |
| 4247 | + // Excel: =PV(-1, 10, -100) -> #NUM! |
| 4248 | + CHECK(std::isnan(WITHIN_TYPE_CAST(tep.evaluate("PV(-1, 10, -100)")))); |
| 4249 | + |
| 4250 | + // Excel: =PV(0.05, 0, -100) -> #NUM! |
| 4251 | + CHECK(std::isnan(WITHIN_TYPE_CAST(tep.evaluate("PV(0.05, 0, -100)")))); |
| 4252 | + |
| 4253 | + // Excel: =PV(0.05, -10, -100) -> #NUM! |
| 4254 | + CHECK(std::isnan(WITHIN_TYPE_CAST(tep.evaluate("PV(0.05, -10, -100)")))); |
| 4255 | + |
| 4256 | + // Excel: =PV(NaN, 10, -100) -> #NUM! |
| 4257 | + CHECK(std::isnan(WITHIN_TYPE_CAST(tep.evaluate("PV(NaN, 10, -100)")))); |
| 4258 | + |
| 4259 | + // Excel: =PV(0.05, NaN, -100) -> #NUM! |
| 4260 | + CHECK(std::isnan(WITHIN_TYPE_CAST(tep.evaluate("PV(0.05, NaN, -100)")))); |
| 4261 | + |
| 4262 | + // Excel: =PV(0.05, 10, NaN) -> #NUM! |
| 4263 | + CHECK(std::isnan(WITHIN_TYPE_CAST(tep.evaluate("PV(0.05, 10, NaN)")))); |
| 4264 | + |
| 4265 | + // Excel: =PV(0.08/12, 360, -1000) |
| 4266 | + CHECK_THAT(WITHIN_TYPE_CAST(tep.evaluate("PV(0.08/12, 360, -1000)")), |
| 4267 | + Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(136283.35), WITHIN_TYPE_CAST(0.0001))); |
| 4268 | + |
| 4269 | + // Excel: =PV(0.03, 1, 0, 1000) |
| 4270 | + CHECK_THAT(WITHIN_TYPE_CAST(tep.evaluate("PV(0.03, 1, 0, 1000)")), |
| 4271 | + Catch::Matchers::WithinRel(WITHIN_TYPE_CAST(-970.87), WITHIN_TYPE_CAST(0.0001))); |
| 4272 | + } |
| 4273 | + |
4196 | 4274 | TEST_CASE("Nominal", "[finance]") |
4197 | 4275 | { |
4198 | 4276 | te_parser tep; |
|
0 commit comments