# Basic test configuration for CSV parser # Define test cases with their properties # Format: [test_name, test_file, test_description] # Basic valid CSV test cases csv_basic_tests = [ ['basic', 'csv/valid/test.csv', 'Simple test to verify the parser can be executed'], ['empty', 'csv/valid/empty.csv', 'Test with empty CSV'], ['quotes', 'csv/valid/quotes.csv', 'Test with quotes'], ['complex', 'csv/valid/complex.csv', 'Test with complex CSV structures'], ['header_only', 'csv/valid/header_only.csv', 'Test with header only CSV'], ['empty_fields', 'csv/valid/empty_fields.csv', 'Test with empty fields'], ] # Edge cases that are VALID per RFC 4180 but might be tricky csv_edge_tests = [ ['edge_double_comma', 'csv/valid/empty_fields_double_comma.csv', 'Test double comma (empty fields) - valid per RFC'], ['edge_trailing_comma', 'csv/valid/trailing_empty_field.csv', 'Test trailing comma (empty field at end) - valid per RFC'], ['edge_leading_comma', 'csv/valid/leading_empty_field.csv', 'Test leading comma (empty field at start) - valid per RFC'], ['edge_inconsistent_columns', 'csv/valid/inconsistent_columns.csv', 'Test inconsistent column count - allowed but unusual'], ['edge_no_final_newline', 'csv/valid/no_final_newline.csv', 'Test missing final newline - explicitly allowed by RFC'], ['edge_blank_line', 'csv/valid/blank_line_record.csv', 'Test blank line (empty record) - valid per RFC'], ['edge_tabs', 'csv/valid/tabs_in_fields.csv', 'Test tab characters in fields - valid per RFC'], ] # Test cases that are TRULY malformed according to RFC 4180 csv_invalid_tests = [ # Quote handling errors - these violate RFC 4180 rules ['invalid_unclosed_quote', 'csv/invalid/unclosed_quote.csv', 'Test unclosed quote - violates RFC 4180'], ['invalid_quote_in_unquoted', 'csv/invalid/quote_in_unquoted_field.csv', 'Test quote in middle of unquoted field - violates RFC 4180 rule 5'], ['invalid_unescaped_quote', 'csv/invalid/unescaped_quote.csv', 'Test unescaped quote in unquoted field - violates RFC 4180 rule 5'], ['invalid_text_after_quote', 'csv/invalid/text_after_quote.csv', 'Test text after closing quote - not allowed'], ['invalid_char_after_quote', 'csv/invalid/char_after_quote.csv', 'Test character after closing quote - not allowed'], ['invalid_text_immediately_after_quote', 'csv/invalid/text_immediately_after_quote.csv', 'Test text immediately after closing quote'], ['invalid_quote_in_middle_unquoted', 'csv/invalid/quote_in_middle_unquoted.csv', 'Test quote in middle of unquoted field'], ['invalid_malformed_quote_escape', 'csv/invalid/malformed_quote_escape.csv', 'Test malformed quote escaping'], ['invalid_eof_in_quote', 'csv/invalid/eof_in_quote.csv', 'Test EOF inside quoted field'], ] # Stress tests that should complete without crashing (may pass or fail) csv_stress_tests = [ ['stress_multiline_quoted', 'csv/stress/multiline_quoted_field.csv', 'Test newline inside quoted field - valid per RFC 4180'], ['stress_quoted_newline', 'csv/stress/quoted_newline_field.csv', 'Test properly quoted newline field'], ['stress_unicode_chars', 'csv/stress/unicode_characters.csv', 'Test unicode characters - should be valid'], ['stress_extremely_long_field', 'csv/stress/extremely_long_field.csv', 'Test extremely long field content'], ['stress_excessive_fields', 'csv/stress/excessive_fields.csv', 'Test excessive number of fields'], ['stress_massive_records', 'csv/stress/massive_records.csv', 'Stress test with many valid records'], ['stress_null_bytes', 'csv/stress/null_bytes.csv', 'Test null bytes in data'], ['stress_extra_newlines', 'csv/stress/extra_trailing_newlines.csv', 'Test extra trailing newlines'], ['stress_semicolon_as_text', 'csv/stress/semicolon_as_text.csv', 'Test semicolons as regular text (not delimiters)'], ] # Get shell program once sh = find_program('sh') # Create tests for basic valid cases foreach test_case : csv_basic_tests test_name = test_case[0] test_file = test_case[1] test_desc = test_case[2] test('csv_parser_' + test_name, sh, args: ['-c', csv_parser.full_path() + ' < ' + meson.current_source_dir() / test_file], workdir: meson.current_source_dir(), timeout: 5) endforeach # Create tests for edge cases (should pass) foreach test_case : csv_edge_tests test_name = test_case[0] test_file = test_case[1] test_desc = test_case[2] test('csv_parser_' + test_name, sh, args: ['-c', csv_parser.full_path() + ' < ' + meson.current_source_dir() / test_file], workdir: meson.current_source_dir(), timeout: 5) endforeach # Create tests for truly invalid cases (should fail) foreach test_case : csv_invalid_tests test_name = test_case[0] test_file = test_case[1] test_desc = test_case[2] test('csv_parser_' + test_name, sh, args: ['-c', csv_parser.full_path() + ' < ' + meson.current_source_dir() / test_file], workdir: meson.current_source_dir(), timeout: 30, should_fail: true) endforeach # Create stress tests (may pass or fail, but should complete) foreach test_case : csv_stress_tests test_name = test_case[0] test_file = test_case[1] test_desc = test_case[2] test('csv_parser_' + test_name, sh, args: ['-c', csv_parser.full_path() + ' < ' + meson.current_source_dir() / test_file], workdir: meson.current_source_dir(), timeout: 60) endforeach