assertSame( "\xEF\xBB\xBF", substr( $out, 0, 3 ) ); } public function test_simple_row_csv_output(): void { $out = WPDO_CSV_Writer::build( array( 'a', 'b' ), array( array( 'a' => '1', 'b' => '2' ) ) ); $this->assertStringContainsString( "a,b\r\n1,2\r\n", $out ); } public function test_field_with_comma_gets_quoted(): void { $out = WPDO_CSV_Writer::build( array( 'col' ), array( array( 'col' => 'foo,bar' ) ) ); $this->assertStringContainsString( '"foo,bar"', $out ); } public function test_field_with_quote_doubles_it(): void { $out = WPDO_CSV_Writer::build( array( 'col' ), array( array( 'col' => 'say "hi"' ) ) ); $this->assertStringContainsString( '"say ""hi"""', $out ); } public function test_field_with_newline_gets_quoted(): void { $out = WPDO_CSV_Writer::build( array( 'col' ), array( array( 'col' => "line1\nline2" ) ) ); $this->assertStringContainsString( "\"line1\nline2\"", $out ); } public function test_array_value_serializes_to_json(): void { $out = WPDO_CSV_Writer::build( array( 'col' ), array( array( 'col' => array( 'a', 'b' ) ) ) ); // Array becomes JSON; quotes inside JSON are doubled inside the CSV-quoted field. $this->assertStringContainsString( '"[""a"",""b""]"', $out ); } public function test_missing_field_renders_empty(): void { $out = WPDO_CSV_Writer::build( array( 'a', 'b' ), array( array( 'a' => '1' ) ) ); $this->assertStringContainsString( "1,\r\n", $out ); } }