writeFloat.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Copyright Benoit Blanchon 2014-2017
  2. // MIT License
  3. //
  4. // Arduino JSON library
  5. // https://bblanchon.github.io/ArduinoJson/
  6. // If you like this project, please add a star!
  7. #include <catch.hpp>
  8. #include <limits>
  9. #include <string>
  10. #include <ArduinoJson/Serialization/JsonWriter.hpp>
  11. #include <ArduinoJson/Serialization/StaticStringBuilder.hpp>
  12. using namespace ArduinoJson::Internals;
  13. void check(const std::string& expected, double input, uint8_t digits = 2) {
  14. char output[1024];
  15. StaticStringBuilder sb(output, sizeof(output));
  16. JsonWriter<StaticStringBuilder> writer(sb);
  17. writer.writeFloat(input, digits);
  18. REQUIRE(output == expected);
  19. REQUIRE(writer.bytesWritten() == expected.size());
  20. }
  21. TEST_CASE("JsonWriter::writeFloat()") {
  22. SECTION("NaN") {
  23. check("NaN", std::numeric_limits<double>::signaling_NaN());
  24. }
  25. SECTION("PositiveInfinity") {
  26. check("Infinity", std::numeric_limits<double>::infinity());
  27. }
  28. SECTION("NegativeInfinity") {
  29. check("-Infinity", -std::numeric_limits<double>::infinity());
  30. }
  31. SECTION("Zero") {
  32. check("0.00", 0);
  33. }
  34. SECTION("ZeroDigits_Rounding") {
  35. check("10", 9.5, 0);
  36. }
  37. SECTION("ZeroDigits_NoRounding") {
  38. check("9", 9.4, 0);
  39. }
  40. SECTION("OneDigit_Rounding") {
  41. check("10.0", 9.95, 1);
  42. }
  43. SECTION("OneDigit_NoRounding") {
  44. check("9.9", 9.94, 1);
  45. }
  46. SECTION("TwoDigits_Rounding") {
  47. check("10.00", 9.995, 2);
  48. }
  49. SECTION("TwoDigits_NoRounding") {
  50. check("9.99", 9.994, 2);
  51. }
  52. SECTION("ThreeDigits_Rounding") {
  53. check("10.000", 9.9995, 3);
  54. }
  55. SECTION("ThreeDigits_NoRounding") {
  56. check("9.999", 9.9994, 3);
  57. }
  58. SECTION("FourDigits_Rounding") {
  59. check("10.0000", 9.99995, 4);
  60. }
  61. SECTION("FourDigits_NoRounding") {
  62. check("9.9999", 9.99994, 4);
  63. }
  64. SECTION("FiveDigits_Rounding") {
  65. check("10.00000", 9.999995, 5);
  66. }
  67. SECTION("FiveDigits_NoRounding") {
  68. check("9.99999", 9.999994, 5);
  69. }
  70. }