{"input": "records.csv", "max_rows": 4, "result": {"rows": 10, "chunks": 3, "max_rows": 4, "rows_per_chunk": [4, 4, 2], "headers_per_chunk": [1, 1, 1], "duplicates": 0, "id_sequence_equal": true, "field_values_equal": true, "source_sha256": "961a45aa41dbead9203a56b1e144c5b17623fc81b742fdae351c2fb85c6d01e3"}}
{"input": "records.csv", "max_rows": 1, "result": {"rows": 10, "chunks": 10, "max_rows": 1, "rows_per_chunk": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], "headers_per_chunk": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], "duplicates": 0, "id_sequence_equal": true, "field_values_equal": true, "source_sha256": "961a45aa41dbead9203a56b1e144c5b17623fc81b742fdae351c2fb85c6d01e3"}}
{"input": "records.csv", "max_rows": 10, "result": {"rows": 10, "chunks": 1, "max_rows": 10, "rows_per_chunk": [10], "headers_per_chunk": [1], "duplicates": 0, "id_sequence_equal": true, "field_values_equal": true, "source_sha256": "961a45aa41dbead9203a56b1e144c5b17623fc81b742fdae351c2fb85c6d01e3"}}
{"input": "eight_records.csv", "max_rows": 4, "result": {"rows": 8, "chunks": 2, "max_rows": 4, "rows_per_chunk": [4, 4], "headers_per_chunk": [1, 1], "duplicates": 0, "id_sequence_equal": true, "field_values_equal": true, "source_sha256": "a1415c1d3cfec8ae19777d31d6dbf04218e96d2cfd6c7fa65787abf7ef411914"}}
{"input": "header_only.csv", "max_rows": 4, "result": {"rows": 0, "chunks": 0, "max_rows": 4, "rows_per_chunk": [], "headers_per_chunk": [], "duplicates": 0, "id_sequence_equal": true, "field_values_equal": true, "source_sha256": "197c0cf35f40f23432b6c3cc31c1d17a4299e8f6fb9d0e70bed6b16da1ecfa82"}}
{"input": "failures/after_quote.csv", "max_rows": 4, "result": {"exit_code": 2, "error": "ERROR: ',' expected after '\"'", "source_bytes_unchanged": true, "complete_output_exists": false, "staging_remnants": 0}}
{"input": "failures/blank_record.csv", "max_rows": 4, "result": {"exit_code": 2, "error": "ERROR: source.csv: record 1: expected 3 fields", "source_bytes_unchanged": true, "complete_output_exists": false, "staging_remnants": 0}}
{"input": "failures/bom.csv", "max_rows": 4, "result": {"exit_code": 2, "error": "ERROR: source.csv: expected BOM-free header id,item,memo", "source_bytes_unchanged": true, "complete_output_exists": false, "staging_remnants": 0}}
{"input": "failures/duplicate_id.csv", "max_rows": 4, "result": {"exit_code": 2, "error": "ERROR: Duplicate id: 1", "source_bytes_unchanged": true, "complete_output_exists": false, "staging_remnants": 0}}
{"input": "failures/empty.csv", "max_rows": 4, "result": {"exit_code": 2, "error": "ERROR: source.csv: expected BOM-free header id,item,memo", "source_bytes_unchanged": true, "complete_output_exists": false, "staging_remnants": 0}}
{"input": "failures/empty_item.csv", "max_rows": 4, "result": {"exit_code": 2, "error": "ERROR: source.csv: record 1: item is empty", "source_bytes_unchanged": true, "complete_output_exists": false, "staging_remnants": 0}}
{"input": "failures/extra_row.csv", "max_rows": 4, "result": {"exit_code": 2, "error": "ERROR: source.csv: record 1: expected 3 fields", "source_bytes_unchanged": true, "complete_output_exists": false, "staging_remnants": 0}}
{"input": "failures/invalid_utf8.csv", "max_rows": 4, "result": {"exit_code": 2, "error": "ERROR: 'utf-8' codec can't decode byte 0xff in position 17: invalid start byte", "source_bytes_unchanged": true, "complete_output_exists": false, "staging_remnants": 0}}
{"input": "failures/late_unclosed_quote.csv", "max_rows": 4, "result": {"exit_code": 2, "error": "ERROR: unexpected end of data", "source_bytes_unchanged": true, "complete_output_exists": false, "staging_remnants": 0}}
{"input": "failures/noncanonical_id.csv", "max_rows": 4, "result": {"exit_code": 2, "error": "ERROR: source.csv: record 1: id must be a positive decimal without leading zeros", "source_bytes_unchanged": true, "complete_output_exists": false, "staging_remnants": 0}}
{"input": "failures/repeated_header.csv", "max_rows": 4, "result": {"exit_code": 2, "error": "ERROR: source.csv: record 5: id must be a positive decimal without leading zeros", "source_bytes_unchanged": true, "complete_output_exists": false, "staging_remnants": 0}}
{"input": "failures/short_row.csv", "max_rows": 4, "result": {"exit_code": 2, "error": "ERROR: source.csv: record 1: expected 3 fields", "source_bytes_unchanged": true, "complete_output_exists": false, "staging_remnants": 0}}
{"input": "failures/unclosed_quote.csv", "max_rows": 4, "result": {"exit_code": 2, "error": "ERROR: unexpected end of data", "source_bytes_unchanged": true, "complete_output_exists": false, "staging_remnants": 0}}
{"input": "failures/wrong_header.csv", "max_rows": 4, "result": {"exit_code": 2, "error": "ERROR: source.csv: expected BOM-free header id,item,memo", "source_bytes_unchanged": true, "complete_output_exists": false, "staging_remnants": 0}}
PASS: 19 fixture scenarios; every source SHA-256 unchanged
