Scanner.ut.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include <gtest/gtest.h>
  2. #include <sstream>
  3. #include <iostream>
  4. #include <memory>
  5. #include "Scanner.h"
  6. TEST(ScannerTests, Numbers)
  7. {
  8. std::stringstream ss;
  9. ss << "12345678901234 1.12 0.00000000000001 0.01e1 1e- 10.123e-7 1ab";
  10. std::auto_ptr<Scanner> scanner_;
  11. const Scanner::Token* token;
  12. EXPECT_NO_THROW(scanner_.reset(new Scanner(ss, "numbers")));
  13. Scanner& scanner = *scanner_;
  14. // 12345678901234
  15. EXPECT_NO_THROW(token = &scanner.getNextToken());
  16. EXPECT_EQ(token->getCode(), Scanner::TC_NUMBER);
  17. EXPECT_EQ(token->getDataType(), Scanner::DT_INT);
  18. EXPECT_EQ(token->getValue().getInt(), 12345678901234);
  19. // 1.12
  20. EXPECT_NO_THROW(token = &scanner.getNextToken());
  21. EXPECT_EQ(token->getCode(), Scanner::TC_NUMBER);
  22. EXPECT_EQ(token->getDataType(), Scanner::DT_FLOAT);
  23. EXPECT_FLOAT_EQ(token->getValue().getFloat(), 1.12);
  24. // 0.00000000000001
  25. EXPECT_NO_THROW(token = &scanner.getNextToken());
  26. EXPECT_EQ(token->getCode(), Scanner::TC_NUMBER);
  27. EXPECT_EQ(token->getDataType(), Scanner::DT_FLOAT);
  28. EXPECT_FLOAT_EQ(token->getValue().getFloat(), 0.00000000000001);
  29. // 0.01e1
  30. EXPECT_NO_THROW(token = &scanner.getNextToken());
  31. EXPECT_EQ(token->getCode(), Scanner::TC_NUMBER);
  32. EXPECT_EQ(token->getDataType(), Scanner::DT_FLOAT);
  33. EXPECT_FLOAT_EQ(token->getValue().getFloat(), 0.01e1);
  34. // 1e-
  35. EXPECT_ANY_THROW(token = &scanner.getNextToken());
  36. // 10.123e-7
  37. EXPECT_NO_THROW(token = &scanner.getNextToken());
  38. EXPECT_EQ(token->getCode(), Scanner::TC_NUMBER);
  39. EXPECT_EQ(token->getDataType(), Scanner::DT_FLOAT);
  40. EXPECT_FLOAT_EQ(token->getValue().getFloat(), 10.123e-7);
  41. // 1ab
  42. EXPECT_ANY_THROW(token = &scanner.getNextToken());
  43. // EOF
  44. EXPECT_NO_THROW(token = &scanner.getNextToken());
  45. EXPECT_EQ(token->getCode(), Scanner::TC_EOF);
  46. }
  47. TEST(ScannerTests, Identifiers)
  48. {
  49. std::stringstream ss;
  50. ss << "1 la0_la ha\n_ha";
  51. std::auto_ptr<Scanner> scanner_;
  52. const Scanner::Token* token;
  53. EXPECT_NO_THROW(scanner_.reset(new Scanner(ss, "identifiers")));
  54. Scanner& scanner = *scanner_;
  55. // 1
  56. EXPECT_NO_THROW(token = &scanner.getNextToken());
  57. EXPECT_NE(token->getCode(), Scanner::TC_IDENTIFIER);
  58. // la_la
  59. EXPECT_NO_THROW(token = &scanner.getNextToken());
  60. EXPECT_EQ(token->getCode(), Scanner::TC_IDENTIFIER);
  61. EXPECT_EQ(token->getValue().getString(), std::string("la0_la"));
  62. // ha
  63. EXPECT_NO_THROW(token = &scanner.getNextToken());
  64. EXPECT_EQ(token->getCode(), Scanner::TC_IDENTIFIER);
  65. EXPECT_EQ(token->getValue().getString(), std::string("ha"));
  66. // _ha
  67. EXPECT_NO_THROW(token = &scanner.getNextToken());
  68. EXPECT_EQ(token->getCode(), Scanner::TC_IDENTIFIER);
  69. EXPECT_EQ(token->getValue().getString(), std::string("_ha"));
  70. // EOF
  71. EXPECT_NO_THROW(token = &scanner.getNextToken());
  72. EXPECT_EQ(token->getCode(), Scanner::TC_EOF);
  73. }