decimal_to_number.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include<__vic/str2num.h>
  2. #include<__vic/stdint.h>
  3. #include<stdexcept>
  4. #include<iostream>
  5. #include<cstdio>
  6. #include<limits>
  7. #include<cassert>
  8. void integer_tests()
  9. {
  10. using __vic::decimal_to_number;
  11. assert(decimal_to_number<int>("4587") == 4587);
  12. assert(decimal_to_number<long>("-125") == -125L);
  13. try
  14. {
  15. // Integer overflow
  16. decimal_to_number<int8_t>("1000");
  17. assert(false);
  18. }
  19. catch(const std::range_error & ) {}
  20. try
  21. {
  22. // No spaces allowed
  23. decimal_to_number<int>(" 100");
  24. assert(false);
  25. }
  26. catch(const std::invalid_argument & ) {}
  27. try
  28. {
  29. // No non-digit chars allowed
  30. decimal_to_number<int>("100a");
  31. assert(false);
  32. }
  33. catch(const std::invalid_argument & ) {}
  34. try
  35. {
  36. // No empty strings allowed
  37. decimal_to_number<int>("");
  38. assert(false);
  39. }
  40. catch(const std::invalid_argument & ) {}
  41. try
  42. {
  43. std::cout << decimal_to_number<unsigned>("-1") << std::endl;
  44. assert(false);
  45. }
  46. catch(const std::invalid_argument & ) {}
  47. __VIC_LONGLONG n;
  48. decimal_to_number(std::string("10000"), n);
  49. assert(n == 10000);
  50. int min_int = std::numeric_limits<int>::min();
  51. char buf[64];
  52. std::sprintf(buf, "%d", min_int);
  53. decimal_to_number(buf, min_int);
  54. assert(min_int == std::numeric_limits<int>::min());
  55. }
  56. void run_tests()
  57. {
  58. integer_tests();
  59. }
  60. int main()
  61. {
  62. try
  63. {
  64. run_tests();
  65. return 0;
  66. }
  67. catch(const std::exception &ex)
  68. {
  69. std::cerr << ex.what() << '\n';
  70. }
  71. return 1;
  72. }