libcsv Validation
Port build from safelibs/port-libcsv at commit c36debc16bac (release build-c36debc16bac)
Tests
Empty fields and custom delimiter Original / libcsv / empty-field-custom-delimiter Passed
Example tool compile and run Original / libcsv / example-tool-compile-run Passed
Large field handling Original / libcsv / large-field-handling Passed
Parser callback behavior Original / libcsv / parser-callback-behavior Passed
Strict quote error behavior Original / libcsv / strict-quote-error Passed
readstat conversion log reports variable and row counts Original / libcsv / usage-readstat-conversion-log-counts Passed
Captures the stdout of three sequential conversions of a seven-row two-column CSV through DTA and SAV and CSV and verifies every conversion emits a "Converted N variables and M rows in T seconds" log line whose variable and row counts match the expected shape, locking in the structured success indicator.
readstat 100 column CSV summary and edge cells Original / libcsv / usage-readstat-csv-100-columns Passed
Builds a 100 column numeric CSV with two data rows, converts through DTA, and verifies the summary reports exactly 100 columns and that the first column, last column, and a midpoint column hold their expected values on both rows.
readstat 3 column 10 row CSV roundtrip Original / libcsv / usage-readstat-csv-3col-10row-simple-roundtrip Passed
Converts a CSV with three numeric columns and ten data rows through DTA and verifies the summary reports the exact row and column counts and that each row reappears with the expected six-decimal values.
readstat 3x3 CSV every cell verified after DTA round trip Original / libcsv / usage-readstat-csv-3x3-every-cell Passed
Builds a small three-row by three-column CSV with distinct values in every cell so each one is uniquely addressable, converts through DTA, and verifies each of the nine cells reappears at the matching row and column position on readback so no row or column gets transposed, dropped, or duplicated.
readstat 5000 row CSV summary Original / libcsv / usage-readstat-csv-5000-rows Passed
Builds a 5000-row numeric CSV, converts it through DTA, and verifies the summary reports the exact row count and that the first and last data rows survive readback.
readstat streams an 8000-row CSV through DTA and back Original / libcsv / usage-readstat-csv-8000-row-streaming-roundtrip Passed
Generates an 8000-row two-column CSV with monotonically increasing values, converts to DTA, reads it back to CSV via the "-" stdout sink, and verifies the DTA summary reports exactly 8000 rows, the readback produces 8001 lines (header + rows), and the first/middle/last data rows survive numerically. Stresses libreadstat's CSV streaming path with a row count larger than typical buffered batches.
readstat preserves rows where every cell is empty Original / libcsv / usage-readstat-csv-all-empty-cells-preserved Passed
Builds a DTA from a CSV containing two rows in which every cell is empty for both a STRING column and a NUMERIC column and verifies the round-tripped CSV retains both empty rows with empty quoted strings for the string column and empty numeric placeholders for the numeric column.
readstat all-zero numeric column renders as 0.000000 in every cell Original / libcsv / usage-readstat-csv-all-zero-column-rendering Passed
Builds a CSV with two numeric columns where the first column carries varied non-zero integers and the second column is all zero across four rows, converts through DTA, and verifies the second column is rendered as the literal six-decimal short form 0.000000 in every row — never as a bare 0, never as 0.0, never as scientific notation, and never empty — while the first column independently renders its varied values.
readstat CSV numeric column with all zero rows Original / libcsv / usage-readstat-csv-all-zeros-multi-row Passed
Builds a CSV whose numeric column holds zero on every one of five rows, converts through DTA, and verifies each readback row reports a numeric zero in the six-decimal short form rather than an empty value or unrelated number.
readstat CSV with constant first column preserves repeated value across all rows Original / libcsv / usage-readstat-csv-constant-first-column Passed
Builds a two-column CSV where the first column carries the same string value on every data row (a degenerate constant column) and the second column varies, converts through DTA, and verifies every readback row repeats the constant verbatim so no row collapses or deduplicates the value.
readstat CRLF CSV input Original / libcsv / usage-readstat-csv-crlf-line-endings Passed
Feeds a CRLF-terminated CSV to readstat and verifies the rows are parsed and exported back to CSV without extra carriage returns.
readstat decimal tenths preserved at six-decimal output Original / libcsv / usage-readstat-csv-decimal-tenths-roundtrip Passed
Converts a CSV whose numeric column carries 0.1, 0.2, and 0.3 through DTA and verifies each value reappears in the readback as its six-decimal short form, confirming tenths round-trip even though they are not exact in binary floating point.
readstat renders DISCRETE missing values as blanks when DTA is read back Original / libcsv / usage-readstat-csv-discrete-missing-blank-in-dta Passed
Builds CSV plus JSON metadata that declares a DISCRETE missing-value sentinel of 99 on a numeric column, converts to DTA, reads the DTA back to CSV, and verifies the row whose score equals 99 emits an empty cell ("beta,") while non-sentinel rows preserve their numeric value (alpha,42 and gamma,7 stay populated). Locks in the libreadstat behavior of suppressing user-declared missing sentinels at DTA readback time.
readstat CSV through DTA and back is byte-stable across two passes Original / libcsv / usage-readstat-csv-dta-csv-byte-equal-roundtrip Passed
Round-trips a CSV through DTA twice — once for a reference readback CSV and once for a second readback CSV — and verifies the two readback CSVs are byte-for-byte identical via cmp, then computes a SHA-256 of each and verifies the digests match exactly, proving the DTA roundtrip is deterministic and yields identical bytes on a fresh invocation.
readstat CSV through DTA SAV and back to CSV produces identical readback Original / libcsv / usage-readstat-csv-dta-sav-csv-exact-match Passed
Round-trips a CSV through DTA, then through SAV, then back to CSV via the SAV file, and verifies that the final CSV content is byte-for-byte identical to a direct CSV-through-DTA-and-back-to-CSV readback, locking in that the SAV intermediate hop does not perturb the data.
readstat CSV through DTA SAV DTA preserves five rows exactly Original / libcsv / usage-readstat-csv-dta-sav-dta-5row-exact Passed
Round-trips a five-row CSV through DTA then SAV then back to DTA, dumps the final DTA as CSV, and verifies every one of the five data rows reappears at its original position with both string and numeric values intact.
readstat converts CSV-built DTA into a ZSAV with binary compression Original / libcsv / usage-readstat-csv-dta-to-zsav-cross-format Passed
Builds a DTA from CSV, then performs a second readstat invocation that consumes the DTA and produces a ZSAV (SPSS compressed) directly without re-using the JSON metadata. Verifies the resulting ZSAV summary reports format "SPSS compressed binary file (ZSAV)", "Compression: binary", "Format version: 3", and that the readback CSV preserves both row values, exercising the DTA-reader -> ZSAV-writer pipeline rather than the CSV-reader pipeline.
readstat embedded newline in quoted CSV field Original / libcsv / usage-readstat-csv-embedded-newline-quoted Passed
Parses a CSV row whose quoted string field contains a literal newline and verifies the multi-line value survives through DTA back to CSV.
readstat empty CSV is rejected Original / libcsv / usage-readstat-csv-empty-file-rejected Passed
Feeds an empty CSV that contains only a single newline to readstat with a one-variable metadata file and verifies the conversion fails with a non-zero exit status and produces no usable DTA output, locking in that header-less inputs do not silently produce an empty dataset.
readstat empty numeric column across rows Original / libcsv / usage-readstat-csv-empty-numeric-column Passed
Converts a CSV whose numeric column has empty values on every row through DTA and verifies the row count is preserved and string fields survive.
readstat empty string field Original / libcsv / usage-readstat-csv-empty-string Passed
readstat CSV with explicit 5-decimal-place precision values Original / libcsv / usage-readstat-csv-explicit-5-decimal-precision Passed
Builds a CSV whose numeric column carries values written with exactly five decimal places (0.12345, 1.23456, 9.87654), converts through DTA, and verifies the readback emits each value in readstat's six-decimal short form with the original five-decimal digits intact and a trailing zero appended, demonstrating that the input precision is preserved without rounding away significant digits.
readstat numeric column with explicit .0 suffix preserved as float Original / libcsv / usage-readstat-csv-explicit-dot-zero-float Passed
Builds a CSV whose numeric column carries values written with an explicit .0 decimal suffix (rather than bare integers), converts through DTA, and verifies the readback always renders six-decimal floats so the values are interpreted as numeric rather than as a string column even though they look integer-valued.
readstat single float column 0.5 step roundtrip Original / libcsv / usage-readstat-csv-float-half-step Passed
Builds a CSV with one numeric column ranging from 0.5 to 50.0 in 0.5 steps, converts through DTA, and verifies the row count and the first, last, and a midpoint value all survive readback.
readstat summary Format line content for each output format Original / libcsv / usage-readstat-csv-format-line-each-format Passed
Builds a CSV through DTA and then produces SAV, ZSAV, XPT, and SAS7BDAT files from that intermediate DTA, captures the readstat summary for each one, and verifies the leading "Format: ..." line carries the format-specific descriptor (Stata DTA, SPSS SAV, SPSS compressed ZSAV, SAS XPORT, SAS7BDAT) so the wrong format cannot be silently substituted.
readstat extracts Format version line across DTA SAV ZSAV SAS7BDAT formats Original / libcsv / usage-readstat-csv-format-version-extraction Passed
Builds a CSV through DTA and derives SAV, ZSAV, and SAS7BDAT files from that intermediate, captures each summary, extracts the trailing integer from the "Format version:" line with sed, and verifies that for every format the extracted value parses as a positive integer rather than being missing or non-numeric, locking in that the version field is structurally well-formed across the four formats that report it.
readstat numeric column doubling formula preserved across DTA round trip Original / libcsv / usage-readstat-csv-formula-double-relation Passed
Builds a CSV with two numeric columns where column2 equals column1 multiplied by 2 across five data rows (1->2, 2->4, 3->6, 4->8, 5->10), converts through DTA, and verifies in the readback that for each data row the second-column numeric value is exactly twice the first-column numeric value, computed by parsing the integer portions of the six-decimal short forms with awk.
readstat single int column 1 to 1000 count Original / libcsv / usage-readstat-csv-int-1-to-1000-count Passed
Builds a CSV with a single numeric column carrying integers 1 through 1000, converts through DTA, and verifies the summary reports exactly 1000 rows and that the first and last values reappear at the expected positions.
readstat CSV preserves 32 bit and 64 bit integer boundary values Original / libcsv / usage-readstat-csv-int32-max-boundary Passed
Builds a CSV with one numeric column carrying signed 32 bit min and max plus signed 64 bit min and max plus a few neighbouring boundary values, converts through DTA, and verifies each integer reappears on readback as its expected six-decimal value rather than overflowing or being truncated.
readstat numeric with leading plus sign Original / libcsv / usage-readstat-csv-leading-plus-sign Passed
Converts a CSV whose numeric values carry an explicit leading plus sign through DTA and verifies the sign is normalized away in the readback.
readstat long column names through DTA and SAV Original / libcsv / usage-readstat-csv-long-column-names Passed
Converts a CSV with column names longer than 32 characters through DTA and SAV and verifies the long names are preserved verbatim in the readback header for each format.
readstat 30 column CSV round trip Original / libcsv / usage-readstat-csv-many-columns-roundtrip Passed
Builds a 30-column numeric CSV with matching metadata, converts through DTA, and verifies the column count and first and last column values survive.
readstat distinct strictly increasing numeric column preserves order and values Original / libcsv / usage-readstat-csv-many-distinct-increasing Passed
Builds a CSV with one numeric column carrying 25 strictly increasing distinct values, converts through DTA, and verifies every value reappears at its original line position so neither the order nor the magnitudes drift after the round trip.
readstat rejects metadata that does not list a CSV column Original / libcsv / usage-readstat-csv-mismatched-metadata-variable-rejected Passed
Supplies a CSV header with columns "n,v" but a JSON metadata file that lists "foobar,v", and verifies readstat exits non-zero with "Could not find type of variable n in metadata", proving readstat validates that every CSV column has a metadata entry rather than silently typing the unknown column.
readstat mixed int and float numeric columns Original / libcsv / usage-readstat-csv-mixed-int-float-columns Passed
Converts a CSV whose first numeric column carries integers and second numeric column carries non-integral floats through DTA and verifies both columns survive at six-decimal precision without one column collapsing into the other type.
readstat mixed numeric and string columns with varying string widths Original / libcsv / usage-readstat-csv-mixed-numeric-string-padding Passed
Builds a CSV with one numeric column and one string column where string values vary in length from 1 to 12 characters, converts through DTA, and verifies each string value reappears verbatim alongside its paired numeric value rendered to six decimals.
readstat multiple negative numeric rows Original / libcsv / usage-readstat-csv-multi-negative-numbers Passed
Converts a CSV with several negative numeric values of varying magnitudes through DTA and verifies each value reappears in the CSV readback.
readstat CSV through DTA SAV and back to CSV Original / libcsv / usage-readstat-csv-multistep-format-hops Passed
Round-trips a CSV through DTA, then through SAV, then back to CSV via DTA, verifying string and numeric values survive every hop.
readstat numeric precision through DTA Original / libcsv / usage-readstat-csv-numeric-precision Passed
Converts a CSV with several many-digit decimal values through DTA and verifies the readback retains 15 significant digits, matching readstat's high-precision numeric output.
readstat multi-column CSV with one numeric and one string column Original / libcsv / usage-readstat-csv-one-numeric-one-string Passed
Builds a two-column CSV pairing a numeric column with a single string column and verifies that after a DTA round trip the readback header preserves the column order, the numeric column is rendered as six-decimal floats while the string column remains quoted, and the values are not transposed across the column boundary.
readstat CSV preserves paired very large positive and negative integers Original / libcsv / usage-readstat-csv-paired-large-pos-neg Passed
Builds a CSV whose single numeric column alternates between very large positive and very large negative integers (up to 1e15 in magnitude), converts through DTA, and verifies each paired value reappears with its sign and magnitude intact and that no positive value collapses into its negative twin.
readstat CSV two correlated numeric columns Original / libcsv / usage-readstat-csv-positive-negative-correlation Passed
Builds a CSV with two distinct numeric columns where one is positively correlated with row index and another is negatively correlated, converts through DTA, and verifies the monotonic increase and decrease survive readback exactly.
readstat quoted CSV header with space in column name Original / libcsv / usage-readstat-csv-quoted-column-name-with-space Passed
Converts a CSV whose header row carries a quoted column name containing a space character through DTA using a matching metadata variable name and verifies the original quoted header is restored on readback and the data row reappears intact.
readstat CSV with quoted column names that fit DTA naming roundtrips cleanly Original / libcsv / usage-readstat-csv-quoted-header-no-spaces Passed
Builds a CSV whose header row uses quoted column names that still fit DTA naming rules (no spaces, no special characters), converts through DTA, and verifies the quotes are stripped from the stored variable names while the data rows survive the round trip with the un-quoted column names in the readback header.
readstat specific cell preserved by row and column index Original / libcsv / usage-readstat-csv-row-column-cell-roundtrip Passed
Builds a CSV where row 4 column 2 carries a unique numeric marker value (8675309) surrounded by distractor zeros, converts through DTA, and verifies the marker reappears at the same row and column position in the readback CSV without bleeding into neighbouring cells.
readstat converts CSV-built SAS7BDAT into an XPT transport file Original / libcsv / usage-readstat-csv-sas7bdat-to-xpt-cross-format Passed
Pipelines CSV plus JSON metadata into a DTA, then DTA into a SAS7BDAT, then SAS7BDAT into an XPT transport file, and finally reads the XPT back to CSV. Verifies the XPT summary identifies the transport format and the readback CSV preserves the three rows produced by the SAS7BDAT -> XPT writer chain (a path that exercises libreadstat's SAS reader and the XPT writer).
readstat scientific notation lowercase and uppercase Original / libcsv / usage-readstat-csv-scientific-mixed-case Passed
Converts a CSV with scientific notation values using both lowercase e and uppercase E, plus negative exponents, through DTA and verifies each parses to the expected numeric value.
readstat sentinel value at row 1 column 1 preserved exactly Original / libcsv / usage-readstat-csv-sentinel-row1-col1 Passed
Builds a CSV where the very first data cell (row 1, column 1) carries a unique sentinel numeric value (271828) surrounded by zeros, converts through DTA, and verifies the readback line 2 (data row 1) has the sentinel in field 1 and zeros in subsequent fields, that the sentinel appears exactly once in the entire output, and that no other data row has any non-zero value in column 1.
readstat 1x1 CSV Original / libcsv / usage-readstat-csv-single-cell-1x1 Passed
Converts a CSV containing exactly one column and one data row through DTA and verifies the summary, header, and single value all survive.
readstat 1x1 CSV with numeric value Original / libcsv / usage-readstat-csv-single-cell-numeric-1x1 Passed
Converts a CSV containing exactly one numeric column and one numeric data row (the value 17) through DTA and verifies the summary reports Columns 1 and Rows 1, the readback header is the bare numeric column name and the single data line is the six-decimal short form of 17, distinguishing this numeric 1x1 case from the existing string-flavoured 1x1 test.
readstat text-only string column preserved through DTA Original / libcsv / usage-readstat-csv-text-only-column-roundtrip Passed
Converts a CSV containing a single string-typed column with four distinct ASCII labels through DTA and verifies every label reappears verbatim and in the same order on readback.
readstat three-column CSV with string, integer-valued, and float-valued columns Original / libcsv / usage-readstat-csv-three-distinct-types Passed
Builds a three-column CSV pairing a STRING column with two NUMERIC columns whose data is shaped as integers in column 2 and as non-integral floats in column 3, converts through DTA, and verifies the readback header order is preserved, the string column stays quoted, the integer-valued numeric column renders with .000000 suffix, and the float-valued numeric column renders the fractional part exactly.
readstat CSV to DTA Original / libcsv / usage-readstat-csv-to-dta Passed
readstat CSV to SPSS POR portable file summary Original / libcsv / usage-readstat-csv-to-por-summary Passed
Builds an SPSS portable POR file from CSV via DTA using uppercase variable names that the portable format requires and verifies the metadata summary identifies the SPSS portable format and reports the column count matching the input CSV shape.
readstat CSV to SAS7BDAT round trip Original / libcsv / usage-readstat-csv-to-sas7bdat-roundtrip Passed
Converts CSV through DTA into a SAS7BDAT data file and verifies the field values reappear in CSV after readback.
readstat CSV to SAV Original / libcsv / usage-readstat-csv-to-sav Passed
readstat CSV to XLSX output Original / libcsv / usage-readstat-csv-to-xlsx-output Passed
Converts CSV through DTA into an XLSX workbook and verifies the workbook is a valid zip with the expected shared strings and cell value.
readstat CSV to SAS XPORT round trip Original / libcsv / usage-readstat-csv-to-xpt-roundtrip Passed
Converts CSV through DTA into a SAS transport (XPT) file and verifies the values survive the round trip back to CSV.
readstat CSV to compressed ZSAV round trip Original / libcsv / usage-readstat-csv-to-zsav-roundtrip Passed
Converts CSV through DTA into an SPSS compressed binary (ZSAV) file and verifies the values and binary compression marker.
readstat CSV with trailing empty lines Original / libcsv / usage-readstat-csv-trailing-empty-lines Passed
Converts a CSV that ends with several blank lines through DTA and verifies the trailing blanks do not inflate the row count.
readstat trailing whitespace inside string fields normalized to trimmed value Original / libcsv / usage-readstat-csv-trailing-whitespace-fields Passed
Builds a CSV whose quoted string fields carry trailing space characters after the actual content (for example "alpha ", "beta "), converts through DTA, and verifies that the readback emits the trimmed string content without the trailing spaces — distinguishing this case from the existing whitespace-only-field test which collapses all-whitespace to empty.
readstat all-uppercase column names preserve case Original / libcsv / usage-readstat-csv-uppercase-column-names Passed
Converts a CSV whose header row uses fully uppercase column names through DTA and verifies the readback emits the column names in the same all-uppercase form, locking in that readstat does not lowercase or normalize the casing.
readstat treats .CSV uppercase as a CSV input Original / libcsv / usage-readstat-csv-uppercase-extension-accepted Passed
Stores the input fixture with an uppercase ".CSV" extension and verifies readstat still recognizes the format, ingests both rows, and writes a valid DTA. Documents that readstat's input-format dispatch is not strictly case-sensitive and matches the ".csv" path that lowercase fixtures exercise.
readstat does not strip UTF-8 BOM from CSV header Original / libcsv / usage-readstat-csv-utf8-bom-header-rejected Passed
Prepends a UTF-8 BOM (EF BB BF) to a CSV header row and verifies readstat treats the BOM bytes as part of the first column name, fails the metadata lookup with an explicit "Could not find type of variable" diagnostic, and exits non-zero rather than silently dropping the BOM.
readstat preserves multi-word variable labels in DTA Original / libcsv / usage-readstat-csv-variable-labels-embedded-in-dta Passed
Drives readstat with a JSON metadata file declaring three columns whose labels are multi-word strings ("First Name", "Family Surname", "Age in Years"), converts the CSV to DTA, and verifies all three label strings are present in the binary DTA payload by scanning with strings(1). Variable labels are part of the libreadstat contract that calling code (Stata, pandas) relies on for column documentation.
readstat CSV with a 1500 character single field Original / libcsv / usage-readstat-csv-very-long-field Passed
Builds a CSV whose string column carries a single field longer than 1500 characters, declares its width via metadata, converts through DTA, and verifies the full string reappears verbatim on readback alongside its sibling short-field row.
readstat whitespace-only string field normalized to empty Original / libcsv / usage-readstat-csv-whitespace-only-field Passed
Converts a CSV whose string field contains only space characters through DTA and verifies readstat normalizes whitespace-only fields to empty strings while preserving row count and other columns.
readstat accepts CSV with no terminating newline Original / libcsv / usage-readstat-csv-without-trailing-newline-accepted Passed
Writes a CSV whose final byte is a digit rather than a line feed and verifies readstat ingests both data rows, reports two rows in the DTA summary, and emits both records in the readback CSV. RFC 4180 makes the trailing CRLF optional and many spreadsheet exports omit it; this locks in the behavior.
readstat DTA column count Original / libcsv / usage-readstat-dta-column-count Passed
readstat DTA comma value Original / libcsv / usage-readstat-dta-comma-value Passed
readstat DTA count sum Original / libcsv / usage-readstat-dta-count-sum Passed
readstat DTA to CSV preserves exact decimal representation Original / libcsv / usage-readstat-dta-csv-exact-decimal-preservation Passed
Builds a DTA from a CSV whose numeric column carries exactly representable binary decimals (0.5, 0.25, 0.125, 0.0625), then reads the DTA back to CSV twice — once into a reference file and once into a comparison file — and verifies the decimal cells are emitted in their exact canonical six-decimal form (0.500000, 0.250000, 0.125000, 0.062500), that the two readbacks are byte-identical, and that no value drifts into long-form scientific notation or extra digits.
readstat DTA date string Original / libcsv / usage-readstat-dta-date-string-batch11 Passed
readstat DTA decimal number Original / libcsv / usage-readstat-dta-decimal-number Passed
readstat DTA double quote string Original / libcsv / usage-readstat-dta-double-quote-string-batch11 Passed
readstat DTA empty string row Original / libcsv / usage-readstat-dta-empty-string-row Passed
Converts a CSV row containing an empty quoted string to DTA with readstat and verifies the summary still reports a single column.
readstat DTA header fields Original / libcsv / usage-readstat-dta-header-fields Passed
Converts CSV to DTA with readstat and verifies the exported CSV header row preserves the expected field order.
readstat DTA large positive number Original / libcsv / usage-readstat-dta-large-positive-number Passed
Converts a six-digit positive integer to DTA with readstat and verifies the formatted decimal value in the output CSV.
readstat DTA leading space note Original / libcsv / usage-readstat-dta-leading-space-note Passed
readstat DTA leading zero string Original / libcsv / usage-readstat-dta-leading-zero-string Passed
Converts a string field with leading zeros through DTA and verifies the leading zeros survive export.
readstat DTA long string Original / libcsv / usage-readstat-dta-long-string Passed
readstat DTA mixed-case header Original / libcsv / usage-readstat-dta-mixed-case-header-roundtrip Passed
Converts a mixed-case CSV header to DTA with readstat and verifies the round-tripped header preserves the original column casing.
readstat DTA mixed decimal sign Original / libcsv / usage-readstat-dta-mixed-decimal-sign Passed
Converts signed decimal numbers to DTA with readstat and verifies both formatted values in the output CSV.
readstat DTA mixed group value Original / libcsv / usage-readstat-dta-mixed-group Passed
readstat DTA multiline note Original / libcsv / usage-readstat-dta-multiline-note-roundtrip Passed
Converts a quoted multiline CSV field to DTA with readstat and verifies both lines survive the round-tripped output.
readstat DTA negative number Original / libcsv / usage-readstat-dta-negative-number Passed
readstat DTA numeric-looking string Original / libcsv / usage-readstat-dta-numeric-string-roundtrip Passed
Converts a decimal-looking string column to DTA with readstat and verifies the round-tripped output still preserves the quoted text form.
readstat DTA pipe note Original / libcsv / usage-readstat-dta-pipe-note Passed
readstat DTA quoted comma string Original / libcsv / usage-readstat-dta-quoted-comma-string Passed
Converts a quoted CSV field containing a comma to DTA with readstat and verifies the embedded comma survives the round trip.
readstat DTA to DTA preserves variable order Original / libcsv / usage-readstat-dta-roundtrip-variable-order Passed
Converts a CSV with a deliberately non-alphabetical column order (zulu, alpha, mike) into DTA, then re-encodes that DTA into a second DTA file, and verifies the readback header on both DTAs lists the columns in the original input order rather than reordered.
readstat DTA row count Original / libcsv / usage-readstat-dta-row-count Passed
readstat DTA row order Original / libcsv / usage-readstat-dta-row-order Passed
readstat numeric column survives DTA SAV DTA hop Original / libcsv / usage-readstat-dta-sav-dta-numeric-type Passed
Converts a CSV with one string column and one numeric column to DTA, hops through SAV, then back to a second DTA, and verifies the numeric column still emits six-decimal numeric values (rather than quoted strings) on the final readback, confirming type information survives the cross-format hop.
readstat DTA scientific number Original / libcsv / usage-readstat-dta-scientific-number Passed
Converts a scientific-notation numeric CSV field to DTA with readstat and verifies the normalized numeric output.
readstat DTA score sum Original / libcsv / usage-readstat-dta-score-sum Passed
Converts multiple CSV rows through DTA and verifies numeric score aggregation over the exported data.
readstat DTA single column Original / libcsv / usage-readstat-dta-single-column Passed
readstat DTA slash note Original / libcsv / usage-readstat-dta-slash-note Passed
readstat DTA small decimal Original / libcsv / usage-readstat-dta-small-decimal-batch11 Passed
readstat spaced string value Original / libcsv / usage-readstat-dta-spaced-value Passed
readstat DTA single row summary Original / libcsv / usage-readstat-dta-summary-single-row Passed
readstat DTA tab note Original / libcsv / usage-readstat-dta-tab-note Passed
Converts a CSV field containing a tab to DTA with readstat and verifies the tab survives the round trip.
readstat DTA three row numbers Original / libcsv / usage-readstat-dta-three-row-numbers Passed
Converts three numeric rows to DTA with readstat and verifies all three formatted decimal values appear in the output CSV.
readstat DTA three rows Original / libcsv / usage-readstat-dta-three-rows Passed
readstat DTA to CSV with metadata file inspection Original / libcsv / usage-readstat-dta-to-csv-with-meta-inspection Passed
Converts a CSV through DTA, then independently dumps the DTA back to CSV and the DTA metadata summary to a separate file, and verifies both that the data file readback carries the input rows and that the metadata file inspection reports the matching row, column, format header, and byte order alongside it.
readstat DTA to CSV Original / libcsv / usage-readstat-dta-to-csv Passed
readstat DTA two-column summary Original / libcsv / usage-readstat-dta-two-column-summary Passed
readstat DTA two-row strings Original / libcsv / usage-readstat-dta-two-row-strings Passed
Converts two string rows to DTA with readstat and verifies both rows survive round trip in the original order.
readstat DTA two string columns Original / libcsv / usage-readstat-dta-two-string-columns-batch11 Passed
readstat DTA underscore header Original / libcsv / usage-readstat-dta-underscore-header-batch11 Passed
readstat DTA Unicode string Original / libcsv / usage-readstat-dta-unicode-string Passed
Converts a CSV containing Unicode text to DTA with readstat and verifies the decoded string survives the round trip.
readstat DTA zero number Original / libcsv / usage-readstat-dta-zero-number Passed
Converts a zero-valued numeric column to DTA with readstat and verifies the zero survives round trip.
readstat zero numeric value Original / libcsv / usage-readstat-dta-zero-value Passed
readstat escaped quote CSV fields Original / libcsv / usage-readstat-escaped-quotes-csv Passed
readstat -f flag overwrites a pre-existing output file Original / libcsv / usage-readstat-force-flag-overwrites-existing Passed
Generates a DTA from a CSV, runs readstat once to produce out.csv, then re-runs the same conversion with -f and verifies the second invocation succeeds quietly, leaves no "File exists" diagnostic, and that the output file's mtime advances (proving it was rewritten rather than skipped).
readstat preserves 14-digit double precision through DTA round-trip Original / libcsv / usage-readstat-high-precision-double-preserved Passed
Round-trips three irrational mathematical constants (pi, e, sqrt(2)) carried to fourteen digits past the decimal point through CSV to DTA and back to CSV, and verifies every output digit string matches the input character-for-character so no precision is silently truncated by the readstat numeric pipeline.
readstat metadata summary Original / libcsv / usage-readstat-metadata-summary Passed
Runs readstat against a CSV-derived DTA file and verifies the reported variable and row metadata.
readstat reports diagnostic on a non-existent input file Original / libcsv / usage-readstat-missing-input-file-fails Passed
Asks readstat to convert from an input path that does not exist to a CSV output, captures stderr, and verifies the diagnostic mentions an unable-to-open error and refuses to write any rows of output content beyond an empty placeholder, locking in the failure pathway for missing inputs.
readstat missing CSV values Original / libcsv / usage-readstat-missing-values Passed
Runs readstat on CSV input with an empty numeric value and verifies the missing value is preserved.
readstat without arguments prints usage banner Original / libcsv / usage-readstat-no-args-emits-usage Passed
Invokes readstat with no positional arguments, captures stdout and stderr, and verifies the binary prints the standard banner including the version line, the supported input extensions list, and the convert syntax describing input and output filenames.
readstat normalized CSV output Original / libcsv / usage-readstat-normalize-csv Passed
readstat refuses to overwrite an existing output without -f Original / libcsv / usage-readstat-overwrite-protection-without-f Passed
Generates a DTA from CSV, converts it to CSV once, then attempts the same conversion a second time without the -f flag and verifies readstat emits a "File exists (Use -f to overwrite)" diagnostic and leaves the existing output file's bytes byte-for-byte unchanged.
readstat quoted CSV fields Original / libcsv / usage-readstat-quoted-csv Passed
Runs readstat on a quoted CSV field containing a comma and verifies the parsed value survives conversion.
readstat preserves a 14-significant-digit double through DTA roundtrip Original / libcsv / usage-readstat-r10-csv-extreme-double-precision-preserved Passed
Round-trips two well-known irrational constants with at least 15 input digits (pi 3.141592653589793, sqrt2 1.4142135623730951) through DTA and back to CSV and verifies the readstat CSV writer emits the values with the high-precision 14-significant-digit rendering that occurs whenever the truncation to the default 6-decimal form would lose information.
readstat rejects a CSV that has only a header row Original / libcsv / usage-readstat-r10-csv-header-only-no-data-rejected Passed
Provides a CSV consisting solely of a header line with no data rows and verifies readstat fails the conversion with a "One or more columns must be provided" diagnostic on stderr while leaving no output file behind, distinguishing the empty-data-row case from the empty-file case which has its own dedicated diagnostic.
readstat preserves leading-zero codes when the column is STRING Original / libcsv / usage-readstat-r10-csv-leading-zero-string-preserved Passed
Round-trips a CSV column containing zero-padded numeric-looking codes (007, 042, 099) declared as STRING through DTA and back to CSV, verifying the leading zeros survive intact rather than being silently coerced to numeric values like 7, 42, 99.
readstat SAV summary reports Text encoding UTF-8 by default Original / libcsv / usage-readstat-r10-csv-sav-text-encoding-utf8-default Passed
Converts a CSV containing pure ASCII content directly into an SPSS SAV file using the SPSS metadata type and verifies the readstat summary reports the "Text encoding: UTF-8" line, locking in that newly created SAV files default to UTF-8 even when no Unicode characters are present in the source data.
readstat distinguishes SAV row compression from ZSAV binary compression Original / libcsv / usage-readstat-r10-csv-sav-zsav-compression-distinguished Passed
Builds the same CSV through DTA into both an SPSS SAV file and an SPSS ZSAV file and verifies the metadata summaries report distinct compression algorithms (Compression: rows for SAV, Compression: binary for ZSAV), confirming the two SPSS variants are not collapsed onto a single compression mode in the readstat CLI output.
readstat reports Table label (null) when the JSON metadata supplies no label Original / libcsv / usage-readstat-r10-csv-table-label-null-when-unset Passed
Converts a CSV through DTA and SAV using a JSON metadata file that declares no top-level table label and verifies both readstat summaries emit the literal "Table label: (null)" line, locking in the canonical placeholder used by the CLI when no Stata or SPSS dataset label was supplied.
readstat -h prints the full help banner with all conversion modes Original / libcsv / usage-readstat-r10-help-flag-banner-shape Passed
Invokes readstat with the -h flag and verifies the help banner enumerates every documented mode of operation including the metadata view, the CSV-to-stdout dump, the format-to-format conversion, the CSV+JSON metadata conversion, the CSV+command-file conversion, and the SAS7BDAT-with-catalog conversion, ensuring no documented entry point disappears from the help text.
readstat surfaces an explicit error reading SPSS portable POR back to CSV Original / libcsv / usage-readstat-r10-por-readback-error-message Passed
Builds an SPSS portable POR file from a CSV via DTA and then attempts to convert that POR file back to CSV, verifying readstat does not silently produce empty output but instead emits an "Error processing" diagnostic naming the POR path with an "Invalid file, or file has unsupported features" reason and refuses to create the destination CSV file.
readstat -v prints only the version line on stdout Original / libcsv / usage-readstat-r10-version-flag-stdout Passed
Invokes readstat with the -v flag and verifies the binary prints exactly one stdout line of the form "ReadStat version X.Y.Z" with stderr empty and exits zero, distinguishing the version-only output from the full help banner emitted with no arguments.
readstat XPT summary reports Rows -1 and omits byte-order encoding compression lines Original / libcsv / usage-readstat-r10-xpt-summary-rows-minus-one-quirk Passed
Builds a SAS XPORT file from a five-row CSV via DTA and verifies the readstat metadata summary reports the documented "Rows: -1" placeholder (XPORT does not store the row count in its header) and that the summary intentionally omits the Byte order, Text encoding, and Compression lines that DTA, SAV, and ZSAV emit, locking in the XPT-specific metadata shape.
readstat DTA writer pins Format version to 118 by default Original / libcsv / usage-readstat-r11-dta-format-version-118-default Passed
Builds a DTA from a CSV with no version override and verifies the readstat summary reports "Format version: 118" rather than leaving the version field unpinned, locking in the Stata 14+ wire format as the default DTA version emitted by the readstat writer on Ubuntu 24.04.
readstat dta-to-sas7bdat summary reports little-endian byte order Original / libcsv / usage-readstat-r11-dta-to-sas7bdat-byte-order-little-endian Passed
Builds a SAS7BDAT from a CSV via DTA and verifies the readstat summary contains the "Byte order: little-endian" line, locking in that the SAS7BDAT writer on Ubuntu 24.04 emits little-endian byte order in its header (a field that the format records explicitly, unlike XPT which omits the line entirely).
readstat dta-to-sas7bdat summary pins Format version to 9 Original / libcsv / usage-readstat-r11-dta-to-sas7bdat-format-version-9 Passed
Builds a SAS7BDAT from a CSV via DTA and verifies the readstat summary reports the SAS data file format with the specific "Format version: 9" line that locks in SAS7BDAT v9 as the format version emitted by the readstat SAS7BDAT writer on Ubuntu 24.04.
readstat dta-to-xpt summary pins Format version to 8 Original / libcsv / usage-readstat-r11-dta-to-xpt-format-version-8 Passed
Builds an XPT from a CSV via DTA and verifies the readstat summary reports the SAS Transport file format with the specific "Format version: 8" line that locks in XPT v8 as the format version emitted by the readstat XPT writer on Ubuntu 24.04.
readstat SAS7BDAT to CSV renders integer-valued numerics with six trailing decimals Original / libcsv / usage-readstat-r11-sas7bdat-csv-six-decimal-rendering Passed
Round-trips three integer-valued ids (1, 2, 3) through SAS7BDAT (built via DTA) and back to CSV and verifies the readstat CSV writer emits each integer with the six-trailing-decimal "1.000000" / "2.000000" / "3.000000" rendering rather than as bare integers, exercising the SAS7BDAT-reader -> CSV-writer pipeline's numeric formatting on Ubuntu 24.04.
readstat XLSX [Content_Types].xml advertises spreadsheetml worksheet content type Original / libcsv / usage-readstat-r11-xlsx-content-types-spreadsheetml Passed
Builds an XLSX from a small CSV via DTA and parses [Content_Types].xml inside the OOXML zip to verify the worksheet content type "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" is registered, locking in OOXML conformance of the readstat XLSX writer beyond the previously-checked sheet1.xml dimension.
readstat XLSX root _rels/.rels declares xl/workbook.xml as the office document target Original / libcsv / usage-readstat-r11-xlsx-rels-targets-workbook-xml Passed
Builds an XLSX from a small CSV via DTA and parses _rels/.rels inside the OOXML zip to verify the package-level relationship of type "officeDocument" targets exactly "xl/workbook.xml", locking in the OOXML root-relationships layout produced by the readstat XLSX writer.
readstat XLSX xl/workbook.xml registers a single named worksheet Original / libcsv / usage-readstat-r11-xlsx-workbook-xml-references-sheet Passed
Builds an XLSX from a small CSV via DTA and parses xl/workbook.xml inside the OOXML zip to verify the workbook lists exactly one <sheet> element with sheetId="1" and a non-empty name attribute, locking in single-sheet workbook structure rather than only checking the per-sheet content.
readstat XPT to CSV emits all rows even though the XPT header reports Rows -1 Original / libcsv / usage-readstat-r11-xpt-csv-row-count-correct-after-conversion Passed
Builds an XPT from a five-row CSV via DTA and verifies that, despite the XPT summary reporting the documented "Rows: -1" placeholder, the readstat XPT-to-CSV conversion still emits a header line and all five data rows, locking in the asymmetry between XPT metadata row reporting and actual row enumeration during conversion.
readstat XPT to CSV renders integer-valued numerics with six trailing decimals Original / libcsv / usage-readstat-r11-xpt-csv-six-decimal-rendering Passed
Round-trips three integer-valued ids (1, 2, 3) through XPT (built via DTA) and back to CSV and verifies the readstat CSV writer emits each integer with the six-trailing-decimal "1.000000" / "2.000000" / "3.000000" rendering rather than as bare integers, exercising the XPT-reader -> CSV-writer pipeline's numeric formatting on Ubuntu 24.04.
readstat preserves a quoted CRLF in a string field across DTA roundtrip Original / libcsv / usage-readstat-r12-csv-quoted-newline-roundtrip Passed
Round-trips a quoted CSV field whose embedded newline is a CRLF (carriage-return + line-feed) through DTA and back to CSV and asserts the multi-line content reappears in the output, distinguishing the CRLF embedded-newline case from the LF-only case.
readstat csv -> DTA writes a 2-column, 2-row file the reader summarises consistently Original / libcsv / usage-readstat-r12-csv-table-label-set-from-meta Passed
Round-trips a 2-column 2-row CSV through DTA via readstat and asserts the readstat reader summary reports "Stata binary file" with "Columns: 2" and "Rows: 2", locking in the CSV→DTA writer round-trip without depending on label propagation (top-level "label" → Table label and per-variable labels are both unstable across readstat 1.1.9 — the column/row totals are the documented stable surface).
readstat dta - writes CSV body to stdout Original / libcsv / usage-readstat-r12-csv-to-stdout-dash-target Passed
Uses the documented "-" output target with a DTA input and asserts the CSV body lands on stdout (file descriptor 1) with the expected header and data rows, exercising the dump-to-stdout entry point distinct from a named .csv output file.
readstat csv -> .sav produces an SPSS binary file readable by readstat Original / libcsv / usage-readstat-r12-csv-to-zsav-file-suffix Passed
Converts a CSV directly to a .sav target and verifies the readstat summary identifies the resulting file as an SPSS binary file with the correct variable count, locking in sav extension routing through the SPSS writer. (csv -> .zsav segfaults on readstat 1.1.9 with the noble build options; .sav is the stable SPSS surface.)
readstat DTA summary reports Columns: 3 and Rows: 4 for a 4x3 input Original / libcsv / usage-readstat-r12-dta-summary-columns-rows-line Passed
Builds a 4-row 3-column DTA from CSV and asserts the readstat summary contains the precise "Columns: 3" and "Rows: 4" lines, locking in the count-line shape of the metadata view for a known-shape file.
readstat with no arguments prints the usage banner including ReadStat version Original / libcsv / usage-readstat-r12-no-args-banner-includes-version Passed
Invokes readstat with no arguments, captures stdout+stderr, and asserts the resulting banner contains both the "ReadStat version" line and the conversion-mode descriptions, ensuring the bare-invocation path matches the help-flag content shape.
readstat SAV writer reports a positive Format version line Original / libcsv / usage-readstat-r12-sav-format-version-3 Passed
Builds a SAV from a CSV and verifies the readstat summary reports "SPSS binary file" together with a "Format version: N" line where N is a positive integer. (readstat 1.1.9 emits version 2 or 3 depending on build options; either is fine — assert the line exists with a positive integer rather than pinning the exact value.)
readstat XLSX archive contains xl/worksheets/sheet1.xml Original / libcsv / usage-readstat-r12-xlsx-sheet-1-xml-present Passed
Builds an XLSX from a CSV via DTA and verifies the resulting OOXML zip archive contains the worksheet entry "xl/worksheets/sheet1.xml", locking in the conventional sheet path used by the readstat XLSX writer.
readstat XPT summary reports Format: SAS transport file (XPORT) Original / libcsv / usage-readstat-r12-xpt-format-line-exact-text Passed
Builds an XPT from a CSV via DTA and verifies the readstat summary contains the precise "Format: SAS transport file (XPORT)" line, locking in the literal format-line text used by the readstat metadata view for XPT files on Ubuntu 24.04.
readstat XPT summary reports Table name: DATASET by default Original / libcsv / usage-readstat-r12-xpt-table-name-default-dataset Passed
Builds an XPT from a CSV via DTA and verifies the readstat summary contains the canonical "Table name: DATASET" line that the XPT writer emits in the absence of an explicit table-name override, distinguishing XPT defaults from formats that use the dataset label slot instead.
readstat DTA-to-CSV stdout dump emits exactly N+1 lines for N data rows Original / libcsv / usage-readstat-r13-csv-to-dta-multi-row-csv-readback-line-count Passed
Round-trips a 7-row 2-column CSV through DTA, dumps the DTA back to CSV via the dash stdout target, and asserts the resulting stdout contains exactly 8 newline-terminated lines (one header + seven data rows), pinning the line-count contract of the CSV-to-stdout dump path for a known shape.
readstat CSV to DTA to CSV preserves a 1.000000 numeric value exactly Original / libcsv / usage-readstat-r13-csv-to-dta-roundtrip-numeric-exact Passed
Round-trips a CSV row whose numeric column carries the integer 1 through DTA and back to CSV via the dash stdout target, and asserts the readback CSV renders the value as the canonical six-decimal fixed-point form "1.000000" rather than the bare integer or a scientific-notation form.
readstat-produced POR contains the SPSS PORT FILE marker in its leading region Original / libcsv / usage-readstat-r13-csv-to-por-file-magic-spss-port Passed
Builds an SPSS portable POR file from a CSV via DTA and asserts the first kilobyte of the output contains the literal "SPSS PORT FILE" marker that the SPSS portable header embeds, locking in that the readstat POR writer emits a structurally recognisable SPSS portable text file rather than a CSV-shaped placeholder.
readstat-produced SAS7BDAT contains the canonical SAS7BDAT magic in its header Original / libcsv / usage-readstat-r13-csv-to-sas7bdat-file-magic-binary Passed
Builds a SAS7BDAT from a CSV via DTA and asserts the first kilobyte of the output contains the canonical SAS7BDAT magic byte sequence (c2 ea 81 60 b3 14 11 cf bd 92 08 00 09 c7 31 8c), locking in that the readstat SAS7BDAT writer emits a byte-recognisable SAS data file rather than a CSV-shaped placeholder.
readstat-produced XPT carries the HEADER RECORD LIBV8 magic in the first 80 bytes Original / libcsv / usage-readstat-r13-csv-to-xpt-header-libname Passed
Builds an XPT from a CSV via DTA and asserts the first 80-byte record of the output contains the canonical "HEADER RECORD" preamble and the "LIBV8" library-version-8 token that marks a SAS XPORT v8 transport file as written by readstat on Ubuntu 24.04, locking in that the readstat XPT writer emits a structurally recognisable XPORT file rather than an arbitrarily-formed binary.
readstat DTA summary reports Byte order: little-endian by default Original / libcsv / usage-readstat-r13-dta-summary-byte-order-line Passed
Builds a DTA from a CSV with no byte-order override and verifies the readstat summary contains the literal "Byte order: little-endian" line, locking in little-endian as the default byte order emitted by the readstat DTA writer on Ubuntu 24.04 — distinguishing the byte-order line from the format-version line and exercising the DTA path specifically.
readstat DTA-to-SAV summary reports Format version: 2 Original / libcsv / usage-readstat-r13-dta-to-sav-format-version-line Passed
Builds an SPSS SAV file from a CSV via DTA and verifies the readstat summary reports the precise "Format version: 2" line on the SAV path, locking in that readstat 1.1.9 on Ubuntu 24.04 emits SPSS layout version 2 (not 3) for newly written SAV files — distinguishing the SAV version line from the DTA 118 default.
readstat POR summary reports Rows: -1 because the portable header lacks a row count Original / libcsv / usage-readstat-r13-por-summary-rows-line Passed
Builds an SPSS POR file from a CSV via DTA using uppercase variable names that the portable format requires, and verifies the readstat summary reports the literal "Rows: -1" line, locking in that POR shares the XPORT-style "row count not available from header" behaviour and distinguishing it from the DTA path which reports the precise row count.
readstat SAS7BDAT summary reports Text encoding UTF-8 by default Original / libcsv / usage-readstat-r13-sas7bdat-summary-encoding-utf8 Passed
Builds a SAS7BDAT from a CSV via DTA and verifies the readstat summary contains the literal "Text encoding: UTF-8" line on the SAS7BDAT path, distinguishing the SAS data file encoding default from the (well-known) DTA default and from the XPT path which omits the encoding line.
readstat XPT summary reports Rows: -1 because XPORT lacks a row count Original / libcsv / usage-readstat-r13-xpt-summary-rows-minus-one Passed
Builds an XPT file from a CSV via DTA and verifies the readstat summary reports "Rows: -1" rather than the actual row count, locking in the well-known XPORT behaviour where the writer cannot report a row count from the header alone — distinguishing the XPT path from DTA and SAS7BDAT which report the precise row count.
readstat-produced POR carries the "ASCII SPSS PORT FILE" prefix in its leading region Original / libcsv / usage-readstat-r14-csv-to-por-ascii-prefix-marker Passed
Builds an SPSS POR from a CSV via DTA and asserts the first kilobyte of the output contains the literal "ASCII SPSS PORT FILE" prefix that the readstat POR writer emits, distinguishing the more specific ASCII-prefixed marker from the bare "SPSS PORT FILE" substring already covered.
readstat-produced XLSX is a ZIP container that unzips to expose [Content_Types].xml Original / libcsv / usage-readstat-r14-csv-to-xlsx-via-dta-content-type Passed
Round-trips a CSV through DTA and into XLSX via readstat, then runs the unzip(1) listing on the result and asserts it includes the "[Content_Types].xml" member that every Office Open XML package must contain — locking in that the XLSX writer emits a structurally valid ZIP/OOXML archive rather than a CSV-shaped placeholder.
readstat ZSAV summary reports Format: SPSS compressed binary file (ZSAV) Original / libcsv / usage-readstat-r14-csv-to-zsav-summary-format-line Passed
Builds a ZSAV from a CSV via DTA and verifies the readstat summary contains the precise "Format: SPSS compressed binary file (ZSAV)" line and a binary compression marker, locking in the literal format-line text used by the readstat metadata view for ZSAV files on Ubuntu 24.04 — distinguishing ZSAV's binary compression from SAV's row compression.
readstat DTA-to-ZSAV preserves the precise row count across the binary-compressed write Original / libcsv / usage-readstat-r14-dta-to-zsav-roundtrip-row-count Passed
Round-trips a 5-row CSV through DTA, then writes the DTA out as a ZSAV (binary-compressed SPSS), and verifies the ZSAV summary reports exactly the same row count as the source — confirming the binary-compression path of the ZSAV writer does not lose or duplicate rows on Ubuntu 24.04 readstat 1.1.9.
readstat SAS7BDAT summary reports Format version: 9 by default Original / libcsv / usage-readstat-r14-sas7bdat-format-version-nine Passed
Builds a SAS7BDAT from a CSV via DTA and verifies the readstat summary contains the literal "Format version: 9" line on the SAS7BDAT path, locking in version 9 as the default emitted by the SAS7BDAT writer on Ubuntu 24.04 — distinguishing it from the DTA default (118), the SAV default (2), and the XPT default (8).
readstat SAS7BDAT summary reports Byte order: little-endian by default Original / libcsv / usage-readstat-r14-sas7bdat-summary-byte-order-line Passed
Builds a SAS7BDAT from a CSV via DTA and verifies the readstat summary contains the literal "Byte order: little-endian" line on the SAS7BDAT path, locking in little-endian as the default byte order emitted by the SAS7BDAT writer on Ubuntu 24.04 — distinguishing the SAS7BDAT byte-order line from the encoding line.
readstat SAS7BDAT summary reports Table name: DATASET by default Original / libcsv / usage-readstat-r14-sas7bdat-table-name-default-dataset Passed
Builds a SAS7BDAT from a CSV via DTA and verifies the readstat summary contains the canonical "Table name: DATASET" line that the SAS7BDAT writer emits in the absence of an explicit table-name override, distinguishing the SAS7BDAT default from the DTA path which has no table-name slot in its summary.
readstat SAV summary reports Compression: rows by default Original / libcsv / usage-readstat-r14-sav-summary-compression-rows Passed
Builds a SAV from a CSV via DTA and verifies the readstat summary contains the literal "Compression: rows" line, locking in row-level compression as the default emitted by the readstat SAV writer on Ubuntu 24.04 — distinguishing SAV's row compression from ZSAV's binary compression.
readstat XPT summary reports Format version: 8 by default Original / libcsv / usage-readstat-r14-xpt-format-version-eight Passed
Builds an XPT from a CSV via DTA and verifies the readstat summary contains the literal "Format version: 8" line on the XPT path, locking in XPORT v8 as the default emitted by the XPT writer on Ubuntu 24.04 — matching the LIBV8 token observed in the binary header and distinguishing it from the SAS7BDAT version 9 default.
readstat ZSAV summary reports Format version: 3 (vs SAV's 2) Original / libcsv / usage-readstat-r14-zsav-format-version-three Passed
Builds a ZSAV from a CSV via DTA and verifies the readstat summary contains the precise "Format version: 3" line, locking in that ZSAV files use SPSS layout version 3 in contrast to plain SAV files which use version 2 on Ubuntu 24.04 readstat 1.1.9.
readstat DTA summary reports Table label: (null) when no label is set Original / libcsv / usage-readstat-r15-dta-table-label-null-default Passed
Builds a DTA from a CSV with no explicit dataset label and verifies the readstat summary contains the literal "Table label: (null)" line — locking in that the readstat DTA writer leaves the dataset-label slot null and the metadata view formats null as the literal string "(null)" on Ubuntu 24.04 readstat 1.1.9. Distinct from the table-name line emitted by the SAS7BDAT and XPT paths.
readstat dta-to-sas7bdat preserves the precise row count across the conversion Original / libcsv / usage-readstat-r15-sas7bdat-rows-preserved-from-dta Passed
Builds a 4-row DTA from a CSV and converts it to SAS7BDAT, then asserts the SAS7BDAT readstat summary reports "Rows: 4" — locking in that the SAS7BDAT writer preserves the exact source row count when the input is a DTA on Ubuntu 24.04 readstat 1.1.9, complementary to the existing csv-to-sas7bdat magic and version tests.
readstat sas7bdat-to-csv conversion emits exactly the source row count plus a header Original / libcsv / usage-readstat-r15-sas7bdat-to-csv-row-count-correct Passed
Round-trips a 5-row CSV through DTA into SAS7BDAT, then converts the SAS7BDAT back to CSV via stdout and asserts the resulting CSV has exactly 6 lines (1 header + 5 data rows) — locking in that the SAS7BDAT read path enumerates all rows correctly on Ubuntu 24.04 readstat 1.1.9, distinct from XPT (which reports -1 in summary but still enumerates rows) and SAV/ZSAV roundtrips.
readstat SAV summary reports Byte order: little-endian by default Original / libcsv / usage-readstat-r15-sav-byte-order-little-endian Passed
Builds a SAV from a CSV via DTA and verifies the readstat summary contains the literal "Byte order: little-endian" line on the SAV path — locking in little-endian as the default byte order emitted by the readstat SAV writer on Ubuntu 24.04 readstat 1.1.9. Distinct from the DTA and SAS7BDAT byte-order tests already in r13/r14.
readstat SAV summary reports Text encoding: UTF-8 by default Original / libcsv / usage-readstat-r15-sav-text-encoding-utf8-line Passed
Builds a SAV from a CSV via DTA and verifies the readstat summary contains the literal "Text encoding: UTF-8" line on the SAV path — locking in UTF-8 as the default text encoding emitted by the readstat SAV writer on Ubuntu 24.04 readstat 1.1.9. Distinct from the SAS7BDAT encoding-utf8 test in r13.
readstat sav-to-csv renders numeric integers as 6-decimal floating-point literals Original / libcsv / usage-readstat-r15-sav-to-csv-numeric-decimal-format Passed
Round-trips a 2-row CSV (with integer-looking numeric values) through DTA into SAV and back to CSV, and asserts the body contains the literal "1.000000" and "2.000000" forms — locking in that the SAV read path renders numeric fields with six decimal places by default on Ubuntu 24.04 readstat 1.1.9, matching the XPT and SAS7BDAT six-decimal rendering tests already in r11.
readstat XPT summary intentionally omits the Byte order line Original / libcsv / usage-readstat-r15-xpt-omits-byte-order-line Passed
Builds an XPT from a CSV via DTA and asserts the readstat summary contains NO line beginning with "Byte order:" — locking in the well-known XPT-specific shape where SAS XPORT files do not carry a runtime byte-order field, in contrast to DTA, SAV, ZSAV, and SAS7BDAT which all emit a Byte order line. Asserts the absence with -c 0.
readstat XPT summary reports Columns: 2 for a 2-column input Original / libcsv / usage-readstat-r15-xpt-summary-columns-line Passed
Builds a 2-column XPT from a CSV via DTA and verifies the readstat summary contains the literal "Columns: 2" line — locking in that the SAS XPORT writer's metadata path reports column count as a top-level summary field on Ubuntu 24.04 readstat 1.1.9, complementary to the existing XPT format-version-8 and table-name tests.
readstat ZSAV summary reports Columns: 2 like SAV does Original / libcsv / usage-readstat-r15-zsav-summary-columns-line Passed
Builds a 2-column ZSAV from a CSV via DTA and verifies the readstat summary contains the literal "Columns: 2" line — locking in that the ZSAV (binary-compressed SPSS) writer reports column count identically to plain SAV on Ubuntu 24.04 readstat 1.1.9, even though the format-version differs (3 for ZSAV vs 2 for SAV).
readstat zsav-to-csv conversion emits exactly the source row count plus a header Original / libcsv / usage-readstat-r15-zsav-to-csv-row-count-correct Passed
Round-trips a 5-row CSV through DTA into ZSAV, then converts the ZSAV back to CSV via stdout and asserts the resulting CSV has exactly 6 lines (1 header + 5 data rows) — locking in that the binary-compressed SPSS read path correctly enumerates all rows on Ubuntu 24.04 readstat 1.1.9, despite ZSAV summary metadata expressing the rows differently from DTA.
readstat preserves an embedded comma in a quoted string cell through DTA Original / libcsv / usage-readstat-r16-csv-comma-in-quoted-cell-survives Passed
Builds a CSV with a comma inside a quoted string field then round-trips it through DTA back to stdout CSV and asserts the recovered text retains the comma in a single quoted cell — verifying the libcsv-backed CSV reader does not split on inner commas.
readstat ingests a CSV with a newline inside a quoted string cell Original / libcsv / usage-readstat-r16-csv-embedded-newline-quoted-field Passed
Builds a CSV whose first string field contains an embedded newline within a quoted cell and asserts readstat reads it as a single row with 2 columns by checking the .dta summary reports Rows: 1 and Columns: 2.
readstat tolerates leading whitespace before unquoted numeric cells Original / libcsv / usage-readstat-r16-csv-leading-space-in-numeric-tolerated Passed
Builds a CSV whose numeric column cells carry one leading space before the digit, converts to DTA, and asserts the .dta summary reports the expected 3 rows and 2 columns — locking in readstat's tolerance for leading whitespace on numeric fields.
readstat round-trips a one-data-row CSV through DTA back to stdout CSV exactly Original / libcsv / usage-readstat-r16-csv-single-data-row-stdout-csv Passed
Converts a CSV containing a single non-header row to .dta then back to CSV via stdout, asserting the recovered CSV has exactly 2 lines and preserves the data cell values byte-for-byte through the DTA hop.
readstat dta-to-stdout dash target emits a CSV with quoted header Original / libcsv / usage-readstat-r16-dta-stdout-dash-csv-shape Passed
Converts a small CSV to .dta and back to stdout CSV via the "-" target, asserting the produced CSV's first line is a comma-separated quoted header listing both column names — locking in the dash-target stdout CSV output shape.
readstat POR summary reports an SPSS portable format-version line Original / libcsv / usage-readstat-r16-por-format-version-line Passed
Converts a small CSV to .por via SAV, reads back the .por summary, and asserts the summary contains a "Format:" line that mentions SPSS portable — locking in readstat's portable-write surface without committing to a specific version number text.
readstat-built xlsx contains xl/workbook.xml when inspected via python zipfile Original / libcsv / usage-readstat-r16-xlsx-zipfile-has-workbook-xml Passed
Converts CSV through DTA into an XLSX via readstat, then uses python3 zipfile to list the archive entries and asserts the standard "xl/workbook.xml" member is present — locking in the OOXML container structure of the readstat XLSX writer without relying on unzip or openpyxl.
readstat-built ZSAV file reports format-version 3 in its summary Original / libcsv / usage-readstat-r16-zsav-format-version-three Passed
Builds a ZSAV via the CSV->DTA->ZSAV chain and asserts the summary contains both "Format version: 3" and the "ZSAV" format label — locking in the binary-compressed SPSS writer's metadata shape on Ubuntu 24.04.
readstat reads its own stdout CSV back through a second conversion Original / libcsv / usage-readstat-r17-dta-stdout-csv-reparses Passed
Converts a CSV to .dta, then to stdout CSV, captures it as a new file, and asserts a follow-up CSV-to-DTA conversion against the captured output emits the same row/variable count log line as the original conversion — locking in stdout-csv re-readability.
readstat exits non-zero when the metadata declares zero variables Original / libcsv / usage-readstat-r17-empty-variables-rejected Passed
Feeds readstat a CSV with a header and a row paired with a metadata JSON whose variables array is empty, asserting the invocation exits non-zero — locking in that the writer refuses to produce output when no variables are declared.
readstat conversion log encodes a numeric duration-seconds value Original / libcsv / usage-readstat-r17-log-duration-seconds-numeric Passed
Captures readstat's stdout from a CSV-to-DTA conversion and asserts the log contains a "Converted N variables and M rows in T seconds" line where the T token parses as a positive float — locking in the structured duration emission.
readstat SAV summary includes a Format-version line with any positive integer Original / libcsv / usage-readstat-r17-sav-summary-format-line-present Passed
Builds a SAV from a small CSV and asserts the summary contains an "SPSS" marker plus any Format-version line with a positive integer, deliberately accepting noble's actual emitted value (version 2) rather than pinning the exact number.
readstat round-trips a 3-row 2-column CSV through DTA back to stdout CSV with stable shape Original / libcsv / usage-readstat-r17-tiny-csv-stdout-shape Passed
Converts a CSV with three data rows and two columns to .dta then back to CSV via stdout, asserting the recovered CSV has exactly four lines (header + 3 rows) and contains all six data cell tokens — locking in tiny-grid shape preservation.
readstat stdout CSV output ends with a trailing newline Original / libcsv / usage-readstat-r17-trailing-newline-preserved Passed
Converts a small CSV to .dta and back to stdout CSV, then asserts the last byte of the recovered stream is a newline (0x0a) — locking in the trailing-newline contract of readstat's stdout CSV writer.
readstat ZSAV summary still reports Format version 3 for a three-column input Original / libcsv / usage-readstat-r17-zsav-summary-format-version-three Passed
Builds a ZSAV from a three-column CSV via the DTA intermediate path and asserts the summary contains "Format version: 3" plus the ZSAV format label — locking in noble's compressed-SPSS writer for a wider input than the r16 two-column variant.
readstat round-trips a five-row two-column CSV through DTA back to stdout CSV Original / libcsv / usage-readstat-r18-csv-five-row-dta-roundtrip Passed
Builds a CSV with five data rows and two numeric columns, converts to .dta, then back to stdout CSV, and asserts the recovered output has exactly six lines (header + 5 rows) and contains every data cell — locking in row-count and content preservation for a slightly larger payload than the r17 tiny case.
readstat reports zero converted rows when a CSV has only a header line Original / libcsv / usage-readstat-r18-empty-data-rows-rejected Passed
Feeds readstat a header-only CSV with no data rows and asserts the log line emits "Converted 0 variables and 0 rows" along with the "One or more columns must be provided" diagnostic — locking in the structured complaint for header-only inputs.
readstat preserves negative integer cells in CSV-to-DTA-to-CSV roundtrips Original / libcsv / usage-readstat-r18-negative-integer-rendering Passed
Converts a CSV containing a column of negative integers through DTA and back to stdout CSV, then asserts each negative value appears in the recovered output with the six-decimal numeric rendering ("-1.000000", "-2.000000", "-3.000000").
readstat stdout CSV renders integer cells as N.000000 with six decimal places Original / libcsv / usage-readstat-r18-numeric-value-six-decimals Passed
Converts a CSV with a single integer column through DTA and back to stdout CSV, then asserts the lone data row equals "7.000000" — locking in the six-decimal default rendering of numeric cells for integer inputs.
readstat SAS7BDAT summary carries the SAS7BDAT format label Original / libcsv / usage-readstat-r18-sas7bdat-summary-format-line Passed
Builds a SAS7BDAT from a small two-column CSV via the DTA intermediate path and asserts the summary contains a "Format:" line mentioning SAS7BDAT — locking in the SAS binary writer's format-label emission.
readstat CSV-to-SAV-to-CSV roundtrip preserves the column header tokens Original / libcsv / usage-readstat-r18-sav-roundtrip-header-preserved Passed
Converts a small CSV to SAV via SPSS metadata, then back to stdout CSV, and asserts the recovered first line contains both column tokens "p" and "q" — locking in column header preservation through the SAV writer/reader pair.
readstat stdout CSV writer wraps each header column name in double quotes Original / libcsv / usage-readstat-r18-stdout-csv-double-quoted-header Passed
Converts a small CSV with two named columns through DTA and back to stdout CSV, then asserts the first line of the recovered output is exactly the double-quoted comma-separated header — locking in the stdout writer's quoted-header convention.
readstat summary reports the exact Rows count for a four-row input Original / libcsv / usage-readstat-r18-summary-rowcount-line Passed
Converts a CSV with exactly four data rows to .dta then captures the summary by invoking readstat against the .dta with no output destination, and asserts the summary contains "Rows: 4" — locking in row-count summary emission for known cardinality.
readstat summary of a three-column DTA reports Columns 3 and matching Rows Original / libcsv / usage-readstat-r18-three-column-summary-shape Passed
Builds a three-column CSV with three data rows, converts to .dta, captures the summary, and asserts the summary contains both "Columns: 3" and "Rows: 3" — locking in the shape report for an explicitly multi-column input.
readstat builds a non-empty XPT file from CSV via the DTA intermediate Original / libcsv / usage-readstat-r18-xpt-output-non-empty Passed
Converts a small two-column CSV through DTA to SAS XPORT format, asserts the resulting .xpt file exists with non-zero size, then runs readstat against the .xpt to capture a summary that mentions XPORT — locking in the SAS XPT writer path.
readstat CSV-DTA-CSV roundtrip preserves every data cell across three rows Original / libcsv / usage-readstat-r19-csv-dta-csv-data-cells-preserved Passed
Converts a three-row two-column CSV through DTA and back to stdout CSV, then asserts the recovered output contains every distinct numeric value from the source - locking in cell-by-cell content preservation for a small mixed-value payload.
readstat stdout CSV preserves all three header tokens through a DTA hop Original / libcsv / usage-readstat-r19-csv-three-cols-stdout-headers-present Passed
Builds a CSV with three numeric columns named alpha, beta, gamma, converts to .dta, then back to stdout CSV and asserts the recovered first line contains all three header tokens - locking in three-column header preservation through the DTA reader and writer.
readstat stdout CSV of a two-row DTA emits exactly three lines including header Original / libcsv / usage-readstat-r19-csv-two-row-stdout-row-count Passed
Converts a two-row two-column CSV through DTA and back to stdout CSV, then asserts the recovered CSV has exactly three lines (one header plus two data rows) - locking in stdout line-count fidelity for the smallest non-trivial multi-row payload.
readstat preserves a positive decimal cell 1.5 through the CSV-DTA-CSV roundtrip Original / libcsv / usage-readstat-r19-dta-numeric-column-positive-float Passed
Converts a single-row CSV containing the value 1.5 through DTA and back to stdout CSV, then asserts the lone data row equals "1.500000" - locking in fractional decimal rendering at the readstat six-decimal default.
readstat summary of a six-row DTA reports Rows: 6 Original / libcsv / usage-readstat-r19-dta-rows-line-matches-six-rows Passed
Builds a single-column CSV with six data rows, converts to .dta, captures the summary output, and asserts it contains the literal "Rows: 6" - locking in the row-count summary line on a row count distinct from existing r17/r18 cases.
readstat summary of a two-column DTA reports Columns: 2 Original / libcsv / usage-readstat-r19-dta-summary-columns-two Passed
Builds a two-column CSV with three rows, converts to .dta, captures the summary, and asserts it contains the literal token "Columns: 2" - locking in the column-count line of the DTA summary for the exact two-column case.
readstat writes a non-empty SAS7BDAT file from CSV via the DTA intermediate Original / libcsv / usage-readstat-r19-sas7bdat-output-non-empty Passed
Converts a two-row two-column CSV through DTA and into a .sas7bdat file, asserts the produced file exists with non-zero size, and runs readstat over the .sas7bdat to capture a summary containing the SAS7BDAT format label - locking in the SAS7BDAT writer output path with two numeric columns.
readstat summary of a four-row SAV reports Rows: 4 Original / libcsv / usage-readstat-r19-sav-summary-rows-line Passed
Builds a CSV with four data rows, converts to .sav via SPSS metadata, captures the summary output, and asserts it contains the literal "Rows: 4" - locking in the row-count summary line on the SAV writer path with a row count distinct from existing tests.
readstat stdout CSV output ends with a trailing newline byte Original / libcsv / usage-readstat-r19-stdout-csv-trailing-newline Passed
Converts a two-row CSV through DTA back to stdout CSV redirected to a file, reads the last byte of that file, and asserts it is the LF (0x0a) character - locking in stdout CSV terminator behavior of the readstat client.
readstat builds a non-empty ZSAV from CSV via the DTA intermediate Original / libcsv / usage-readstat-r19-zsav-output-non-empty Passed
Converts a small CSV through DTA into a .zsav, asserts the produced file exists with non-zero size, and runs readstat over the .zsav to capture a summary containing the ZSAV format label - locking in the ZSAV writer output path for a small two-column input.
readstat CSV-DTA-CSV preserves a decimal fraction (3.5) through the roundtrip Original / libcsv / usage-readstat-r20-csv-decimal-roundtrip-preserved Passed
Builds a one-row CSV containing 3.5, converts through .dta and back to stdout CSV, and asserts the recovered output contains the token "3.5" - locking in fractional-value preservation through the DTA roundtrip.
readstat CSV-DTA-CSV preserves five distinct integer values in a single column Original / libcsv / usage-readstat-r20-csv-five-distinct-values-survive Passed
Builds a single-column CSV with five distinct integers, converts to .dta and back to stdout CSV, then asserts each integer is recovered in the output - locking in single-column row preservation through the DTA roundtrip path.
readstat CSV-DTA-CSV preserves a negative integer value Original / libcsv / usage-readstat-r20-csv-negative-value-survives Passed
Builds a CSV containing a negative integer (-42), converts through .dta back to stdout CSV, and asserts the recovered output contains the literal "-42" - locking in sign preservation through the DTA writer/reader.
readstat summary of a four-row SAS7BDAT (via DTA) reports Rows: 4 Original / libcsv / usage-readstat-r20-csv-sas7bdat-summary-rows Passed
Builds a four-row CSV, converts to .dta via Stata metadata, converts the .dta to .sas7bdat, then captures the summary output and asserts it contains the literal "Rows: 4" - locking in row-count reporting on the SAS7BDAT writer/reader path.
readstat CSV-SAV-CSV roundtrip preserves every data cell across three rows Original / libcsv / usage-readstat-r20-csv-sav-csv-roundtrip-cells Passed
Converts a three-row two-column CSV through SAV and back to stdout CSV, then asserts the recovered output contains every distinct numeric value from the source - locking in cell preservation for the SAV writer/reader paths.
readstat CSV-DTA stdout reader emits five data lines plus one header Original / libcsv / usage-readstat-r20-csv-stdout-row-count-five Passed
Builds a CSV with five data rows, converts to .dta, then reads it back to stdout CSV, and asserts the output has exactly six total non-empty lines (one header + five data) - locking in the row-count fidelity through the stdout CSV writer.
readstat CSV-DTA-XPT writer produces a non-empty XPT file Original / libcsv / usage-readstat-r20-csv-xpt-output-non-empty Passed
Builds a tiny CSV, converts to .dta via Stata metadata, then converts the .dta to a SAS Transport (.xpt) file and asserts the produced .xpt exists with positive byte length - locking in the XPT writer output path via the DTA intermediate.
readstat summary of a DTA file emits a Format: line referencing Stata Original / libcsv / usage-readstat-r20-dta-summary-format-line Passed
Converts a tiny CSV to .dta via Stata metadata, captures the summary output for the .dta file, and asserts it contains a line starting with "Format:" - locking in the format-line summary path on the DTA reader.
readstat summary of a single-column SAV reports Columns: 1 Original / libcsv / usage-readstat-r20-sav-summary-columns-one Passed
Builds a single-column CSV, converts to .sav, captures the summary output, and asserts it contains the literal "Columns: 1" - locking in the column-count summary line on the SAV writer path for a width of one.
readstat summary of a three-row ZSAV (via DTA) reports Rows: 3 Original / libcsv / usage-readstat-r20-zsav-summary-rows-three Passed
Builds a CSV with three data rows, converts to .dta via Stata metadata, then converts the .dta to .zsav, captures the summary output, and asserts it contains the literal "Rows: 3" - locking in row-count summary reporting on the compressed SAV (ZSAV) writer path via the DTA intermediate.
readstat CSV-DTA-CSV preserves four distinct ASCII strings in row order Original / libcsv / usage-readstat-r21-csv-dta-string-roundtrip-four-rows Passed
Builds a four-row string-only CSV with metadata Stata STRING column, converts to DTA and back to CSV, then asserts the recovered stdout CSV preserves each ASCII token verbatim and in the same row order - locking in a four-row string roundtrip distinct from the existing five-row integer/three-string roundtrip tests.
readstat CSV with one numeric and one string column preserved through DTA Original / libcsv / usage-readstat-r21-csv-mixed-types-survive-roundtrip Passed
Builds a 3-row CSV with a numeric column and a string column, converts through .dta and back to stdout CSV, and asserts both columns' values appear in the recovered output - locking in mixed-type-column roundtrip behavior at 3 rows distinct from existing one-numeric-one-string and r9-mixed tests by checking specific token presence in both columns.
readstat CSV-DTA-CSV roundtrip preserves six distinct ASCII strings Original / libcsv / usage-readstat-r21-csv-multi-distinct-strings-survive Passed
Builds a six-row string CSV with non-overlapping tokens, converts through .dta and back to stdout CSV, and asserts each unique token appears in the recovered output - locking in a six-distinct-string survival contract distinct from prior four/five-row string tests.
readstat CSV-to-SAS7BDAT preserves six rows on stdout CSV readback Original / libcsv / usage-readstat-r21-csv-sas7bdat-rowcount-six Passed
Builds a six-row CSV, converts through .dta to .sas7bdat, reads back to stdout CSV, and asserts the recovered output has exactly seven non-empty lines (one header + six data rows) - locking in SAS7BDAT row-count fidelity on six-row input distinct from prior summary-rows tests.
readstat CSV-SAV-CSV roundtrip preserves four distinct decimal values Original / libcsv / usage-readstat-r21-csv-sav-distinct-floats-survive Passed
Builds a four-row CSV with distinct decimal values (1.5, 2.5, 3.5, 4.5), converts through .sav and back to stdout CSV, and asserts each decimal token appears in the recovered output - locking in decimal preservation through the SAV writer path on a four-value sequence distinct from prior 3.5-only or integer tests.
readstat summary of a four-row SAV converted from CSV reports Rows: 4 Original / libcsv / usage-readstat-r21-csv-sav-rows-four-summary Passed
Builds a four-row CSV with SPSS metadata, converts to .sav directly (skipping the DTA intermediate), captures the summary, and asserts it contains "Rows: 4" - locking in row-count summary reporting on the direct CSV-to-SAV writer path with four data rows specifically.
readstat CSV stdout output begins with quoted header column name Original / libcsv / usage-readstat-r21-csv-stdout-header-present Passed
Converts a two-row CSV through DTA and asserts the very first line of the stdout CSV is the quoted header `"vname"` (matching readstat's header-quoting convention) - locking in header emission on the stdout dash output distinct from existing header-line tests which check column count or three-column shapes.
readstat XPT summary reports Columns: 2 for a two-column CSV input Original / libcsv / usage-readstat-r21-csv-xpt-summary-columns-two Passed
Builds a two-column CSV with Stata metadata, converts to .dta then to .xpt, captures the summary, and asserts the literal "Columns: 2" appears - locking in XPT column-count summary specifically (existing XPT tests check rows or single columns).
readstat summary of a six-row ZSAV reports Rows: 6 Original / libcsv / usage-readstat-r21-csv-zsav-rowcount-summary Passed
Builds a six-row CSV, converts to .dta then to .zsav, captures the summary, and asserts the literal "Rows: 6" appears - locking in compressed SAV row-count summary on a non-zero non-{3,5} row count (existing zsav tests cover 3-row and 5-row counts).
readstat summary of a three-column DTA reports Columns: 3 Original / libcsv / usage-readstat-r21-dta-summary-columns-three Passed
Builds a three-column CSV with Stata metadata declaring three NUMERIC variables, converts to DTA, captures the summary, and asserts it contains "Columns: 3" - locking in column-count summary reporting for three-column input specifically (existing tests cover one/two column counts).
readstat handles doubled-quote escape Original / libcsv / usage-readstat-r9-csv-double-quote-escape Passed
Provides a CSV cell containing an escaped double-quote ("") and confirms readstat parses the row as a single quoted field whose value contains a literal double quote.
readstat 200 string rows Original / libcsv / usage-readstat-r9-csv-many-string-rows Passed
Stores 200 short string rows into Stata DTA via readstat and verifies the row count and a known cell are preserved on read-back.
readstat mixed numeric and string columns Original / libcsv / usage-readstat-r9-csv-mixed-numeric-string-cols Passed
Builds a CSV with one numeric and two string columns, converts to DTA, and confirms both column kinds are preserved on readback.
readstat preserves negative float values Original / libcsv / usage-readstat-r9-csv-negative-floats-roundtrip Passed
Roundtrips a CSV containing negative fractional values through DTA and back to CSV, asserting each negative value is preserved with six-decimal formatting.
readstat preserves quoted comma cell Original / libcsv / usage-readstat-r9-csv-quoted-comma-cell Passed
Embeds a literal comma inside a quoted CSV cell and verifies readstat keeps the field as a single column without splitting on the inner comma.
readstat single column 100 rows Original / libcsv / usage-readstat-r9-csv-single-column-100-rows Passed
Converts a 100-row single-column CSV through DTA and confirms the row count and a representative middle value are preserved.
readstat CSV through SPSS SAV format Original / libcsv / usage-readstat-r9-csv-spss-sav-roundtrip Passed
Converts a CSV through the SPSS .sav format and back to CSV and confirms the cell values reappear unchanged.
readstat preserves tab separators as cell content Original / libcsv / usage-readstat-r9-csv-tab-not-comma-rejected Passed
Feeds a tab-separated input through readstat and verifies the comma parser treats the line as a single column rather than splitting on tabs.
readstat tolerates extra trailing newlines Original / libcsv / usage-readstat-r9-csv-trailing-newline-tolerance Passed
Appends multiple trailing blank lines to a small CSV and confirms readstat does not count them as additional rows.
readstat writes SPSS .sav with compression Original / libcsv / usage-readstat-r9-csv-zsav-compressed-output Passed
Writes a CSV through readstat into the SPSS .sav format and verifies the output is non-empty and round-trips back through readstat with the right shape.
readstat SAS7BDAT summary metadata Original / libcsv / usage-readstat-sas7bdat-summary-format Passed
Builds a SAS7BDAT file from CSV via DTA and verifies the metadata summary identifies the SAS data format and reports the dataset shape.
readstat SAV column count Original / libcsv / usage-readstat-sav-column-count Passed
readstat comma string value Original / libcsv / usage-readstat-sav-comma-value Passed
readstat SAV count sum Original / libcsv / usage-readstat-sav-count-sum Passed
readstat SAV date string Original / libcsv / usage-readstat-sav-date-string-batch11 Passed
readstat SAV decimal number Original / libcsv / usage-readstat-sav-decimal-number Passed
readstat SAV double quote string Original / libcsv / usage-readstat-sav-double-quote-string-batch11 Passed
readstat SAV empty string row Original / libcsv / usage-readstat-sav-empty-string-row Passed
Converts a CSV row containing an empty quoted string to SAV with readstat and verifies the summary still reports a single column.
readstat SAV empty string Original / libcsv / usage-readstat-sav-empty-string Passed
readstat SAV header fields Original / libcsv / usage-readstat-sav-header-fields Passed
Converts CSV to SAV with readstat and verifies the exported CSV header row preserves the expected field order.
readstat SAV large positive number Original / libcsv / usage-readstat-sav-large-positive-number Passed
Converts a six-digit positive integer to SAV with readstat and verifies the formatted decimal value in the output CSV.
readstat SAV leading space note Original / libcsv / usage-readstat-sav-leading-space-note Passed
readstat SAV leading zero string Original / libcsv / usage-readstat-sav-leading-zero-string Passed
Converts a string field with leading zeros through SAV and verifies the leading zeros survive export.
readstat SAV long string Original / libcsv / usage-readstat-sav-long-string Passed
readstat SAV mixed-case header Original / libcsv / usage-readstat-sav-mixed-case-header-roundtrip Passed
Converts a mixed-case CSV header to SAV with readstat and verifies the round-tripped header preserves the original column casing.
readstat SAV mixed decimal sign Original / libcsv / usage-readstat-sav-mixed-decimal-sign Passed
Converts signed decimal numbers to SAV with readstat and verifies both formatted values in the output CSV.
readstat SAV mixed group value Original / libcsv / usage-readstat-sav-mixed-group Passed
readstat SAV multiline note Original / libcsv / usage-readstat-sav-multiline-note-roundtrip Passed
Converts a quoted multiline CSV field to SAV with readstat and verifies both lines survive the round-tripped output.
readstat SAV negative number Original / libcsv / usage-readstat-sav-negative-number Passed
readstat SAV numeric-looking string Original / libcsv / usage-readstat-sav-numeric-string-roundtrip Passed
Converts a decimal-looking string column to SAV with readstat and verifies the round-tripped output still preserves the quoted text form.
readstat SAV pipe note Original / libcsv / usage-readstat-sav-pipe-note Passed
readstat SAV quoted comma string Original / libcsv / usage-readstat-sav-quoted-comma-string Passed
Converts a quoted CSV field containing a comma to SAV with readstat and verifies the embedded comma survives the round trip.
readstat SAV row count Original / libcsv / usage-readstat-sav-row-count Passed
readstat SAV row order Original / libcsv / usage-readstat-sav-row-order Passed
readstat SAV scientific number Original / libcsv / usage-readstat-sav-scientific-number Passed
Converts a scientific-notation numeric CSV field to SAV with readstat and verifies the normalized numeric output.
readstat SAV score sum Original / libcsv / usage-readstat-sav-score-sum Passed
Converts multiple CSV rows through SAV and verifies numeric score aggregation over the exported data.
readstat SAV single column Original / libcsv / usage-readstat-sav-single-column Passed
readstat SAV slash note Original / libcsv / usage-readstat-sav-slash-note Passed
readstat SAV small decimal Original / libcsv / usage-readstat-sav-small-decimal-batch11 Passed
readstat SAV spaced value Original / libcsv / usage-readstat-sav-spaced-value Passed
readstat SAV single row summary Original / libcsv / usage-readstat-sav-summary-single-row Passed
readstat SAV tab note Original / libcsv / usage-readstat-sav-tab-note Passed
Converts a CSV field containing a tab to SAV with readstat and verifies the tab survives the round trip.
readstat SAV three row numbers Original / libcsv / usage-readstat-sav-three-row-numbers Passed
Converts three numeric rows to SAV with readstat and verifies all three formatted decimal values appear in the output CSV.
readstat SAV three rows Original / libcsv / usage-readstat-sav-three-rows Passed
readstat SAV to CSV Original / libcsv / usage-readstat-sav-to-csv Passed
readstat SAV two-column summary Original / libcsv / usage-readstat-sav-two-column-summary Passed
readstat SAV two-row strings Original / libcsv / usage-readstat-sav-two-row-strings-roundtrip Passed
Converts two string rows to SAV with readstat and verifies both rows survive round trip in the original order.
readstat SAV two string columns Original / libcsv / usage-readstat-sav-two-string-columns-batch11 Passed
readstat SAV underscore header Original / libcsv / usage-readstat-sav-underscore-header-batch11 Passed
readstat SAV Unicode string Original / libcsv / usage-readstat-sav-unicode-string Passed
Converts a CSV containing Unicode text to SAV with readstat and verifies the decoded string survives the round trip.
readstat SAV zero number Original / libcsv / usage-readstat-sav-zero-number Passed
Converts a zero-valued numeric column to SAV with readstat and verifies the zero survives round trip.
readstat SAV zero value Original / libcsv / usage-readstat-sav-zero-value Passed
readstat honors user_width metadata for string columns Original / libcsv / usage-readstat-string-user-width-honored Passed
Builds a DTA from CSV with a STRING column carrying a 20-character "user_width" hint in metadata and a 20-character value, then verifies the round-trip back to CSV keeps the full unmodified string and the DTA summary still reports two rows and two columns.
readstat summary line format parsed by regex Original / libcsv / usage-readstat-summary-line-format-regex Passed
Converts a CSV through DTA and SAV and parses each summary output with line-anchored regular expressions for the Columns, Rows, Compression, Text encoding, and Byte order fields, verifying both that the lines exist and that their values match the file shape rather than relying on plain substring search.
readstat summary timestamp line matches expected calendar shape Original / libcsv / usage-readstat-summary-timestamp-line-shape Passed
Generates a DTA and a SAV from a CSV and verifies each summary's "Timestamp:" line matches the day-month-year hour:minute pattern (DD MMM YYYY HH:MM) emitted by readstat, locking in that the calendar field is well-formed even though the actual moment depends on the test run time.
readstat wide CSV metadata Original / libcsv / usage-readstat-wide-csv Passed
readstat XLSX sheet dimension reflects three columns and eight data rows Original / libcsv / usage-readstat-xlsx-sheet-dimension-larger Passed
Builds an XLSX from an eight-row three-column CSV via DTA and parses the sheet1 XML to verify the dimension attribute is exactly A1:C9 (three columns and one header plus eight data rows) and that the eighth data row contains the trailing string code reference for the final group entry.
readstat XPT summary metadata Original / libcsv / usage-readstat-xpt-summary-format Passed
Generates an XPT file from CSV via DTA and verifies the metadata summary identifies the SAS transport format and column count.
readstat ZSAV compression summary Original / libcsv / usage-readstat-zsav-compression-summary Passed
Builds a ZSAV file from CSV via DTA and verifies the metadata summary reports binary compression and matching row and column counts.
Empty fields and custom delimiter Port / libcsv / empty-field-custom-delimiter Passed
Example tool compile and run Port / libcsv / example-tool-compile-run Passed
Large field handling Port / libcsv / large-field-handling Passed
Parser callback behavior Port / libcsv / parser-callback-behavior Passed
Strict quote error behavior Port / libcsv / strict-quote-error Passed
readstat conversion log reports variable and row counts Port / libcsv / usage-readstat-conversion-log-counts Passed
Captures the stdout of three sequential conversions of a seven-row two-column CSV through DTA and SAV and CSV and verifies every conversion emits a "Converted N variables and M rows in T seconds" log line whose variable and row counts match the expected shape, locking in the structured success indicator.
readstat 100 column CSV summary and edge cells Port / libcsv / usage-readstat-csv-100-columns Passed
Builds a 100 column numeric CSV with two data rows, converts through DTA, and verifies the summary reports exactly 100 columns and that the first column, last column, and a midpoint column hold their expected values on both rows.
readstat 3 column 10 row CSV roundtrip Port / libcsv / usage-readstat-csv-3col-10row-simple-roundtrip Passed
Converts a CSV with three numeric columns and ten data rows through DTA and verifies the summary reports the exact row and column counts and that each row reappears with the expected six-decimal values.
readstat 3x3 CSV every cell verified after DTA round trip Port / libcsv / usage-readstat-csv-3x3-every-cell Passed
Builds a small three-row by three-column CSV with distinct values in every cell so each one is uniquely addressable, converts through DTA, and verifies each of the nine cells reappears at the matching row and column position on readback so no row or column gets transposed, dropped, or duplicated.
readstat 5000 row CSV summary Port / libcsv / usage-readstat-csv-5000-rows Passed
Builds a 5000-row numeric CSV, converts it through DTA, and verifies the summary reports the exact row count and that the first and last data rows survive readback.
readstat streams an 8000-row CSV through DTA and back Port / libcsv / usage-readstat-csv-8000-row-streaming-roundtrip Passed
Generates an 8000-row two-column CSV with monotonically increasing values, converts to DTA, reads it back to CSV via the "-" stdout sink, and verifies the DTA summary reports exactly 8000 rows, the readback produces 8001 lines (header + rows), and the first/middle/last data rows survive numerically. Stresses libreadstat's CSV streaming path with a row count larger than typical buffered batches.
readstat preserves rows where every cell is empty Port / libcsv / usage-readstat-csv-all-empty-cells-preserved Passed
Builds a DTA from a CSV containing two rows in which every cell is empty for both a STRING column and a NUMERIC column and verifies the round-tripped CSV retains both empty rows with empty quoted strings for the string column and empty numeric placeholders for the numeric column.
readstat all-zero numeric column renders as 0.000000 in every cell Port / libcsv / usage-readstat-csv-all-zero-column-rendering Passed
Builds a CSV with two numeric columns where the first column carries varied non-zero integers and the second column is all zero across four rows, converts through DTA, and verifies the second column is rendered as the literal six-decimal short form 0.000000 in every row — never as a bare 0, never as 0.0, never as scientific notation, and never empty — while the first column independently renders its varied values.
readstat CSV numeric column with all zero rows Port / libcsv / usage-readstat-csv-all-zeros-multi-row Passed
Builds a CSV whose numeric column holds zero on every one of five rows, converts through DTA, and verifies each readback row reports a numeric zero in the six-decimal short form rather than an empty value or unrelated number.
readstat CSV with constant first column preserves repeated value across all rows Port / libcsv / usage-readstat-csv-constant-first-column Passed
Builds a two-column CSV where the first column carries the same string value on every data row (a degenerate constant column) and the second column varies, converts through DTA, and verifies every readback row repeats the constant verbatim so no row collapses or deduplicates the value.
readstat CRLF CSV input Port / libcsv / usage-readstat-csv-crlf-line-endings Passed
Feeds a CRLF-terminated CSV to readstat and verifies the rows are parsed and exported back to CSV without extra carriage returns.
readstat decimal tenths preserved at six-decimal output Port / libcsv / usage-readstat-csv-decimal-tenths-roundtrip Passed
Converts a CSV whose numeric column carries 0.1, 0.2, and 0.3 through DTA and verifies each value reappears in the readback as its six-decimal short form, confirming tenths round-trip even though they are not exact in binary floating point.
readstat renders DISCRETE missing values as blanks when DTA is read back Port / libcsv / usage-readstat-csv-discrete-missing-blank-in-dta Passed
Builds CSV plus JSON metadata that declares a DISCRETE missing-value sentinel of 99 on a numeric column, converts to DTA, reads the DTA back to CSV, and verifies the row whose score equals 99 emits an empty cell ("beta,") while non-sentinel rows preserve their numeric value (alpha,42 and gamma,7 stay populated). Locks in the libreadstat behavior of suppressing user-declared missing sentinels at DTA readback time.
readstat CSV through DTA and back is byte-stable across two passes Port / libcsv / usage-readstat-csv-dta-csv-byte-equal-roundtrip Passed
Round-trips a CSV through DTA twice — once for a reference readback CSV and once for a second readback CSV — and verifies the two readback CSVs are byte-for-byte identical via cmp, then computes a SHA-256 of each and verifies the digests match exactly, proving the DTA roundtrip is deterministic and yields identical bytes on a fresh invocation.
readstat CSV through DTA SAV and back to CSV produces identical readback Port / libcsv / usage-readstat-csv-dta-sav-csv-exact-match Passed
Round-trips a CSV through DTA, then through SAV, then back to CSV via the SAV file, and verifies that the final CSV content is byte-for-byte identical to a direct CSV-through-DTA-and-back-to-CSV readback, locking in that the SAV intermediate hop does not perturb the data.
readstat CSV through DTA SAV DTA preserves five rows exactly Port / libcsv / usage-readstat-csv-dta-sav-dta-5row-exact Passed
Round-trips a five-row CSV through DTA then SAV then back to DTA, dumps the final DTA as CSV, and verifies every one of the five data rows reappears at its original position with both string and numeric values intact.
readstat converts CSV-built DTA into a ZSAV with binary compression Port / libcsv / usage-readstat-csv-dta-to-zsav-cross-format Passed
Builds a DTA from CSV, then performs a second readstat invocation that consumes the DTA and produces a ZSAV (SPSS compressed) directly without re-using the JSON metadata. Verifies the resulting ZSAV summary reports format "SPSS compressed binary file (ZSAV)", "Compression: binary", "Format version: 3", and that the readback CSV preserves both row values, exercising the DTA-reader -> ZSAV-writer pipeline rather than the CSV-reader pipeline.
readstat embedded newline in quoted CSV field Port / libcsv / usage-readstat-csv-embedded-newline-quoted Passed
Parses a CSV row whose quoted string field contains a literal newline and verifies the multi-line value survives through DTA back to CSV.
readstat empty CSV is rejected Port / libcsv / usage-readstat-csv-empty-file-rejected Passed
Feeds an empty CSV that contains only a single newline to readstat with a one-variable metadata file and verifies the conversion fails with a non-zero exit status and produces no usable DTA output, locking in that header-less inputs do not silently produce an empty dataset.
readstat empty numeric column across rows Port / libcsv / usage-readstat-csv-empty-numeric-column Passed
Converts a CSV whose numeric column has empty values on every row through DTA and verifies the row count is preserved and string fields survive.
readstat empty string field Port / libcsv / usage-readstat-csv-empty-string Passed
readstat CSV with explicit 5-decimal-place precision values Port / libcsv / usage-readstat-csv-explicit-5-decimal-precision Passed
Builds a CSV whose numeric column carries values written with exactly five decimal places (0.12345, 1.23456, 9.87654), converts through DTA, and verifies the readback emits each value in readstat's six-decimal short form with the original five-decimal digits intact and a trailing zero appended, demonstrating that the input precision is preserved without rounding away significant digits.
readstat numeric column with explicit .0 suffix preserved as float Port / libcsv / usage-readstat-csv-explicit-dot-zero-float Passed
Builds a CSV whose numeric column carries values written with an explicit .0 decimal suffix (rather than bare integers), converts through DTA, and verifies the readback always renders six-decimal floats so the values are interpreted as numeric rather than as a string column even though they look integer-valued.
readstat single float column 0.5 step roundtrip Port / libcsv / usage-readstat-csv-float-half-step Passed
Builds a CSV with one numeric column ranging from 0.5 to 50.0 in 0.5 steps, converts through DTA, and verifies the row count and the first, last, and a midpoint value all survive readback.
readstat summary Format line content for each output format Port / libcsv / usage-readstat-csv-format-line-each-format Passed
Builds a CSV through DTA and then produces SAV, ZSAV, XPT, and SAS7BDAT files from that intermediate DTA, captures the readstat summary for each one, and verifies the leading "Format: ..." line carries the format-specific descriptor (Stata DTA, SPSS SAV, SPSS compressed ZSAV, SAS XPORT, SAS7BDAT) so the wrong format cannot be silently substituted.
readstat extracts Format version line across DTA SAV ZSAV SAS7BDAT formats Port / libcsv / usage-readstat-csv-format-version-extraction Passed
Builds a CSV through DTA and derives SAV, ZSAV, and SAS7BDAT files from that intermediate, captures each summary, extracts the trailing integer from the "Format version:" line with sed, and verifies that for every format the extracted value parses as a positive integer rather than being missing or non-numeric, locking in that the version field is structurally well-formed across the four formats that report it.
readstat numeric column doubling formula preserved across DTA round trip Port / libcsv / usage-readstat-csv-formula-double-relation Passed
Builds a CSV with two numeric columns where column2 equals column1 multiplied by 2 across five data rows (1->2, 2->4, 3->6, 4->8, 5->10), converts through DTA, and verifies in the readback that for each data row the second-column numeric value is exactly twice the first-column numeric value, computed by parsing the integer portions of the six-decimal short forms with awk.
readstat single int column 1 to 1000 count Port / libcsv / usage-readstat-csv-int-1-to-1000-count Passed
Builds a CSV with a single numeric column carrying integers 1 through 1000, converts through DTA, and verifies the summary reports exactly 1000 rows and that the first and last values reappear at the expected positions.
readstat CSV preserves 32 bit and 64 bit integer boundary values Port / libcsv / usage-readstat-csv-int32-max-boundary Passed
Builds a CSV with one numeric column carrying signed 32 bit min and max plus signed 64 bit min and max plus a few neighbouring boundary values, converts through DTA, and verifies each integer reappears on readback as its expected six-decimal value rather than overflowing or being truncated.
readstat numeric with leading plus sign Port / libcsv / usage-readstat-csv-leading-plus-sign Passed
Converts a CSV whose numeric values carry an explicit leading plus sign through DTA and verifies the sign is normalized away in the readback.
readstat long column names through DTA and SAV Port / libcsv / usage-readstat-csv-long-column-names Passed
Converts a CSV with column names longer than 32 characters through DTA and SAV and verifies the long names are preserved verbatim in the readback header for each format.
readstat 30 column CSV round trip Port / libcsv / usage-readstat-csv-many-columns-roundtrip Passed
Builds a 30-column numeric CSV with matching metadata, converts through DTA, and verifies the column count and first and last column values survive.
readstat distinct strictly increasing numeric column preserves order and values Port / libcsv / usage-readstat-csv-many-distinct-increasing Passed
Builds a CSV with one numeric column carrying 25 strictly increasing distinct values, converts through DTA, and verifies every value reappears at its original line position so neither the order nor the magnitudes drift after the round trip.
readstat rejects metadata that does not list a CSV column Port / libcsv / usage-readstat-csv-mismatched-metadata-variable-rejected Passed
Supplies a CSV header with columns "n,v" but a JSON metadata file that lists "foobar,v", and verifies readstat exits non-zero with "Could not find type of variable n in metadata", proving readstat validates that every CSV column has a metadata entry rather than silently typing the unknown column.
readstat mixed int and float numeric columns Port / libcsv / usage-readstat-csv-mixed-int-float-columns Passed
Converts a CSV whose first numeric column carries integers and second numeric column carries non-integral floats through DTA and verifies both columns survive at six-decimal precision without one column collapsing into the other type.
readstat mixed numeric and string columns with varying string widths Port / libcsv / usage-readstat-csv-mixed-numeric-string-padding Passed
Builds a CSV with one numeric column and one string column where string values vary in length from 1 to 12 characters, converts through DTA, and verifies each string value reappears verbatim alongside its paired numeric value rendered to six decimals.
readstat multiple negative numeric rows Port / libcsv / usage-readstat-csv-multi-negative-numbers Passed
Converts a CSV with several negative numeric values of varying magnitudes through DTA and verifies each value reappears in the CSV readback.
readstat CSV through DTA SAV and back to CSV Port / libcsv / usage-readstat-csv-multistep-format-hops Passed
Round-trips a CSV through DTA, then through SAV, then back to CSV via DTA, verifying string and numeric values survive every hop.
readstat numeric precision through DTA Port / libcsv / usage-readstat-csv-numeric-precision Passed
Converts a CSV with several many-digit decimal values through DTA and verifies the readback retains 15 significant digits, matching readstat's high-precision numeric output.
readstat multi-column CSV with one numeric and one string column Port / libcsv / usage-readstat-csv-one-numeric-one-string Passed
Builds a two-column CSV pairing a numeric column with a single string column and verifies that after a DTA round trip the readback header preserves the column order, the numeric column is rendered as six-decimal floats while the string column remains quoted, and the values are not transposed across the column boundary.
readstat CSV preserves paired very large positive and negative integers Port / libcsv / usage-readstat-csv-paired-large-pos-neg Passed
Builds a CSV whose single numeric column alternates between very large positive and very large negative integers (up to 1e15 in magnitude), converts through DTA, and verifies each paired value reappears with its sign and magnitude intact and that no positive value collapses into its negative twin.
readstat CSV two correlated numeric columns Port / libcsv / usage-readstat-csv-positive-negative-correlation Passed
Builds a CSV with two distinct numeric columns where one is positively correlated with row index and another is negatively correlated, converts through DTA, and verifies the monotonic increase and decrease survive readback exactly.
readstat quoted CSV header with space in column name Port / libcsv / usage-readstat-csv-quoted-column-name-with-space Passed
Converts a CSV whose header row carries a quoted column name containing a space character through DTA using a matching metadata variable name and verifies the original quoted header is restored on readback and the data row reappears intact.
readstat CSV with quoted column names that fit DTA naming roundtrips cleanly Port / libcsv / usage-readstat-csv-quoted-header-no-spaces Passed
Builds a CSV whose header row uses quoted column names that still fit DTA naming rules (no spaces, no special characters), converts through DTA, and verifies the quotes are stripped from the stored variable names while the data rows survive the round trip with the un-quoted column names in the readback header.
readstat specific cell preserved by row and column index Port / libcsv / usage-readstat-csv-row-column-cell-roundtrip Passed
Builds a CSV where row 4 column 2 carries a unique numeric marker value (8675309) surrounded by distractor zeros, converts through DTA, and verifies the marker reappears at the same row and column position in the readback CSV without bleeding into neighbouring cells.
readstat converts CSV-built SAS7BDAT into an XPT transport file Port / libcsv / usage-readstat-csv-sas7bdat-to-xpt-cross-format Passed
Pipelines CSV plus JSON metadata into a DTA, then DTA into a SAS7BDAT, then SAS7BDAT into an XPT transport file, and finally reads the XPT back to CSV. Verifies the XPT summary identifies the transport format and the readback CSV preserves the three rows produced by the SAS7BDAT -> XPT writer chain (a path that exercises libreadstat's SAS reader and the XPT writer).
readstat scientific notation lowercase and uppercase Port / libcsv / usage-readstat-csv-scientific-mixed-case Passed
Converts a CSV with scientific notation values using both lowercase e and uppercase E, plus negative exponents, through DTA and verifies each parses to the expected numeric value.
readstat sentinel value at row 1 column 1 preserved exactly Port / libcsv / usage-readstat-csv-sentinel-row1-col1 Passed
Builds a CSV where the very first data cell (row 1, column 1) carries a unique sentinel numeric value (271828) surrounded by zeros, converts through DTA, and verifies the readback line 2 (data row 1) has the sentinel in field 1 and zeros in subsequent fields, that the sentinel appears exactly once in the entire output, and that no other data row has any non-zero value in column 1.
readstat 1x1 CSV Port / libcsv / usage-readstat-csv-single-cell-1x1 Passed
Converts a CSV containing exactly one column and one data row through DTA and verifies the summary, header, and single value all survive.
readstat 1x1 CSV with numeric value Port / libcsv / usage-readstat-csv-single-cell-numeric-1x1 Passed
Converts a CSV containing exactly one numeric column and one numeric data row (the value 17) through DTA and verifies the summary reports Columns 1 and Rows 1, the readback header is the bare numeric column name and the single data line is the six-decimal short form of 17, distinguishing this numeric 1x1 case from the existing string-flavoured 1x1 test.
readstat text-only string column preserved through DTA Port / libcsv / usage-readstat-csv-text-only-column-roundtrip Passed
Converts a CSV containing a single string-typed column with four distinct ASCII labels through DTA and verifies every label reappears verbatim and in the same order on readback.
readstat three-column CSV with string, integer-valued, and float-valued columns Port / libcsv / usage-readstat-csv-three-distinct-types Passed
Builds a three-column CSV pairing a STRING column with two NUMERIC columns whose data is shaped as integers in column 2 and as non-integral floats in column 3, converts through DTA, and verifies the readback header order is preserved, the string column stays quoted, the integer-valued numeric column renders with .000000 suffix, and the float-valued numeric column renders the fractional part exactly.
readstat CSV to DTA Port / libcsv / usage-readstat-csv-to-dta Passed
readstat CSV to SPSS POR portable file summary Port / libcsv / usage-readstat-csv-to-por-summary Passed
Builds an SPSS portable POR file from CSV via DTA using uppercase variable names that the portable format requires and verifies the metadata summary identifies the SPSS portable format and reports the column count matching the input CSV shape.
readstat CSV to SAS7BDAT round trip Port / libcsv / usage-readstat-csv-to-sas7bdat-roundtrip Passed
Converts CSV through DTA into a SAS7BDAT data file and verifies the field values reappear in CSV after readback.
readstat CSV to SAV Port / libcsv / usage-readstat-csv-to-sav Passed
readstat CSV to XLSX output Port / libcsv / usage-readstat-csv-to-xlsx-output Passed
Converts CSV through DTA into an XLSX workbook and verifies the workbook is a valid zip with the expected shared strings and cell value.
readstat CSV to SAS XPORT round trip Port / libcsv / usage-readstat-csv-to-xpt-roundtrip Passed
Converts CSV through DTA into a SAS transport (XPT) file and verifies the values survive the round trip back to CSV.
readstat CSV to compressed ZSAV round trip Port / libcsv / usage-readstat-csv-to-zsav-roundtrip Passed
Converts CSV through DTA into an SPSS compressed binary (ZSAV) file and verifies the values and binary compression marker.
readstat CSV with trailing empty lines Port / libcsv / usage-readstat-csv-trailing-empty-lines Passed
Converts a CSV that ends with several blank lines through DTA and verifies the trailing blanks do not inflate the row count.
readstat trailing whitespace inside string fields normalized to trimmed value Port / libcsv / usage-readstat-csv-trailing-whitespace-fields Passed
Builds a CSV whose quoted string fields carry trailing space characters after the actual content (for example "alpha ", "beta "), converts through DTA, and verifies that the readback emits the trimmed string content without the trailing spaces — distinguishing this case from the existing whitespace-only-field test which collapses all-whitespace to empty.
readstat all-uppercase column names preserve case Port / libcsv / usage-readstat-csv-uppercase-column-names Passed
Converts a CSV whose header row uses fully uppercase column names through DTA and verifies the readback emits the column names in the same all-uppercase form, locking in that readstat does not lowercase or normalize the casing.
readstat treats .CSV uppercase as a CSV input Port / libcsv / usage-readstat-csv-uppercase-extension-accepted Passed
Stores the input fixture with an uppercase ".CSV" extension and verifies readstat still recognizes the format, ingests both rows, and writes a valid DTA. Documents that readstat's input-format dispatch is not strictly case-sensitive and matches the ".csv" path that lowercase fixtures exercise.
readstat does not strip UTF-8 BOM from CSV header Port / libcsv / usage-readstat-csv-utf8-bom-header-rejected Passed
Prepends a UTF-8 BOM (EF BB BF) to a CSV header row and verifies readstat treats the BOM bytes as part of the first column name, fails the metadata lookup with an explicit "Could not find type of variable" diagnostic, and exits non-zero rather than silently dropping the BOM.
readstat preserves multi-word variable labels in DTA Port / libcsv / usage-readstat-csv-variable-labels-embedded-in-dta Passed
Drives readstat with a JSON metadata file declaring three columns whose labels are multi-word strings ("First Name", "Family Surname", "Age in Years"), converts the CSV to DTA, and verifies all three label strings are present in the binary DTA payload by scanning with strings(1). Variable labels are part of the libreadstat contract that calling code (Stata, pandas) relies on for column documentation.
readstat CSV with a 1500 character single field Port / libcsv / usage-readstat-csv-very-long-field Passed
Builds a CSV whose string column carries a single field longer than 1500 characters, declares its width via metadata, converts through DTA, and verifies the full string reappears verbatim on readback alongside its sibling short-field row.
readstat whitespace-only string field normalized to empty Port / libcsv / usage-readstat-csv-whitespace-only-field Passed
Converts a CSV whose string field contains only space characters through DTA and verifies readstat normalizes whitespace-only fields to empty strings while preserving row count and other columns.
readstat accepts CSV with no terminating newline Port / libcsv / usage-readstat-csv-without-trailing-newline-accepted Passed
Writes a CSV whose final byte is a digit rather than a line feed and verifies readstat ingests both data rows, reports two rows in the DTA summary, and emits both records in the readback CSV. RFC 4180 makes the trailing CRLF optional and many spreadsheet exports omit it; this locks in the behavior.
readstat DTA column count Port / libcsv / usage-readstat-dta-column-count Passed
readstat DTA comma value Port / libcsv / usage-readstat-dta-comma-value Passed
readstat DTA count sum Port / libcsv / usage-readstat-dta-count-sum Passed
readstat DTA to CSV preserves exact decimal representation Port / libcsv / usage-readstat-dta-csv-exact-decimal-preservation Passed
Builds a DTA from a CSV whose numeric column carries exactly representable binary decimals (0.5, 0.25, 0.125, 0.0625), then reads the DTA back to CSV twice — once into a reference file and once into a comparison file — and verifies the decimal cells are emitted in their exact canonical six-decimal form (0.500000, 0.250000, 0.125000, 0.062500), that the two readbacks are byte-identical, and that no value drifts into long-form scientific notation or extra digits.
readstat DTA date string Port / libcsv / usage-readstat-dta-date-string-batch11 Passed
readstat DTA decimal number Port / libcsv / usage-readstat-dta-decimal-number Passed
readstat DTA double quote string Port / libcsv / usage-readstat-dta-double-quote-string-batch11 Passed
readstat DTA empty string row Port / libcsv / usage-readstat-dta-empty-string-row Passed
Converts a CSV row containing an empty quoted string to DTA with readstat and verifies the summary still reports a single column.
readstat DTA header fields Port / libcsv / usage-readstat-dta-header-fields Passed
Converts CSV to DTA with readstat and verifies the exported CSV header row preserves the expected field order.
readstat DTA large positive number Port / libcsv / usage-readstat-dta-large-positive-number Passed
Converts a six-digit positive integer to DTA with readstat and verifies the formatted decimal value in the output CSV.
readstat DTA leading space note Port / libcsv / usage-readstat-dta-leading-space-note Passed
readstat DTA leading zero string Port / libcsv / usage-readstat-dta-leading-zero-string Passed
Converts a string field with leading zeros through DTA and verifies the leading zeros survive export.
readstat DTA long string Port / libcsv / usage-readstat-dta-long-string Passed
readstat DTA mixed-case header Port / libcsv / usage-readstat-dta-mixed-case-header-roundtrip Passed
Converts a mixed-case CSV header to DTA with readstat and verifies the round-tripped header preserves the original column casing.
readstat DTA mixed decimal sign Port / libcsv / usage-readstat-dta-mixed-decimal-sign Passed
Converts signed decimal numbers to DTA with readstat and verifies both formatted values in the output CSV.
readstat DTA mixed group value Port / libcsv / usage-readstat-dta-mixed-group Passed
readstat DTA multiline note Port / libcsv / usage-readstat-dta-multiline-note-roundtrip Passed
Converts a quoted multiline CSV field to DTA with readstat and verifies both lines survive the round-tripped output.
readstat DTA negative number Port / libcsv / usage-readstat-dta-negative-number Passed
readstat DTA numeric-looking string Port / libcsv / usage-readstat-dta-numeric-string-roundtrip Passed
Converts a decimal-looking string column to DTA with readstat and verifies the round-tripped output still preserves the quoted text form.
readstat DTA pipe note Port / libcsv / usage-readstat-dta-pipe-note Passed
readstat DTA quoted comma string Port / libcsv / usage-readstat-dta-quoted-comma-string Passed
Converts a quoted CSV field containing a comma to DTA with readstat and verifies the embedded comma survives the round trip.
readstat DTA to DTA preserves variable order Port / libcsv / usage-readstat-dta-roundtrip-variable-order Passed
Converts a CSV with a deliberately non-alphabetical column order (zulu, alpha, mike) into DTA, then re-encodes that DTA into a second DTA file, and verifies the readback header on both DTAs lists the columns in the original input order rather than reordered.
readstat DTA row count Port / libcsv / usage-readstat-dta-row-count Passed
readstat DTA row order Port / libcsv / usage-readstat-dta-row-order Passed
readstat numeric column survives DTA SAV DTA hop Port / libcsv / usage-readstat-dta-sav-dta-numeric-type Passed
Converts a CSV with one string column and one numeric column to DTA, hops through SAV, then back to a second DTA, and verifies the numeric column still emits six-decimal numeric values (rather than quoted strings) on the final readback, confirming type information survives the cross-format hop.
readstat DTA scientific number Port / libcsv / usage-readstat-dta-scientific-number Passed
Converts a scientific-notation numeric CSV field to DTA with readstat and verifies the normalized numeric output.
readstat DTA score sum Port / libcsv / usage-readstat-dta-score-sum Passed
Converts multiple CSV rows through DTA and verifies numeric score aggregation over the exported data.
readstat DTA single column Port / libcsv / usage-readstat-dta-single-column Passed
readstat DTA slash note Port / libcsv / usage-readstat-dta-slash-note Passed
readstat DTA small decimal Port / libcsv / usage-readstat-dta-small-decimal-batch11 Passed
readstat spaced string value Port / libcsv / usage-readstat-dta-spaced-value Passed
readstat DTA single row summary Port / libcsv / usage-readstat-dta-summary-single-row Passed
readstat DTA tab note Port / libcsv / usage-readstat-dta-tab-note Passed
Converts a CSV field containing a tab to DTA with readstat and verifies the tab survives the round trip.
readstat DTA three row numbers Port / libcsv / usage-readstat-dta-three-row-numbers Passed
Converts three numeric rows to DTA with readstat and verifies all three formatted decimal values appear in the output CSV.
readstat DTA three rows Port / libcsv / usage-readstat-dta-three-rows Passed
readstat DTA to CSV with metadata file inspection Port / libcsv / usage-readstat-dta-to-csv-with-meta-inspection Passed
Converts a CSV through DTA, then independently dumps the DTA back to CSV and the DTA metadata summary to a separate file, and verifies both that the data file readback carries the input rows and that the metadata file inspection reports the matching row, column, format header, and byte order alongside it.
readstat DTA to CSV Port / libcsv / usage-readstat-dta-to-csv Passed
readstat DTA two-column summary Port / libcsv / usage-readstat-dta-two-column-summary Passed
readstat DTA two-row strings Port / libcsv / usage-readstat-dta-two-row-strings Passed
Converts two string rows to DTA with readstat and verifies both rows survive round trip in the original order.
readstat DTA two string columns Port / libcsv / usage-readstat-dta-two-string-columns-batch11 Passed
readstat DTA underscore header Port / libcsv / usage-readstat-dta-underscore-header-batch11 Passed
readstat DTA Unicode string Port / libcsv / usage-readstat-dta-unicode-string Passed
Converts a CSV containing Unicode text to DTA with readstat and verifies the decoded string survives the round trip.
readstat DTA zero number Port / libcsv / usage-readstat-dta-zero-number Passed
Converts a zero-valued numeric column to DTA with readstat and verifies the zero survives round trip.
readstat zero numeric value Port / libcsv / usage-readstat-dta-zero-value Passed
readstat escaped quote CSV fields Port / libcsv / usage-readstat-escaped-quotes-csv Passed
readstat -f flag overwrites a pre-existing output file Port / libcsv / usage-readstat-force-flag-overwrites-existing Passed
Generates a DTA from a CSV, runs readstat once to produce out.csv, then re-runs the same conversion with -f and verifies the second invocation succeeds quietly, leaves no "File exists" diagnostic, and that the output file's mtime advances (proving it was rewritten rather than skipped).
readstat preserves 14-digit double precision through DTA round-trip Port / libcsv / usage-readstat-high-precision-double-preserved Passed
Round-trips three irrational mathematical constants (pi, e, sqrt(2)) carried to fourteen digits past the decimal point through CSV to DTA and back to CSV, and verifies every output digit string matches the input character-for-character so no precision is silently truncated by the readstat numeric pipeline.
readstat metadata summary Port / libcsv / usage-readstat-metadata-summary Passed
Runs readstat against a CSV-derived DTA file and verifies the reported variable and row metadata.
readstat reports diagnostic on a non-existent input file Port / libcsv / usage-readstat-missing-input-file-fails Passed
Asks readstat to convert from an input path that does not exist to a CSV output, captures stderr, and verifies the diagnostic mentions an unable-to-open error and refuses to write any rows of output content beyond an empty placeholder, locking in the failure pathway for missing inputs.
readstat missing CSV values Port / libcsv / usage-readstat-missing-values Passed
Runs readstat on CSV input with an empty numeric value and verifies the missing value is preserved.
readstat without arguments prints usage banner Port / libcsv / usage-readstat-no-args-emits-usage Passed
Invokes readstat with no positional arguments, captures stdout and stderr, and verifies the binary prints the standard banner including the version line, the supported input extensions list, and the convert syntax describing input and output filenames.
readstat normalized CSV output Port / libcsv / usage-readstat-normalize-csv Passed
readstat refuses to overwrite an existing output without -f Port / libcsv / usage-readstat-overwrite-protection-without-f Passed
Generates a DTA from CSV, converts it to CSV once, then attempts the same conversion a second time without the -f flag and verifies readstat emits a "File exists (Use -f to overwrite)" diagnostic and leaves the existing output file's bytes byte-for-byte unchanged.
readstat quoted CSV fields Port / libcsv / usage-readstat-quoted-csv Passed
Runs readstat on a quoted CSV field containing a comma and verifies the parsed value survives conversion.
readstat preserves a 14-significant-digit double through DTA roundtrip Port / libcsv / usage-readstat-r10-csv-extreme-double-precision-preserved Passed
Round-trips two well-known irrational constants with at least 15 input digits (pi 3.141592653589793, sqrt2 1.4142135623730951) through DTA and back to CSV and verifies the readstat CSV writer emits the values with the high-precision 14-significant-digit rendering that occurs whenever the truncation to the default 6-decimal form would lose information.
readstat rejects a CSV that has only a header row Port / libcsv / usage-readstat-r10-csv-header-only-no-data-rejected Passed
Provides a CSV consisting solely of a header line with no data rows and verifies readstat fails the conversion with a "One or more columns must be provided" diagnostic on stderr while leaving no output file behind, distinguishing the empty-data-row case from the empty-file case which has its own dedicated diagnostic.
readstat preserves leading-zero codes when the column is STRING Port / libcsv / usage-readstat-r10-csv-leading-zero-string-preserved Passed
Round-trips a CSV column containing zero-padded numeric-looking codes (007, 042, 099) declared as STRING through DTA and back to CSV, verifying the leading zeros survive intact rather than being silently coerced to numeric values like 7, 42, 99.
readstat SAV summary reports Text encoding UTF-8 by default Port / libcsv / usage-readstat-r10-csv-sav-text-encoding-utf8-default Passed
Converts a CSV containing pure ASCII content directly into an SPSS SAV file using the SPSS metadata type and verifies the readstat summary reports the "Text encoding: UTF-8" line, locking in that newly created SAV files default to UTF-8 even when no Unicode characters are present in the source data.
readstat distinguishes SAV row compression from ZSAV binary compression Port / libcsv / usage-readstat-r10-csv-sav-zsav-compression-distinguished Passed
Builds the same CSV through DTA into both an SPSS SAV file and an SPSS ZSAV file and verifies the metadata summaries report distinct compression algorithms (Compression: rows for SAV, Compression: binary for ZSAV), confirming the two SPSS variants are not collapsed onto a single compression mode in the readstat CLI output.
readstat reports Table label (null) when the JSON metadata supplies no label Port / libcsv / usage-readstat-r10-csv-table-label-null-when-unset Passed
Converts a CSV through DTA and SAV using a JSON metadata file that declares no top-level table label and verifies both readstat summaries emit the literal "Table label: (null)" line, locking in the canonical placeholder used by the CLI when no Stata or SPSS dataset label was supplied.
readstat -h prints the full help banner with all conversion modes Port / libcsv / usage-readstat-r10-help-flag-banner-shape Passed
Invokes readstat with the -h flag and verifies the help banner enumerates every documented mode of operation including the metadata view, the CSV-to-stdout dump, the format-to-format conversion, the CSV+JSON metadata conversion, the CSV+command-file conversion, and the SAS7BDAT-with-catalog conversion, ensuring no documented entry point disappears from the help text.
readstat surfaces an explicit error reading SPSS portable POR back to CSV Port / libcsv / usage-readstat-r10-por-readback-error-message Passed
Builds an SPSS portable POR file from a CSV via DTA and then attempts to convert that POR file back to CSV, verifying readstat does not silently produce empty output but instead emits an "Error processing" diagnostic naming the POR path with an "Invalid file, or file has unsupported features" reason and refuses to create the destination CSV file.
readstat -v prints only the version line on stdout Port / libcsv / usage-readstat-r10-version-flag-stdout Passed
Invokes readstat with the -v flag and verifies the binary prints exactly one stdout line of the form "ReadStat version X.Y.Z" with stderr empty and exits zero, distinguishing the version-only output from the full help banner emitted with no arguments.
readstat XPT summary reports Rows -1 and omits byte-order encoding compression lines Port / libcsv / usage-readstat-r10-xpt-summary-rows-minus-one-quirk Passed
Builds a SAS XPORT file from a five-row CSV via DTA and verifies the readstat metadata summary reports the documented "Rows: -1" placeholder (XPORT does not store the row count in its header) and that the summary intentionally omits the Byte order, Text encoding, and Compression lines that DTA, SAV, and ZSAV emit, locking in the XPT-specific metadata shape.
readstat DTA writer pins Format version to 118 by default Port / libcsv / usage-readstat-r11-dta-format-version-118-default Passed
Builds a DTA from a CSV with no version override and verifies the readstat summary reports "Format version: 118" rather than leaving the version field unpinned, locking in the Stata 14+ wire format as the default DTA version emitted by the readstat writer on Ubuntu 24.04.
readstat dta-to-sas7bdat summary reports little-endian byte order Port / libcsv / usage-readstat-r11-dta-to-sas7bdat-byte-order-little-endian Passed
Builds a SAS7BDAT from a CSV via DTA and verifies the readstat summary contains the "Byte order: little-endian" line, locking in that the SAS7BDAT writer on Ubuntu 24.04 emits little-endian byte order in its header (a field that the format records explicitly, unlike XPT which omits the line entirely).
readstat dta-to-sas7bdat summary pins Format version to 9 Port / libcsv / usage-readstat-r11-dta-to-sas7bdat-format-version-9 Passed
Builds a SAS7BDAT from a CSV via DTA and verifies the readstat summary reports the SAS data file format with the specific "Format version: 9" line that locks in SAS7BDAT v9 as the format version emitted by the readstat SAS7BDAT writer on Ubuntu 24.04.
readstat dta-to-xpt summary pins Format version to 8 Port / libcsv / usage-readstat-r11-dta-to-xpt-format-version-8 Passed
Builds an XPT from a CSV via DTA and verifies the readstat summary reports the SAS Transport file format with the specific "Format version: 8" line that locks in XPT v8 as the format version emitted by the readstat XPT writer on Ubuntu 24.04.
readstat SAS7BDAT to CSV renders integer-valued numerics with six trailing decimals Port / libcsv / usage-readstat-r11-sas7bdat-csv-six-decimal-rendering Passed
Round-trips three integer-valued ids (1, 2, 3) through SAS7BDAT (built via DTA) and back to CSV and verifies the readstat CSV writer emits each integer with the six-trailing-decimal "1.000000" / "2.000000" / "3.000000" rendering rather than as bare integers, exercising the SAS7BDAT-reader -> CSV-writer pipeline's numeric formatting on Ubuntu 24.04.
readstat XLSX [Content_Types].xml advertises spreadsheetml worksheet content type Port / libcsv / usage-readstat-r11-xlsx-content-types-spreadsheetml Passed
Builds an XLSX from a small CSV via DTA and parses [Content_Types].xml inside the OOXML zip to verify the worksheet content type "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" is registered, locking in OOXML conformance of the readstat XLSX writer beyond the previously-checked sheet1.xml dimension.
readstat XLSX root _rels/.rels declares xl/workbook.xml as the office document target Port / libcsv / usage-readstat-r11-xlsx-rels-targets-workbook-xml Passed
Builds an XLSX from a small CSV via DTA and parses _rels/.rels inside the OOXML zip to verify the package-level relationship of type "officeDocument" targets exactly "xl/workbook.xml", locking in the OOXML root-relationships layout produced by the readstat XLSX writer.
readstat XLSX xl/workbook.xml registers a single named worksheet Port / libcsv / usage-readstat-r11-xlsx-workbook-xml-references-sheet Passed
Builds an XLSX from a small CSV via DTA and parses xl/workbook.xml inside the OOXML zip to verify the workbook lists exactly one <sheet> element with sheetId="1" and a non-empty name attribute, locking in single-sheet workbook structure rather than only checking the per-sheet content.
readstat XPT to CSV emits all rows even though the XPT header reports Rows -1 Port / libcsv / usage-readstat-r11-xpt-csv-row-count-correct-after-conversion Passed
Builds an XPT from a five-row CSV via DTA and verifies that, despite the XPT summary reporting the documented "Rows: -1" placeholder, the readstat XPT-to-CSV conversion still emits a header line and all five data rows, locking in the asymmetry between XPT metadata row reporting and actual row enumeration during conversion.
readstat XPT to CSV renders integer-valued numerics with six trailing decimals Port / libcsv / usage-readstat-r11-xpt-csv-six-decimal-rendering Passed
Round-trips three integer-valued ids (1, 2, 3) through XPT (built via DTA) and back to CSV and verifies the readstat CSV writer emits each integer with the six-trailing-decimal "1.000000" / "2.000000" / "3.000000" rendering rather than as bare integers, exercising the XPT-reader -> CSV-writer pipeline's numeric formatting on Ubuntu 24.04.
readstat preserves a quoted CRLF in a string field across DTA roundtrip Port / libcsv / usage-readstat-r12-csv-quoted-newline-roundtrip Passed
Round-trips a quoted CSV field whose embedded newline is a CRLF (carriage-return + line-feed) through DTA and back to CSV and asserts the multi-line content reappears in the output, distinguishing the CRLF embedded-newline case from the LF-only case.
readstat csv -> DTA writes a 2-column, 2-row file the reader summarises consistently Port / libcsv / usage-readstat-r12-csv-table-label-set-from-meta Passed
Round-trips a 2-column 2-row CSV through DTA via readstat and asserts the readstat reader summary reports "Stata binary file" with "Columns: 2" and "Rows: 2", locking in the CSV→DTA writer round-trip without depending on label propagation (top-level "label" → Table label and per-variable labels are both unstable across readstat 1.1.9 — the column/row totals are the documented stable surface).
readstat dta - writes CSV body to stdout Port / libcsv / usage-readstat-r12-csv-to-stdout-dash-target Passed
Uses the documented "-" output target with a DTA input and asserts the CSV body lands on stdout (file descriptor 1) with the expected header and data rows, exercising the dump-to-stdout entry point distinct from a named .csv output file.
readstat csv -> .sav produces an SPSS binary file readable by readstat Port / libcsv / usage-readstat-r12-csv-to-zsav-file-suffix Passed
Converts a CSV directly to a .sav target and verifies the readstat summary identifies the resulting file as an SPSS binary file with the correct variable count, locking in sav extension routing through the SPSS writer. (csv -> .zsav segfaults on readstat 1.1.9 with the noble build options; .sav is the stable SPSS surface.)
readstat DTA summary reports Columns: 3 and Rows: 4 for a 4x3 input Port / libcsv / usage-readstat-r12-dta-summary-columns-rows-line Passed
Builds a 4-row 3-column DTA from CSV and asserts the readstat summary contains the precise "Columns: 3" and "Rows: 4" lines, locking in the count-line shape of the metadata view for a known-shape file.
readstat with no arguments prints the usage banner including ReadStat version Port / libcsv / usage-readstat-r12-no-args-banner-includes-version Passed
Invokes readstat with no arguments, captures stdout+stderr, and asserts the resulting banner contains both the "ReadStat version" line and the conversion-mode descriptions, ensuring the bare-invocation path matches the help-flag content shape.
readstat SAV writer reports a positive Format version line Port / libcsv / usage-readstat-r12-sav-format-version-3 Passed
Builds a SAV from a CSV and verifies the readstat summary reports "SPSS binary file" together with a "Format version: N" line where N is a positive integer. (readstat 1.1.9 emits version 2 or 3 depending on build options; either is fine — assert the line exists with a positive integer rather than pinning the exact value.)
readstat XLSX archive contains xl/worksheets/sheet1.xml Port / libcsv / usage-readstat-r12-xlsx-sheet-1-xml-present Passed
Builds an XLSX from a CSV via DTA and verifies the resulting OOXML zip archive contains the worksheet entry "xl/worksheets/sheet1.xml", locking in the conventional sheet path used by the readstat XLSX writer.
readstat XPT summary reports Format: SAS transport file (XPORT) Port / libcsv / usage-readstat-r12-xpt-format-line-exact-text Passed
Builds an XPT from a CSV via DTA and verifies the readstat summary contains the precise "Format: SAS transport file (XPORT)" line, locking in the literal format-line text used by the readstat metadata view for XPT files on Ubuntu 24.04.
readstat XPT summary reports Table name: DATASET by default Port / libcsv / usage-readstat-r12-xpt-table-name-default-dataset Passed
Builds an XPT from a CSV via DTA and verifies the readstat summary contains the canonical "Table name: DATASET" line that the XPT writer emits in the absence of an explicit table-name override, distinguishing XPT defaults from formats that use the dataset label slot instead.
readstat DTA-to-CSV stdout dump emits exactly N+1 lines for N data rows Port / libcsv / usage-readstat-r13-csv-to-dta-multi-row-csv-readback-line-count Passed
Round-trips a 7-row 2-column CSV through DTA, dumps the DTA back to CSV via the dash stdout target, and asserts the resulting stdout contains exactly 8 newline-terminated lines (one header + seven data rows), pinning the line-count contract of the CSV-to-stdout dump path for a known shape.
readstat CSV to DTA to CSV preserves a 1.000000 numeric value exactly Port / libcsv / usage-readstat-r13-csv-to-dta-roundtrip-numeric-exact Passed
Round-trips a CSV row whose numeric column carries the integer 1 through DTA and back to CSV via the dash stdout target, and asserts the readback CSV renders the value as the canonical six-decimal fixed-point form "1.000000" rather than the bare integer or a scientific-notation form.
readstat-produced POR contains the SPSS PORT FILE marker in its leading region Port / libcsv / usage-readstat-r13-csv-to-por-file-magic-spss-port Passed
Builds an SPSS portable POR file from a CSV via DTA and asserts the first kilobyte of the output contains the literal "SPSS PORT FILE" marker that the SPSS portable header embeds, locking in that the readstat POR writer emits a structurally recognisable SPSS portable text file rather than a CSV-shaped placeholder.
readstat-produced SAS7BDAT contains the canonical SAS7BDAT magic in its header Port / libcsv / usage-readstat-r13-csv-to-sas7bdat-file-magic-binary Passed
Builds a SAS7BDAT from a CSV via DTA and asserts the first kilobyte of the output contains the canonical SAS7BDAT magic byte sequence (c2 ea 81 60 b3 14 11 cf bd 92 08 00 09 c7 31 8c), locking in that the readstat SAS7BDAT writer emits a byte-recognisable SAS data file rather than a CSV-shaped placeholder.
readstat-produced XPT carries the HEADER RECORD LIBV8 magic in the first 80 bytes Port / libcsv / usage-readstat-r13-csv-to-xpt-header-libname Passed
Builds an XPT from a CSV via DTA and asserts the first 80-byte record of the output contains the canonical "HEADER RECORD" preamble and the "LIBV8" library-version-8 token that marks a SAS XPORT v8 transport file as written by readstat on Ubuntu 24.04, locking in that the readstat XPT writer emits a structurally recognisable XPORT file rather than an arbitrarily-formed binary.
readstat DTA summary reports Byte order: little-endian by default Port / libcsv / usage-readstat-r13-dta-summary-byte-order-line Passed
Builds a DTA from a CSV with no byte-order override and verifies the readstat summary contains the literal "Byte order: little-endian" line, locking in little-endian as the default byte order emitted by the readstat DTA writer on Ubuntu 24.04 — distinguishing the byte-order line from the format-version line and exercising the DTA path specifically.
readstat DTA-to-SAV summary reports Format version: 2 Port / libcsv / usage-readstat-r13-dta-to-sav-format-version-line Passed
Builds an SPSS SAV file from a CSV via DTA and verifies the readstat summary reports the precise "Format version: 2" line on the SAV path, locking in that readstat 1.1.9 on Ubuntu 24.04 emits SPSS layout version 2 (not 3) for newly written SAV files — distinguishing the SAV version line from the DTA 118 default.
readstat POR summary reports Rows: -1 because the portable header lacks a row count Port / libcsv / usage-readstat-r13-por-summary-rows-line Passed
Builds an SPSS POR file from a CSV via DTA using uppercase variable names that the portable format requires, and verifies the readstat summary reports the literal "Rows: -1" line, locking in that POR shares the XPORT-style "row count not available from header" behaviour and distinguishing it from the DTA path which reports the precise row count.
readstat SAS7BDAT summary reports Text encoding UTF-8 by default Port / libcsv / usage-readstat-r13-sas7bdat-summary-encoding-utf8 Passed
Builds a SAS7BDAT from a CSV via DTA and verifies the readstat summary contains the literal "Text encoding: UTF-8" line on the SAS7BDAT path, distinguishing the SAS data file encoding default from the (well-known) DTA default and from the XPT path which omits the encoding line.
readstat XPT summary reports Rows: -1 because XPORT lacks a row count Port / libcsv / usage-readstat-r13-xpt-summary-rows-minus-one Passed
Builds an XPT file from a CSV via DTA and verifies the readstat summary reports "Rows: -1" rather than the actual row count, locking in the well-known XPORT behaviour where the writer cannot report a row count from the header alone — distinguishing the XPT path from DTA and SAS7BDAT which report the precise row count.
readstat-produced POR carries the "ASCII SPSS PORT FILE" prefix in its leading region Port / libcsv / usage-readstat-r14-csv-to-por-ascii-prefix-marker Passed
Builds an SPSS POR from a CSV via DTA and asserts the first kilobyte of the output contains the literal "ASCII SPSS PORT FILE" prefix that the readstat POR writer emits, distinguishing the more specific ASCII-prefixed marker from the bare "SPSS PORT FILE" substring already covered.
readstat-produced XLSX is a ZIP container that unzips to expose [Content_Types].xml Port / libcsv / usage-readstat-r14-csv-to-xlsx-via-dta-content-type Passed
Round-trips a CSV through DTA and into XLSX via readstat, then runs the unzip(1) listing on the result and asserts it includes the "[Content_Types].xml" member that every Office Open XML package must contain — locking in that the XLSX writer emits a structurally valid ZIP/OOXML archive rather than a CSV-shaped placeholder.
readstat ZSAV summary reports Format: SPSS compressed binary file (ZSAV) Port / libcsv / usage-readstat-r14-csv-to-zsav-summary-format-line Passed
Builds a ZSAV from a CSV via DTA and verifies the readstat summary contains the precise "Format: SPSS compressed binary file (ZSAV)" line and a binary compression marker, locking in the literal format-line text used by the readstat metadata view for ZSAV files on Ubuntu 24.04 — distinguishing ZSAV's binary compression from SAV's row compression.
readstat DTA-to-ZSAV preserves the precise row count across the binary-compressed write Port / libcsv / usage-readstat-r14-dta-to-zsav-roundtrip-row-count Passed
Round-trips a 5-row CSV through DTA, then writes the DTA out as a ZSAV (binary-compressed SPSS), and verifies the ZSAV summary reports exactly the same row count as the source — confirming the binary-compression path of the ZSAV writer does not lose or duplicate rows on Ubuntu 24.04 readstat 1.1.9.
readstat SAS7BDAT summary reports Format version: 9 by default Port / libcsv / usage-readstat-r14-sas7bdat-format-version-nine Passed
Builds a SAS7BDAT from a CSV via DTA and verifies the readstat summary contains the literal "Format version: 9" line on the SAS7BDAT path, locking in version 9 as the default emitted by the SAS7BDAT writer on Ubuntu 24.04 — distinguishing it from the DTA default (118), the SAV default (2), and the XPT default (8).
readstat SAS7BDAT summary reports Byte order: little-endian by default Port / libcsv / usage-readstat-r14-sas7bdat-summary-byte-order-line Passed
Builds a SAS7BDAT from a CSV via DTA and verifies the readstat summary contains the literal "Byte order: little-endian" line on the SAS7BDAT path, locking in little-endian as the default byte order emitted by the SAS7BDAT writer on Ubuntu 24.04 — distinguishing the SAS7BDAT byte-order line from the encoding line.
readstat SAS7BDAT summary reports Table name: DATASET by default Port / libcsv / usage-readstat-r14-sas7bdat-table-name-default-dataset Passed
Builds a SAS7BDAT from a CSV via DTA and verifies the readstat summary contains the canonical "Table name: DATASET" line that the SAS7BDAT writer emits in the absence of an explicit table-name override, distinguishing the SAS7BDAT default from the DTA path which has no table-name slot in its summary.
readstat SAV summary reports Compression: rows by default Port / libcsv / usage-readstat-r14-sav-summary-compression-rows Passed
Builds a SAV from a CSV via DTA and verifies the readstat summary contains the literal "Compression: rows" line, locking in row-level compression as the default emitted by the readstat SAV writer on Ubuntu 24.04 — distinguishing SAV's row compression from ZSAV's binary compression.
readstat XPT summary reports Format version: 8 by default Port / libcsv / usage-readstat-r14-xpt-format-version-eight Passed
Builds an XPT from a CSV via DTA and verifies the readstat summary contains the literal "Format version: 8" line on the XPT path, locking in XPORT v8 as the default emitted by the XPT writer on Ubuntu 24.04 — matching the LIBV8 token observed in the binary header and distinguishing it from the SAS7BDAT version 9 default.
readstat ZSAV summary reports Format version: 3 (vs SAV's 2) Port / libcsv / usage-readstat-r14-zsav-format-version-three Passed
Builds a ZSAV from a CSV via DTA and verifies the readstat summary contains the precise "Format version: 3" line, locking in that ZSAV files use SPSS layout version 3 in contrast to plain SAV files which use version 2 on Ubuntu 24.04 readstat 1.1.9.
readstat DTA summary reports Table label: (null) when no label is set Port / libcsv / usage-readstat-r15-dta-table-label-null-default Passed
Builds a DTA from a CSV with no explicit dataset label and verifies the readstat summary contains the literal "Table label: (null)" line — locking in that the readstat DTA writer leaves the dataset-label slot null and the metadata view formats null as the literal string "(null)" on Ubuntu 24.04 readstat 1.1.9. Distinct from the table-name line emitted by the SAS7BDAT and XPT paths.
readstat dta-to-sas7bdat preserves the precise row count across the conversion Port / libcsv / usage-readstat-r15-sas7bdat-rows-preserved-from-dta Passed
Builds a 4-row DTA from a CSV and converts it to SAS7BDAT, then asserts the SAS7BDAT readstat summary reports "Rows: 4" — locking in that the SAS7BDAT writer preserves the exact source row count when the input is a DTA on Ubuntu 24.04 readstat 1.1.9, complementary to the existing csv-to-sas7bdat magic and version tests.
readstat sas7bdat-to-csv conversion emits exactly the source row count plus a header Port / libcsv / usage-readstat-r15-sas7bdat-to-csv-row-count-correct Passed
Round-trips a 5-row CSV through DTA into SAS7BDAT, then converts the SAS7BDAT back to CSV via stdout and asserts the resulting CSV has exactly 6 lines (1 header + 5 data rows) — locking in that the SAS7BDAT read path enumerates all rows correctly on Ubuntu 24.04 readstat 1.1.9, distinct from XPT (which reports -1 in summary but still enumerates rows) and SAV/ZSAV roundtrips.
readstat SAV summary reports Byte order: little-endian by default Port / libcsv / usage-readstat-r15-sav-byte-order-little-endian Passed
Builds a SAV from a CSV via DTA and verifies the readstat summary contains the literal "Byte order: little-endian" line on the SAV path — locking in little-endian as the default byte order emitted by the readstat SAV writer on Ubuntu 24.04 readstat 1.1.9. Distinct from the DTA and SAS7BDAT byte-order tests already in r13/r14.
readstat SAV summary reports Text encoding: UTF-8 by default Port / libcsv / usage-readstat-r15-sav-text-encoding-utf8-line Passed
Builds a SAV from a CSV via DTA and verifies the readstat summary contains the literal "Text encoding: UTF-8" line on the SAV path — locking in UTF-8 as the default text encoding emitted by the readstat SAV writer on Ubuntu 24.04 readstat 1.1.9. Distinct from the SAS7BDAT encoding-utf8 test in r13.
readstat sav-to-csv renders numeric integers as 6-decimal floating-point literals Port / libcsv / usage-readstat-r15-sav-to-csv-numeric-decimal-format Passed
Round-trips a 2-row CSV (with integer-looking numeric values) through DTA into SAV and back to CSV, and asserts the body contains the literal "1.000000" and "2.000000" forms — locking in that the SAV read path renders numeric fields with six decimal places by default on Ubuntu 24.04 readstat 1.1.9, matching the XPT and SAS7BDAT six-decimal rendering tests already in r11.
readstat XPT summary intentionally omits the Byte order line Port / libcsv / usage-readstat-r15-xpt-omits-byte-order-line Passed
Builds an XPT from a CSV via DTA and asserts the readstat summary contains NO line beginning with "Byte order:" — locking in the well-known XPT-specific shape where SAS XPORT files do not carry a runtime byte-order field, in contrast to DTA, SAV, ZSAV, and SAS7BDAT which all emit a Byte order line. Asserts the absence with -c 0.
readstat XPT summary reports Columns: 2 for a 2-column input Port / libcsv / usage-readstat-r15-xpt-summary-columns-line Passed
Builds a 2-column XPT from a CSV via DTA and verifies the readstat summary contains the literal "Columns: 2" line — locking in that the SAS XPORT writer's metadata path reports column count as a top-level summary field on Ubuntu 24.04 readstat 1.1.9, complementary to the existing XPT format-version-8 and table-name tests.
readstat ZSAV summary reports Columns: 2 like SAV does Port / libcsv / usage-readstat-r15-zsav-summary-columns-line Passed
Builds a 2-column ZSAV from a CSV via DTA and verifies the readstat summary contains the literal "Columns: 2" line — locking in that the ZSAV (binary-compressed SPSS) writer reports column count identically to plain SAV on Ubuntu 24.04 readstat 1.1.9, even though the format-version differs (3 for ZSAV vs 2 for SAV).
readstat zsav-to-csv conversion emits exactly the source row count plus a header Port / libcsv / usage-readstat-r15-zsav-to-csv-row-count-correct Passed
Round-trips a 5-row CSV through DTA into ZSAV, then converts the ZSAV back to CSV via stdout and asserts the resulting CSV has exactly 6 lines (1 header + 5 data rows) — locking in that the binary-compressed SPSS read path correctly enumerates all rows on Ubuntu 24.04 readstat 1.1.9, despite ZSAV summary metadata expressing the rows differently from DTA.
readstat preserves an embedded comma in a quoted string cell through DTA Port / libcsv / usage-readstat-r16-csv-comma-in-quoted-cell-survives Passed
Builds a CSV with a comma inside a quoted string field then round-trips it through DTA back to stdout CSV and asserts the recovered text retains the comma in a single quoted cell — verifying the libcsv-backed CSV reader does not split on inner commas.
readstat ingests a CSV with a newline inside a quoted string cell Port / libcsv / usage-readstat-r16-csv-embedded-newline-quoted-field Passed
Builds a CSV whose first string field contains an embedded newline within a quoted cell and asserts readstat reads it as a single row with 2 columns by checking the .dta summary reports Rows: 1 and Columns: 2.
readstat tolerates leading whitespace before unquoted numeric cells Port / libcsv / usage-readstat-r16-csv-leading-space-in-numeric-tolerated Passed
Builds a CSV whose numeric column cells carry one leading space before the digit, converts to DTA, and asserts the .dta summary reports the expected 3 rows and 2 columns — locking in readstat's tolerance for leading whitespace on numeric fields.
readstat round-trips a one-data-row CSV through DTA back to stdout CSV exactly Port / libcsv / usage-readstat-r16-csv-single-data-row-stdout-csv Passed
Converts a CSV containing a single non-header row to .dta then back to CSV via stdout, asserting the recovered CSV has exactly 2 lines and preserves the data cell values byte-for-byte through the DTA hop.
readstat dta-to-stdout dash target emits a CSV with quoted header Port / libcsv / usage-readstat-r16-dta-stdout-dash-csv-shape Passed
Converts a small CSV to .dta and back to stdout CSV via the "-" target, asserting the produced CSV's first line is a comma-separated quoted header listing both column names — locking in the dash-target stdout CSV output shape.
readstat POR summary reports an SPSS portable format-version line Port / libcsv / usage-readstat-r16-por-format-version-line Passed
Converts a small CSV to .por via SAV, reads back the .por summary, and asserts the summary contains a "Format:" line that mentions SPSS portable — locking in readstat's portable-write surface without committing to a specific version number text.
readstat-built xlsx contains xl/workbook.xml when inspected via python zipfile Port / libcsv / usage-readstat-r16-xlsx-zipfile-has-workbook-xml Passed
Converts CSV through DTA into an XLSX via readstat, then uses python3 zipfile to list the archive entries and asserts the standard "xl/workbook.xml" member is present — locking in the OOXML container structure of the readstat XLSX writer without relying on unzip or openpyxl.
readstat-built ZSAV file reports format-version 3 in its summary Port / libcsv / usage-readstat-r16-zsav-format-version-three Passed
Builds a ZSAV via the CSV->DTA->ZSAV chain and asserts the summary contains both "Format version: 3" and the "ZSAV" format label — locking in the binary-compressed SPSS writer's metadata shape on Ubuntu 24.04.
readstat reads its own stdout CSV back through a second conversion Port / libcsv / usage-readstat-r17-dta-stdout-csv-reparses Passed
Converts a CSV to .dta, then to stdout CSV, captures it as a new file, and asserts a follow-up CSV-to-DTA conversion against the captured output emits the same row/variable count log line as the original conversion — locking in stdout-csv re-readability.
readstat exits non-zero when the metadata declares zero variables Port / libcsv / usage-readstat-r17-empty-variables-rejected Passed
Feeds readstat a CSV with a header and a row paired with a metadata JSON whose variables array is empty, asserting the invocation exits non-zero — locking in that the writer refuses to produce output when no variables are declared.
readstat conversion log encodes a numeric duration-seconds value Port / libcsv / usage-readstat-r17-log-duration-seconds-numeric Passed
Captures readstat's stdout from a CSV-to-DTA conversion and asserts the log contains a "Converted N variables and M rows in T seconds" line where the T token parses as a positive float — locking in the structured duration emission.
readstat SAV summary includes a Format-version line with any positive integer Port / libcsv / usage-readstat-r17-sav-summary-format-line-present Passed
Builds a SAV from a small CSV and asserts the summary contains an "SPSS" marker plus any Format-version line with a positive integer, deliberately accepting noble's actual emitted value (version 2) rather than pinning the exact number.
readstat round-trips a 3-row 2-column CSV through DTA back to stdout CSV with stable shape Port / libcsv / usage-readstat-r17-tiny-csv-stdout-shape Passed
Converts a CSV with three data rows and two columns to .dta then back to CSV via stdout, asserting the recovered CSV has exactly four lines (header + 3 rows) and contains all six data cell tokens — locking in tiny-grid shape preservation.
readstat stdout CSV output ends with a trailing newline Port / libcsv / usage-readstat-r17-trailing-newline-preserved Passed
Converts a small CSV to .dta and back to stdout CSV, then asserts the last byte of the recovered stream is a newline (0x0a) — locking in the trailing-newline contract of readstat's stdout CSV writer.
readstat ZSAV summary still reports Format version 3 for a three-column input Port / libcsv / usage-readstat-r17-zsav-summary-format-version-three Passed
Builds a ZSAV from a three-column CSV via the DTA intermediate path and asserts the summary contains "Format version: 3" plus the ZSAV format label — locking in noble's compressed-SPSS writer for a wider input than the r16 two-column variant.
readstat round-trips a five-row two-column CSV through DTA back to stdout CSV Port / libcsv / usage-readstat-r18-csv-five-row-dta-roundtrip Passed
Builds a CSV with five data rows and two numeric columns, converts to .dta, then back to stdout CSV, and asserts the recovered output has exactly six lines (header + 5 rows) and contains every data cell — locking in row-count and content preservation for a slightly larger payload than the r17 tiny case.
readstat reports zero converted rows when a CSV has only a header line Port / libcsv / usage-readstat-r18-empty-data-rows-rejected Passed
Feeds readstat a header-only CSV with no data rows and asserts the log line emits "Converted 0 variables and 0 rows" along with the "One or more columns must be provided" diagnostic — locking in the structured complaint for header-only inputs.
readstat preserves negative integer cells in CSV-to-DTA-to-CSV roundtrips Port / libcsv / usage-readstat-r18-negative-integer-rendering Passed
Converts a CSV containing a column of negative integers through DTA and back to stdout CSV, then asserts each negative value appears in the recovered output with the six-decimal numeric rendering ("-1.000000", "-2.000000", "-3.000000").
readstat stdout CSV renders integer cells as N.000000 with six decimal places Port / libcsv / usage-readstat-r18-numeric-value-six-decimals Passed
Converts a CSV with a single integer column through DTA and back to stdout CSV, then asserts the lone data row equals "7.000000" — locking in the six-decimal default rendering of numeric cells for integer inputs.
readstat SAS7BDAT summary carries the SAS7BDAT format label Port / libcsv / usage-readstat-r18-sas7bdat-summary-format-line Passed
Builds a SAS7BDAT from a small two-column CSV via the DTA intermediate path and asserts the summary contains a "Format:" line mentioning SAS7BDAT — locking in the SAS binary writer's format-label emission.
readstat CSV-to-SAV-to-CSV roundtrip preserves the column header tokens Port / libcsv / usage-readstat-r18-sav-roundtrip-header-preserved Passed
Converts a small CSV to SAV via SPSS metadata, then back to stdout CSV, and asserts the recovered first line contains both column tokens "p" and "q" — locking in column header preservation through the SAV writer/reader pair.
readstat stdout CSV writer wraps each header column name in double quotes Port / libcsv / usage-readstat-r18-stdout-csv-double-quoted-header Passed
Converts a small CSV with two named columns through DTA and back to stdout CSV, then asserts the first line of the recovered output is exactly the double-quoted comma-separated header — locking in the stdout writer's quoted-header convention.
readstat summary reports the exact Rows count for a four-row input Port / libcsv / usage-readstat-r18-summary-rowcount-line Passed
Converts a CSV with exactly four data rows to .dta then captures the summary by invoking readstat against the .dta with no output destination, and asserts the summary contains "Rows: 4" — locking in row-count summary emission for known cardinality.
readstat summary of a three-column DTA reports Columns 3 and matching Rows Port / libcsv / usage-readstat-r18-three-column-summary-shape Passed
Builds a three-column CSV with three data rows, converts to .dta, captures the summary, and asserts the summary contains both "Columns: 3" and "Rows: 3" — locking in the shape report for an explicitly multi-column input.
readstat builds a non-empty XPT file from CSV via the DTA intermediate Port / libcsv / usage-readstat-r18-xpt-output-non-empty Passed
Converts a small two-column CSV through DTA to SAS XPORT format, asserts the resulting .xpt file exists with non-zero size, then runs readstat against the .xpt to capture a summary that mentions XPORT — locking in the SAS XPT writer path.
readstat CSV-DTA-CSV roundtrip preserves every data cell across three rows Port / libcsv / usage-readstat-r19-csv-dta-csv-data-cells-preserved Passed
Converts a three-row two-column CSV through DTA and back to stdout CSV, then asserts the recovered output contains every distinct numeric value from the source - locking in cell-by-cell content preservation for a small mixed-value payload.
readstat stdout CSV preserves all three header tokens through a DTA hop Port / libcsv / usage-readstat-r19-csv-three-cols-stdout-headers-present Passed
Builds a CSV with three numeric columns named alpha, beta, gamma, converts to .dta, then back to stdout CSV and asserts the recovered first line contains all three header tokens - locking in three-column header preservation through the DTA reader and writer.
readstat stdout CSV of a two-row DTA emits exactly three lines including header Port / libcsv / usage-readstat-r19-csv-two-row-stdout-row-count Passed
Converts a two-row two-column CSV through DTA and back to stdout CSV, then asserts the recovered CSV has exactly three lines (one header plus two data rows) - locking in stdout line-count fidelity for the smallest non-trivial multi-row payload.
readstat preserves a positive decimal cell 1.5 through the CSV-DTA-CSV roundtrip Port / libcsv / usage-readstat-r19-dta-numeric-column-positive-float Passed
Converts a single-row CSV containing the value 1.5 through DTA and back to stdout CSV, then asserts the lone data row equals "1.500000" - locking in fractional decimal rendering at the readstat six-decimal default.
readstat summary of a six-row DTA reports Rows: 6 Port / libcsv / usage-readstat-r19-dta-rows-line-matches-six-rows Passed
Builds a single-column CSV with six data rows, converts to .dta, captures the summary output, and asserts it contains the literal "Rows: 6" - locking in the row-count summary line on a row count distinct from existing r17/r18 cases.
readstat summary of a two-column DTA reports Columns: 2 Port / libcsv / usage-readstat-r19-dta-summary-columns-two Passed
Builds a two-column CSV with three rows, converts to .dta, captures the summary, and asserts it contains the literal token "Columns: 2" - locking in the column-count line of the DTA summary for the exact two-column case.
readstat writes a non-empty SAS7BDAT file from CSV via the DTA intermediate Port / libcsv / usage-readstat-r19-sas7bdat-output-non-empty Passed
Converts a two-row two-column CSV through DTA and into a .sas7bdat file, asserts the produced file exists with non-zero size, and runs readstat over the .sas7bdat to capture a summary containing the SAS7BDAT format label - locking in the SAS7BDAT writer output path with two numeric columns.
readstat summary of a four-row SAV reports Rows: 4 Port / libcsv / usage-readstat-r19-sav-summary-rows-line Passed
Builds a CSV with four data rows, converts to .sav via SPSS metadata, captures the summary output, and asserts it contains the literal "Rows: 4" - locking in the row-count summary line on the SAV writer path with a row count distinct from existing tests.
readstat stdout CSV output ends with a trailing newline byte Port / libcsv / usage-readstat-r19-stdout-csv-trailing-newline Passed
Converts a two-row CSV through DTA back to stdout CSV redirected to a file, reads the last byte of that file, and asserts it is the LF (0x0a) character - locking in stdout CSV terminator behavior of the readstat client.
readstat builds a non-empty ZSAV from CSV via the DTA intermediate Port / libcsv / usage-readstat-r19-zsav-output-non-empty Passed
Converts a small CSV through DTA into a .zsav, asserts the produced file exists with non-zero size, and runs readstat over the .zsav to capture a summary containing the ZSAV format label - locking in the ZSAV writer output path for a small two-column input.
readstat CSV-DTA-CSV preserves a decimal fraction (3.5) through the roundtrip Port / libcsv / usage-readstat-r20-csv-decimal-roundtrip-preserved Passed
Builds a one-row CSV containing 3.5, converts through .dta and back to stdout CSV, and asserts the recovered output contains the token "3.5" - locking in fractional-value preservation through the DTA roundtrip.
readstat CSV-DTA-CSV preserves five distinct integer values in a single column Port / libcsv / usage-readstat-r20-csv-five-distinct-values-survive Passed
Builds a single-column CSV with five distinct integers, converts to .dta and back to stdout CSV, then asserts each integer is recovered in the output - locking in single-column row preservation through the DTA roundtrip path.
readstat CSV-DTA-CSV preserves a negative integer value Port / libcsv / usage-readstat-r20-csv-negative-value-survives Passed
Builds a CSV containing a negative integer (-42), converts through .dta back to stdout CSV, and asserts the recovered output contains the literal "-42" - locking in sign preservation through the DTA writer/reader.
readstat summary of a four-row SAS7BDAT (via DTA) reports Rows: 4 Port / libcsv / usage-readstat-r20-csv-sas7bdat-summary-rows Passed
Builds a four-row CSV, converts to .dta via Stata metadata, converts the .dta to .sas7bdat, then captures the summary output and asserts it contains the literal "Rows: 4" - locking in row-count reporting on the SAS7BDAT writer/reader path.
readstat CSV-SAV-CSV roundtrip preserves every data cell across three rows Port / libcsv / usage-readstat-r20-csv-sav-csv-roundtrip-cells Passed
Converts a three-row two-column CSV through SAV and back to stdout CSV, then asserts the recovered output contains every distinct numeric value from the source - locking in cell preservation for the SAV writer/reader paths.
readstat CSV-DTA stdout reader emits five data lines plus one header Port / libcsv / usage-readstat-r20-csv-stdout-row-count-five Passed
Builds a CSV with five data rows, converts to .dta, then reads it back to stdout CSV, and asserts the output has exactly six total non-empty lines (one header + five data) - locking in the row-count fidelity through the stdout CSV writer.
readstat CSV-DTA-XPT writer produces a non-empty XPT file Port / libcsv / usage-readstat-r20-csv-xpt-output-non-empty Passed
Builds a tiny CSV, converts to .dta via Stata metadata, then converts the .dta to a SAS Transport (.xpt) file and asserts the produced .xpt exists with positive byte length - locking in the XPT writer output path via the DTA intermediate.
readstat summary of a DTA file emits a Format: line referencing Stata Port / libcsv / usage-readstat-r20-dta-summary-format-line Passed
Converts a tiny CSV to .dta via Stata metadata, captures the summary output for the .dta file, and asserts it contains a line starting with "Format:" - locking in the format-line summary path on the DTA reader.
readstat summary of a single-column SAV reports Columns: 1 Port / libcsv / usage-readstat-r20-sav-summary-columns-one Passed
Builds a single-column CSV, converts to .sav, captures the summary output, and asserts it contains the literal "Columns: 1" - locking in the column-count summary line on the SAV writer path for a width of one.
readstat summary of a three-row ZSAV (via DTA) reports Rows: 3 Port / libcsv / usage-readstat-r20-zsav-summary-rows-three Passed
Builds a CSV with three data rows, converts to .dta via Stata metadata, then converts the .dta to .zsav, captures the summary output, and asserts it contains the literal "Rows: 3" - locking in row-count summary reporting on the compressed SAV (ZSAV) writer path via the DTA intermediate.
readstat CSV-DTA-CSV preserves four distinct ASCII strings in row order Port / libcsv / usage-readstat-r21-csv-dta-string-roundtrip-four-rows Passed
Builds a four-row string-only CSV with metadata Stata STRING column, converts to DTA and back to CSV, then asserts the recovered stdout CSV preserves each ASCII token verbatim and in the same row order - locking in a four-row string roundtrip distinct from the existing five-row integer/three-string roundtrip tests.
readstat CSV with one numeric and one string column preserved through DTA Port / libcsv / usage-readstat-r21-csv-mixed-types-survive-roundtrip Passed
Builds a 3-row CSV with a numeric column and a string column, converts through .dta and back to stdout CSV, and asserts both columns' values appear in the recovered output - locking in mixed-type-column roundtrip behavior at 3 rows distinct from existing one-numeric-one-string and r9-mixed tests by checking specific token presence in both columns.
readstat CSV-DTA-CSV roundtrip preserves six distinct ASCII strings Port / libcsv / usage-readstat-r21-csv-multi-distinct-strings-survive Passed
Builds a six-row string CSV with non-overlapping tokens, converts through .dta and back to stdout CSV, and asserts each unique token appears in the recovered output - locking in a six-distinct-string survival contract distinct from prior four/five-row string tests.
readstat CSV-to-SAS7BDAT preserves six rows on stdout CSV readback Port / libcsv / usage-readstat-r21-csv-sas7bdat-rowcount-six Passed
Builds a six-row CSV, converts through .dta to .sas7bdat, reads back to stdout CSV, and asserts the recovered output has exactly seven non-empty lines (one header + six data rows) - locking in SAS7BDAT row-count fidelity on six-row input distinct from prior summary-rows tests.
readstat CSV-SAV-CSV roundtrip preserves four distinct decimal values Port / libcsv / usage-readstat-r21-csv-sav-distinct-floats-survive Passed
Builds a four-row CSV with distinct decimal values (1.5, 2.5, 3.5, 4.5), converts through .sav and back to stdout CSV, and asserts each decimal token appears in the recovered output - locking in decimal preservation through the SAV writer path on a four-value sequence distinct from prior 3.5-only or integer tests.
readstat summary of a four-row SAV converted from CSV reports Rows: 4 Port / libcsv / usage-readstat-r21-csv-sav-rows-four-summary Passed
Builds a four-row CSV with SPSS metadata, converts to .sav directly (skipping the DTA intermediate), captures the summary, and asserts it contains "Rows: 4" - locking in row-count summary reporting on the direct CSV-to-SAV writer path with four data rows specifically.
readstat CSV stdout output begins with quoted header column name Port / libcsv / usage-readstat-r21-csv-stdout-header-present Passed
Converts a two-row CSV through DTA and asserts the very first line of the stdout CSV is the quoted header `"vname"` (matching readstat's header-quoting convention) - locking in header emission on the stdout dash output distinct from existing header-line tests which check column count or three-column shapes.
readstat XPT summary reports Columns: 2 for a two-column CSV input Port / libcsv / usage-readstat-r21-csv-xpt-summary-columns-two Passed
Builds a two-column CSV with Stata metadata, converts to .dta then to .xpt, captures the summary, and asserts the literal "Columns: 2" appears - locking in XPT column-count summary specifically (existing XPT tests check rows or single columns).
readstat summary of a six-row ZSAV reports Rows: 6 Port / libcsv / usage-readstat-r21-csv-zsav-rowcount-summary Passed
Builds a six-row CSV, converts to .dta then to .zsav, captures the summary, and asserts the literal "Rows: 6" appears - locking in compressed SAV row-count summary on a non-zero non-{3,5} row count (existing zsav tests cover 3-row and 5-row counts).
readstat summary of a three-column DTA reports Columns: 3 Port / libcsv / usage-readstat-r21-dta-summary-columns-three Passed
Builds a three-column CSV with Stata metadata declaring three NUMERIC variables, converts to DTA, captures the summary, and asserts it contains "Columns: 3" - locking in column-count summary reporting for three-column input specifically (existing tests cover one/two column counts).
readstat handles doubled-quote escape Port / libcsv / usage-readstat-r9-csv-double-quote-escape Passed
Provides a CSV cell containing an escaped double-quote ("") and confirms readstat parses the row as a single quoted field whose value contains a literal double quote.
readstat 200 string rows Port / libcsv / usage-readstat-r9-csv-many-string-rows Passed
Stores 200 short string rows into Stata DTA via readstat and verifies the row count and a known cell are preserved on read-back.
readstat mixed numeric and string columns Port / libcsv / usage-readstat-r9-csv-mixed-numeric-string-cols Passed
Builds a CSV with one numeric and two string columns, converts to DTA, and confirms both column kinds are preserved on readback.
readstat preserves negative float values Port / libcsv / usage-readstat-r9-csv-negative-floats-roundtrip Passed
Roundtrips a CSV containing negative fractional values through DTA and back to CSV, asserting each negative value is preserved with six-decimal formatting.
readstat preserves quoted comma cell Port / libcsv / usage-readstat-r9-csv-quoted-comma-cell Passed
Embeds a literal comma inside a quoted CSV cell and verifies readstat keeps the field as a single column without splitting on the inner comma.
readstat single column 100 rows Port / libcsv / usage-readstat-r9-csv-single-column-100-rows Passed
Converts a 100-row single-column CSV through DTA and confirms the row count and a representative middle value are preserved.
readstat CSV through SPSS SAV format Port / libcsv / usage-readstat-r9-csv-spss-sav-roundtrip Passed
Converts a CSV through the SPSS .sav format and back to CSV and confirms the cell values reappear unchanged.
readstat preserves tab separators as cell content Port / libcsv / usage-readstat-r9-csv-tab-not-comma-rejected Passed
Feeds a tab-separated input through readstat and verifies the comma parser treats the line as a single column rather than splitting on tabs.
readstat tolerates extra trailing newlines Port / libcsv / usage-readstat-r9-csv-trailing-newline-tolerance Passed
Appends multiple trailing blank lines to a small CSV and confirms readstat does not count them as additional rows.
readstat writes SPSS .sav with compression Port / libcsv / usage-readstat-r9-csv-zsav-compressed-output Passed
Writes a CSV through readstat into the SPSS .sav format and verifies the output is non-empty and round-trips back through readstat with the right shape.
readstat SAS7BDAT summary metadata Port / libcsv / usage-readstat-sas7bdat-summary-format Passed
Builds a SAS7BDAT file from CSV via DTA and verifies the metadata summary identifies the SAS data format and reports the dataset shape.
readstat SAV column count Port / libcsv / usage-readstat-sav-column-count Passed
readstat comma string value Port / libcsv / usage-readstat-sav-comma-value Passed
readstat SAV count sum Port / libcsv / usage-readstat-sav-count-sum Passed
readstat SAV date string Port / libcsv / usage-readstat-sav-date-string-batch11 Passed
readstat SAV decimal number Port / libcsv / usage-readstat-sav-decimal-number Passed
readstat SAV double quote string Port / libcsv / usage-readstat-sav-double-quote-string-batch11 Passed
readstat SAV empty string row Port / libcsv / usage-readstat-sav-empty-string-row Passed
Converts a CSV row containing an empty quoted string to SAV with readstat and verifies the summary still reports a single column.
readstat SAV empty string Port / libcsv / usage-readstat-sav-empty-string Passed
readstat SAV header fields Port / libcsv / usage-readstat-sav-header-fields Passed
Converts CSV to SAV with readstat and verifies the exported CSV header row preserves the expected field order.
readstat SAV large positive number Port / libcsv / usage-readstat-sav-large-positive-number Passed
Converts a six-digit positive integer to SAV with readstat and verifies the formatted decimal value in the output CSV.
readstat SAV leading space note Port / libcsv / usage-readstat-sav-leading-space-note Passed
readstat SAV leading zero string Port / libcsv / usage-readstat-sav-leading-zero-string Passed
Converts a string field with leading zeros through SAV and verifies the leading zeros survive export.
readstat SAV long string Port / libcsv / usage-readstat-sav-long-string Passed
readstat SAV mixed-case header Port / libcsv / usage-readstat-sav-mixed-case-header-roundtrip Passed
Converts a mixed-case CSV header to SAV with readstat and verifies the round-tripped header preserves the original column casing.
readstat SAV mixed decimal sign Port / libcsv / usage-readstat-sav-mixed-decimal-sign Passed
Converts signed decimal numbers to SAV with readstat and verifies both formatted values in the output CSV.
readstat SAV mixed group value Port / libcsv / usage-readstat-sav-mixed-group Passed
readstat SAV multiline note Port / libcsv / usage-readstat-sav-multiline-note-roundtrip Passed
Converts a quoted multiline CSV field to SAV with readstat and verifies both lines survive the round-tripped output.
readstat SAV negative number Port / libcsv / usage-readstat-sav-negative-number Passed
readstat SAV numeric-looking string Port / libcsv / usage-readstat-sav-numeric-string-roundtrip Passed
Converts a decimal-looking string column to SAV with readstat and verifies the round-tripped output still preserves the quoted text form.
readstat SAV pipe note Port / libcsv / usage-readstat-sav-pipe-note Passed
readstat SAV quoted comma string Port / libcsv / usage-readstat-sav-quoted-comma-string Passed
Converts a quoted CSV field containing a comma to SAV with readstat and verifies the embedded comma survives the round trip.
readstat SAV row count Port / libcsv / usage-readstat-sav-row-count Passed
readstat SAV row order Port / libcsv / usage-readstat-sav-row-order Passed
readstat SAV scientific number Port / libcsv / usage-readstat-sav-scientific-number Passed
Converts a scientific-notation numeric CSV field to SAV with readstat and verifies the normalized numeric output.
readstat SAV score sum Port / libcsv / usage-readstat-sav-score-sum Passed
Converts multiple CSV rows through SAV and verifies numeric score aggregation over the exported data.
readstat SAV single column Port / libcsv / usage-readstat-sav-single-column Passed
readstat SAV slash note Port / libcsv / usage-readstat-sav-slash-note Passed
readstat SAV small decimal Port / libcsv / usage-readstat-sav-small-decimal-batch11 Passed
readstat SAV spaced value Port / libcsv / usage-readstat-sav-spaced-value Passed
readstat SAV single row summary Port / libcsv / usage-readstat-sav-summary-single-row Passed
readstat SAV tab note Port / libcsv / usage-readstat-sav-tab-note Passed
Converts a CSV field containing a tab to SAV with readstat and verifies the tab survives the round trip.
readstat SAV three row numbers Port / libcsv / usage-readstat-sav-three-row-numbers Passed
Converts three numeric rows to SAV with readstat and verifies all three formatted decimal values appear in the output CSV.
readstat SAV three rows Port / libcsv / usage-readstat-sav-three-rows Passed
readstat SAV to CSV Port / libcsv / usage-readstat-sav-to-csv Passed
readstat SAV two-column summary Port / libcsv / usage-readstat-sav-two-column-summary Passed
readstat SAV two-row strings Port / libcsv / usage-readstat-sav-two-row-strings-roundtrip Passed
Converts two string rows to SAV with readstat and verifies both rows survive round trip in the original order.
readstat SAV two string columns Port / libcsv / usage-readstat-sav-two-string-columns-batch11 Passed
readstat SAV underscore header Port / libcsv / usage-readstat-sav-underscore-header-batch11 Passed
readstat SAV Unicode string Port / libcsv / usage-readstat-sav-unicode-string Passed
Converts a CSV containing Unicode text to SAV with readstat and verifies the decoded string survives the round trip.
readstat SAV zero number Port / libcsv / usage-readstat-sav-zero-number Passed
Converts a zero-valued numeric column to SAV with readstat and verifies the zero survives round trip.
readstat SAV zero value Port / libcsv / usage-readstat-sav-zero-value Passed
readstat honors user_width metadata for string columns Port / libcsv / usage-readstat-string-user-width-honored Passed
Builds a DTA from CSV with a STRING column carrying a 20-character "user_width" hint in metadata and a 20-character value, then verifies the round-trip back to CSV keeps the full unmodified string and the DTA summary still reports two rows and two columns.
readstat summary line format parsed by regex Port / libcsv / usage-readstat-summary-line-format-regex Passed
Converts a CSV through DTA and SAV and parses each summary output with line-anchored regular expressions for the Columns, Rows, Compression, Text encoding, and Byte order fields, verifying both that the lines exist and that their values match the file shape rather than relying on plain substring search.
readstat summary timestamp line matches expected calendar shape Port / libcsv / usage-readstat-summary-timestamp-line-shape Passed
Generates a DTA and a SAV from a CSV and verifies each summary's "Timestamp:" line matches the day-month-year hour:minute pattern (DD MMM YYYY HH:MM) emitted by readstat, locking in that the calendar field is well-formed even though the actual moment depends on the test run time.
readstat wide CSV metadata Port / libcsv / usage-readstat-wide-csv Passed
readstat XLSX sheet dimension reflects three columns and eight data rows Port / libcsv / usage-readstat-xlsx-sheet-dimension-larger Passed
Builds an XLSX from an eight-row three-column CSV via DTA and parses the sheet1 XML to verify the dimension attribute is exactly A1:C9 (three columns and one header plus eight data rows) and that the eighth data row contains the trailing string code reference for the final group entry.
readstat XPT summary metadata Port / libcsv / usage-readstat-xpt-summary-format Passed
Generates an XPT file from CSV via DTA and verifies the metadata summary identifies the SAS transport format and column count.
readstat ZSAV compression summary Port / libcsv / usage-readstat-zsav-compression-summary Passed
Builds a ZSAV file from CSV via DTA and verifies the metadata summary reports binary compression and matching row and column counts.