decimal_to_number.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. template<class TInt>
  9. inline void parse_and_check(
  10. const char *str, __vic::number_parse_status_t expected_status)
  11. {
  12. __vic::decimal_parser<TInt> p;
  13. assert(p.parse(str) == expected_status);
  14. }
  15. void integer_tests()
  16. {
  17. using __vic::decimal_to_number;
  18. using __vic::number_parse_status;
  19. assert(decimal_to_number<int>("4587") == 4587);
  20. assert(decimal_to_number<long>("-125") == -125L);
  21. assert(decimal_to_number<int>("+1") == 1);
  22. // Integer overflow
  23. parse_and_check<int8_t>("1000", number_parse_status::unrepresentable);
  24. // No spaces allowed
  25. parse_and_check<int>(" 100", number_parse_status::invalid_number);
  26. // No non-digit chars allowed
  27. parse_and_check<int>("100a", number_parse_status::invalid_number);
  28. // No empty strings allowed
  29. parse_and_check<int>("", number_parse_status::invalid_number);
  30. parse_and_check<unsigned>("-1", number_parse_status::invalid_number);
  31. parse_and_check<int>("-", number_parse_status::invalid_number);
  32. parse_and_check<int>("+", number_parse_status::invalid_number);
  33. #ifdef __VIC_LONGLONG
  34. {
  35. __VIC_LONGLONG n;
  36. decimal_to_number(std::string("10000"), n);
  37. assert(n == 10000);
  38. }
  39. #endif
  40. int min_int = std::numeric_limits<int>::min();
  41. char buf[64];
  42. std::sprintf(buf, "%d", min_int);
  43. decimal_to_number(buf, min_int);
  44. assert(min_int == std::numeric_limits<int>::min());
  45. }
  46. void run_tests()
  47. {
  48. integer_tests();
  49. }
  50. int main()
  51. {
  52. try
  53. {
  54. run_tests();
  55. return 0;
  56. }
  57. catch(const std::exception &ex)
  58. {
  59. std::cerr << ex.what() << '\n';
  60. }
  61. return 1;
  62. }