mirror of
				https://github.com/red0124/ssp.git
				synced 2025-10-31 13:16:45 +01:00 
			
		
		
		
	WIP, Continue writing additional parser tests, add big object flag to test cmake
This commit is contained in:
		
							parent
							
								
									9bf1dd6041
								
							
						
					
					
						commit
						84a7d46cbf
					
				| @ -45,7 +45,6 @@ public: | |||||||
|             if constexpr (ignore_header) { |             if constexpr (ignore_header) { | ||||||
|                 ignore_next(); |                 ignore_next(); | ||||||
|             } else { |             } else { | ||||||
|                 // TODO read header after use_fields is called
 |  | ||||||
|                 header_ = reader_.get_header(); |                 header_ = reader_.get_header(); | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
| @ -462,7 +461,7 @@ private: | |||||||
|         constexpr static auto error_msg = " could not be opened"; |         constexpr static auto error_msg = " could not be opened"; | ||||||
| 
 | 
 | ||||||
|         if constexpr (string_error) { |         if constexpr (string_error) { | ||||||
|             error_.append(file_name_).append(" could not be opened"); |             error_.append(file_name_).append(error_msg); | ||||||
|         } else if constexpr (throw_on_error) { |         } else if constexpr (throw_on_error) { | ||||||
|             throw ss::exception{file_name_ + error_msg}; |             throw ss::exception{file_name_ + error_msg}; | ||||||
|         } else { |         } else { | ||||||
| @ -471,10 +470,10 @@ private: | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     void set_error_eof_reached() { |     void set_error_eof_reached() { | ||||||
|         constexpr static auto error_msg = " reached end of file"; |         constexpr static auto error_msg = " read on end of file"; | ||||||
| 
 | 
 | ||||||
|         if constexpr (string_error) { |         if constexpr (string_error) { | ||||||
|             error_.append(file_name_).append(" reached end of file"); |             error_.append(file_name_).append(error_msg); | ||||||
|         } else if constexpr (throw_on_error) { |         } else if constexpr (throw_on_error) { | ||||||
|             throw ss::exception{file_name_ + error_msg}; |             throw ss::exception{file_name_ + error_msg}; | ||||||
|         } else { |         } else { | ||||||
|  | |||||||
| @ -12,6 +12,12 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") | |||||||
|     target_compile_options(ssp INTERFACE -Wall -Wextra) |     target_compile_options(ssp INTERFACE -Wall -Wextra) | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
|  | if (MSVC) | ||||||
|  |   add_compile_options(/bigobj) | ||||||
|  | else () | ||||||
|  |   add_compile_options(-Wa,-mbig-obj) | ||||||
|  | endif () | ||||||
|  | 
 | ||||||
| include(FetchContent) | include(FetchContent) | ||||||
| FetchContent_Declare( | FetchContent_Declare( | ||||||
|     DOCTEST |     DOCTEST | ||||||
|  | |||||||
| @ -264,6 +264,8 @@ void write_to_file(const std::vector<std::string>& data, | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     out << line << std::endl; |     out << line << std::endl; | ||||||
|  |     // out.close();
 | ||||||
|  |     // system(("unix2dos " + file_name).c_str());
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #define CHECK_EQ_CRLF(V1, V2)                                                  \ | #define CHECK_EQ_CRLF(V1, V2)                                                  \ | ||||||
| @ -272,7 +274,24 @@ void write_to_file(const std::vector<std::string>& data, | |||||||
|         auto tmp2 = V2;                                                        \ |         auto tmp2 = V2;                                                        \ | ||||||
|         replace_all2(tmp1, "\r\n", "\n");                                      \ |         replace_all2(tmp1, "\r\n", "\n");                                      \ | ||||||
|         replace_all2(tmp2, "\r\n", "\n");                                      \ |         replace_all2(tmp2, "\r\n", "\n");                                      \ | ||||||
|  |                                                                                \ | ||||||
|         CHECK(tmp1 == tmp2);                                                   \ |         CHECK(tmp1 == tmp2);                                                   \ | ||||||
|  |                                                                                \ | ||||||
|  |         if (tmp1 != tmp2) {                                                    \ | ||||||
|  |             replace_all2(tmp1, "\r", "(r)");                                   \ | ||||||
|  |             replace_all2(tmp2, "\r", "(r)");                                   \ | ||||||
|  |                                                                                \ | ||||||
|  |             replace_all2(tmp1, "\n", "(n)");                                   \ | ||||||
|  |             replace_all2(tmp2, "\n", "(n)");                                   \ | ||||||
|  |                                                                                \ | ||||||
|  |             replace_all2(tmp1, " ", "_");                                      \ | ||||||
|  |             replace_all2(tmp2, " ", "_");                                      \ | ||||||
|  |                                                                                \ | ||||||
|  |             std::cout << "<" << tmp1 << ">" << std::endl;                      \ | ||||||
|  |             std::cout << "<" << tmp2 << ">" << std::endl;                      \ | ||||||
|  |             std::cout << "----------------" << std::endl;                      \ | ||||||
|  |         }                                                                      \ | ||||||
|  |                                                                                \ | ||||||
|     } else {                                                                   \ |     } else {                                                                   \ | ||||||
|         CHECK(V1 == V2);                                                       \ |         CHECK(V1 == V2);                                                       \ | ||||||
|     } |     } | ||||||
| @ -280,8 +299,7 @@ void write_to_file(const std::vector<std::string>& data, | |||||||
| template <typename... Ts> | template <typename... Ts> | ||||||
| void test_combinations(const std::vector<column>& input_data, | void test_combinations(const std::vector<column>& input_data, | ||||||
|                        const std::string& delim, bool include_header) { |                        const std::string& delim, bool include_header) { | ||||||
|     // TODO test without string_error
 |     using setup = ss::setup<Ts...>; | ||||||
|     using setup = ss::setup<Ts..., ss::string_error>; |  | ||||||
| 
 | 
 | ||||||
|     unique_file_name f{"test_parser2"}; |     unique_file_name f{"test_parser2"}; | ||||||
|     std::vector<std::vector<field>> expected_data; |     std::vector<std::vector<field>> expected_data; | ||||||
| @ -366,7 +384,11 @@ void test_combinations(const std::vector<column>& input_data, | |||||||
|             p.use_fields(fields); |             p.use_fields(fields); | ||||||
| 
 | 
 | ||||||
|             if (!p.valid()) { |             if (!p.valid()) { | ||||||
|  |                 if constexpr (setup::string_error) { | ||||||
|                     std::cout << p.error_msg() << std::endl; |                     std::cout << p.error_msg() << std::endl; | ||||||
|  |                 } else { | ||||||
|  |                     std::cout << "use_fields failed" << std::endl; | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             REQUIRE(p.valid()); |             REQUIRE(p.valid()); | ||||||
| @ -375,12 +397,15 @@ void test_combinations(const std::vector<column>& input_data, | |||||||
|         auto check_error = [&p] { |         auto check_error = [&p] { | ||||||
|             CHECK(p.valid()); |             CHECK(p.valid()); | ||||||
|             if (!p.valid()) { |             if (!p.valid()) { | ||||||
|  |                 if constexpr (setup::string_error) { | ||||||
|                     std::cout << p.error_msg() << std::endl; |                     std::cout << p.error_msg() << std::endl; | ||||||
|                 } |                 } | ||||||
|  |             } | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         int num_columns = layout.size(); |         int num_columns = layout.size(); | ||||||
|         for (size_t i = 0; i < n + 1; ++i) { |         for (size_t i = 0; i < n + 1; ++i) { | ||||||
|  |             try { | ||||||
|                 switch (num_columns) { |                 switch (num_columns) { | ||||||
|                 case 1: { |                 case 1: { | ||||||
|                     auto s0 = p.template get_next<std::string>(); |                     auto s0 = p.template get_next<std::string>(); | ||||||
| @ -395,7 +420,8 @@ void test_combinations(const std::vector<column>& input_data, | |||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
|                 case 2: { |                 case 2: { | ||||||
|                 auto [s0, s1] = p.template get_next<std::string, std::string>(); |                     auto [s0, s1] = | ||||||
|  |                         p.template get_next<std::string, std::string>(); | ||||||
|                     if (i < n) { |                     if (i < n) { | ||||||
|                         check_error(); |                         check_error(); | ||||||
|                         // std::cout << s0 << ' ' << s1 << std::endl;
 |                         // std::cout << s0 << ' ' << s1 << std::endl;
 | ||||||
| @ -413,7 +439,8 @@ void test_combinations(const std::vector<column>& input_data, | |||||||
|                                             std::string>(); |                                             std::string>(); | ||||||
|                     if (i < n) { |                     if (i < n) { | ||||||
|                         check_error(); |                         check_error(); | ||||||
|                     // std::cout << s0 << ' ' << s1 << ' ' << s2 << std::endl;
 |                         // std::cout << s0 << ' ' << s1 << ' ' << s2 <<
 | ||||||
|  |                         // std::endl;
 | ||||||
|                         CHECK_EQ_CRLF(s0, expected_data[i][layout[0]].value); |                         CHECK_EQ_CRLF(s0, expected_data[i][layout[0]].value); | ||||||
|                         CHECK_EQ_CRLF(s1, expected_data[i][layout[1]].value); |                         CHECK_EQ_CRLF(s1, expected_data[i][layout[1]].value); | ||||||
|                         CHECK_EQ_CRLF(s2, expected_data[i][layout[2]].value); |                         CHECK_EQ_CRLF(s2, expected_data[i][layout[2]].value); | ||||||
| @ -425,8 +452,8 @@ void test_combinations(const std::vector<column>& input_data, | |||||||
|                 } |                 } | ||||||
|                 case 4: { |                 case 4: { | ||||||
|                     auto [s0, s1, s2, s3] = |                     auto [s0, s1, s2, s3] = | ||||||
|                     p.template get_next<std::string, std::string, std::string, |                         p.template get_next<std::string, std::string, | ||||||
|                                         std::string>(); |                                             std::string, std::string>(); | ||||||
|                     if (i < n) { |                     if (i < n) { | ||||||
|                         check_error(); |                         check_error(); | ||||||
|                         /*
 |                         /*
 | ||||||
| @ -445,11 +472,13 @@ void test_combinations(const std::vector<column>& input_data, | |||||||
|                 } |                 } | ||||||
|                 case 5: { |                 case 5: { | ||||||
|                     auto [s0, s1, s2, s3, s4] = |                     auto [s0, s1, s2, s3, s4] = | ||||||
|                     p.template get_next<std::string, std::string, std::string, |                         p.template get_next<std::string, std::string, | ||||||
|                                         std::string, std::string>(); |                                             std::string, std::string, | ||||||
|  |                                             std::string>(); | ||||||
|                     if (i < n) { |                     if (i < n) { | ||||||
|                         check_error(); |                         check_error(); | ||||||
|                     // std::cout << s0 << ' ' << s1 << ' ' << s2 << ' ' << s3
 |                         // std::cout << s0 << ' ' << s1 << ' ' << s2 << ' ' <<
 | ||||||
|  |                         // s3
 | ||||||
|                         //  << ' ' << s4 << std::endl;
 |                         //  << ' ' << s4 << std::endl;
 | ||||||
|                         CHECK_EQ_CRLF(s0, expected_data[i][layout[0]].value); |                         CHECK_EQ_CRLF(s0, expected_data[i][layout[0]].value); | ||||||
|                         CHECK_EQ_CRLF(s1, expected_data[i][layout[1]].value); |                         CHECK_EQ_CRLF(s1, expected_data[i][layout[1]].value); | ||||||
| @ -467,6 +496,11 @@ void test_combinations(const std::vector<column>& input_data, | |||||||
|                           std::to_string(num_columns))); |                           std::to_string(num_columns))); | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
|  |             } catch (const std::exception& e) { | ||||||
|  |                 if (i < n) { | ||||||
|  |                     throw; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -521,54 +555,58 @@ void test_combinations_impl() { | |||||||
|             for (const auto& columns : |             for (const auto& columns : | ||||||
|                  {columns0, columns1, columns2, columns3, columns4, columns5, |                  {columns0, columns1, columns2, columns3, columns4, columns5, | ||||||
|                   columns6, columns7}) { |                   columns6, columns7}) { | ||||||
|  |                 try { | ||||||
|                     test_combinations<Ts...>(columns, delimiter, false); |                     test_combinations<Ts...>(columns, delimiter, false); | ||||||
|                     test_combinations<Ts...>(columns, delimiter, true); |                     test_combinations<Ts...>(columns, delimiter, true); | ||||||
|  |                 } catch (std::exception& e) { | ||||||
|  |                     std::cout << typeid(ss::parser<Ts...>).name() << std::endl; | ||||||
|  |                     FAIL_CHECK(std::string{e.what()}); | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | template <typename... Ts> | ||||||
|  | void test_combinations_with_error_options() { | ||||||
|  |     test_combinations_impl<Ts...>(); | ||||||
|  |     test_combinations_impl<Ts..., ss::string_error>(); | ||||||
|  |     test_combinations_impl<Ts..., ss::throw_on_error>(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename... Ts> | ||||||
|  | void test_combinations_with_trim_and_error_options() { | ||||||
|  |     using trim = ss::trim<' '>; | ||||||
|  |     using trimr = ss::trim_right<' '>; | ||||||
|  |     using triml = ss::trim_left<' '>; | ||||||
|  | 
 | ||||||
|  |     test_combinations_with_error_options<Ts...>(); | ||||||
|  |     test_combinations_with_error_options<Ts..., trim>(); | ||||||
|  |     test_combinations_with_error_options<Ts..., trimr>(); | ||||||
|  |     test_combinations_with_error_options<Ts..., triml>(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } /* namespace */ | } /* namespace */ | ||||||
| 
 | 
 | ||||||
| TEST_CASE("parser test various cases version 2") { | TEST_CASE("parser test various cases version 2") { | ||||||
|     using quote = ss::quote<'"'>; |     using quote = ss::quote<'"'>; | ||||||
|     using escape = ss::escape<'\\'>; |     using escape = ss::escape<'\\'>; | ||||||
|     using trim = ss::trim<' '>; |  | ||||||
|     using triml = ss::trim_left<' '>; |  | ||||||
|     using trimr = ss::trim_right<' '>; |  | ||||||
|     using multiline = ss::multiline; |     using multiline = ss::multiline; | ||||||
| 
 | 
 | ||||||
|     test_combinations_impl<>(); | // TODO uncomment
 | ||||||
|     test_combinations_impl<trim>(); | // #ifdef CMAKE_GITHUB_CI
 | ||||||
|     test_combinations_impl<triml>(); | #if 0 | ||||||
|     test_combinations_impl<trimr>(); |     using multiline_r = ss::multiline_restricted<10>; | ||||||
| 
 | 
 | ||||||
|     test_combinations_impl<escape>(); |     test_combinations_with_trim_and_error_options<>(); | ||||||
|     test_combinations_impl<escape, trim>(); |     test_combinations_with_trim_and_error_options<escape>(); | ||||||
|     test_combinations_impl<escape, triml>(); |     test_combinations_with_trim_and_error_options<quote>(); | ||||||
|     test_combinations_impl<escape, trimr>(); |     test_combinations_with_trim_and_error_options<escape, quote>(); | ||||||
| 
 |     test_combinations_with_trim_and_error_options<escape, multiline>(); | ||||||
|     test_combinations_impl<quote>(); |     test_combinations_with_trim_and_error_options<quote, multiline>(); | ||||||
|     test_combinations_impl<quote, trim>(); |     test_combinations_with_trim_and_error_options<escape, quote, multiline>(); | ||||||
|     test_combinations_impl<quote, triml>(); |     test_combinations_with_trim_and_error_options<escape, quote, multiline_r>(); | ||||||
|     test_combinations_impl<quote, trimr>(); | #else | ||||||
| 
 |     test_combinations_with_trim_and_error_options<escape, quote, multiline>(); | ||||||
|     test_combinations_impl<escape, quote>(); | #endif | ||||||
|     test_combinations_impl<escape, quote, trim>(); |  | ||||||
|     test_combinations_impl<escape, quote, triml>(); |  | ||||||
|     test_combinations_impl<escape, quote, trimr>(); |  | ||||||
| 
 |  | ||||||
|     test_combinations_impl<escape, multiline>(); |  | ||||||
|     test_combinations_impl<escape, multiline, trim>(); |  | ||||||
|     test_combinations_impl<escape, multiline, triml>(); |  | ||||||
|     test_combinations_impl<escape, multiline, trimr>(); |  | ||||||
| 
 |  | ||||||
|     test_combinations_impl<quote, multiline>(); |  | ||||||
|     test_combinations_impl<quote, multiline, trim>(); |  | ||||||
|     test_combinations_impl<quote, multiline, triml>(); |  | ||||||
|     test_combinations_impl<quote, multiline, trimr>(); |  | ||||||
| 
 |  | ||||||
|     test_combinations_impl<quote, escape, multiline>(); |  | ||||||
|     test_combinations_impl<quote, escape, multiline, trim>(); |  | ||||||
|     test_combinations_impl<quote, escape, multiline, triml>(); |  | ||||||
|     test_combinations_impl<quote, escape, multiline, trimr>(); |  | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user