@@ -98,5 +98,100 @@ public void TestCsvExportUsesWindowsLineEndings()
9898 if ( System . IO . File . Exists ( testFile ) )
9999 System . IO . File . Delete ( testFile ) ;
100100 }
101+
102+ [ TestMethod ]
103+ public void TestCsvFormatOptions ( )
104+ {
105+ var testData = new [ ]
106+ {
107+ new { Name = "Test×Data" , Description = "Special characters: ñ©€Á" } ,
108+ new { Name = "Normal" , Description = "Regular text" }
109+ } ;
110+
111+ // Test UTF8 format (now default)
112+ var csvContent = testData . ToCsvString ( format : CSVFormat . UTF8 ) ;
113+ Assert . IsTrue ( csvContent . Contains ( "×" ) ) ;
114+ Assert . IsTrue ( csvContent . Contains ( "ñ" ) ) ;
115+ Assert . IsTrue ( csvContent . Contains ( "©" ) ) ;
116+ Assert . IsTrue ( csvContent . Contains ( "€" ) ) ;
117+ Assert . IsTrue ( csvContent . Contains ( "Á" ) ) ;
118+
119+ // Test ANSI format (should work with fallback to UTF-8)
120+ var csvContentAnsi = testData . ToCsvString ( format : CSVFormat . ANSI ) ;
121+ Assert . IsTrue ( csvContentAnsi . Contains ( "×" ) ) ;
122+
123+ // Test UTF16 format
124+ var csvContentUtf16 = testData . ToCsvString ( format : CSVFormat . UTF16 ) ;
125+ Assert . IsTrue ( csvContentUtf16 . Contains ( "×" ) ) ;
126+ Assert . IsTrue ( csvContentUtf16 . Contains ( "€" ) ) ;
127+ }
128+
129+ [ TestMethod ]
130+ public void TestCsvEmojiSupportAndExcelCompatibility ( )
131+ {
132+ // Test data with emojis and special characters that require full Unicode support
133+ var testData = new [ ]
134+ {
135+ new { Name = "John 😀 Doe" , Status = "Happy 🎉" , Country = "🇺🇸 USA" } ,
136+ new { Name = "María José 🌟" , Status = "Café ☕" , Country = "🇪🇸 España" } ,
137+ new { Name = "陈小明 🐉" , Status = "茶 🍵" , Country = "🇨🇳 中国" } ,
138+ new { Name = "Владимир 🚀" , Status = "работа 💼" , Country = "🇷🇺 Россия" }
139+ } ;
140+
141+ // Test UTF8 format (default) - this should preserve all emojis and Unicode characters
142+ var csvContent = testData . ToCsvString ( format : CSVFormat . UTF8 ) ;
143+
144+ // Verify all emojis are preserved
145+ Assert . IsTrue ( csvContent . Contains ( "😀" ) , "Should contain smile emoji" ) ;
146+ Assert . IsTrue ( csvContent . Contains ( "🎉" ) , "Should contain party emoji" ) ;
147+ Assert . IsTrue ( csvContent . Contains ( "🇺🇸" ) , "Should contain US flag emoji" ) ;
148+ Assert . IsTrue ( csvContent . Contains ( "🌟" ) , "Should contain star emoji" ) ;
149+ Assert . IsTrue ( csvContent . Contains ( "☕" ) , "Should contain coffee emoji" ) ;
150+ Assert . IsTrue ( csvContent . Contains ( "🇪🇸" ) , "Should contain Spain flag emoji" ) ;
151+ Assert . IsTrue ( csvContent . Contains ( "🐉" ) , "Should contain dragon emoji" ) ;
152+ Assert . IsTrue ( csvContent . Contains ( "🍵" ) , "Should contain tea emoji" ) ;
153+ Assert . IsTrue ( csvContent . Contains ( "🇨🇳" ) , "Should contain China flag emoji" ) ;
154+ Assert . IsTrue ( csvContent . Contains ( "🚀" ) , "Should contain rocket emoji" ) ;
155+ Assert . IsTrue ( csvContent . Contains ( "💼" ) , "Should contain briefcase emoji" ) ;
156+ Assert . IsTrue ( csvContent . Contains ( "🇷🇺" ) , "Should contain Russia flag emoji" ) ;
157+
158+ // Verify special characters from different languages
159+ Assert . IsTrue ( csvContent . Contains ( "María" ) , "Should contain accented characters" ) ;
160+ Assert . IsTrue ( csvContent . Contains ( "陈小明" ) , "Should contain Chinese characters" ) ;
161+ Assert . IsTrue ( csvContent . Contains ( "Владимир" ) , "Should contain Cyrillic characters" ) ;
162+ Assert . IsTrue ( csvContent . Contains ( "茶" ) , "Should contain Chinese tea character" ) ;
163+ Assert . IsTrue ( csvContent . Contains ( "работа" ) , "Should contain Russian text" ) ;
164+
165+ // Test file output with BOM for Excel compatibility
166+ string emojiTestFile = "emoji_test.csv" ;
167+ testData . WriteCsv ( emojiTestFile , format : CSVFormat . UTF8 ) ;
168+
169+ // Verify file was created
170+ Assert . IsTrue ( System . IO . File . Exists ( emojiTestFile ) , "Emoji CSV file should be created" ) ;
171+
172+ // Read raw bytes to verify BOM is present for Excel compatibility
173+ byte [ ] fileBytes = System . IO . File . ReadAllBytes ( emojiTestFile ) ;
174+
175+ // Check for UTF-8 BOM (0xEF, 0xBB, 0xBF)
176+ Assert . IsTrue ( fileBytes . Length >= 3 , "File should have at least 3 bytes" ) ;
177+ Assert . AreEqual ( 0xEF , fileBytes [ 0 ] , "First byte should be 0xEF (UTF-8 BOM)" ) ;
178+ Assert . AreEqual ( 0xBB , fileBytes [ 1 ] , "Second byte should be 0xBB (UTF-8 BOM)" ) ;
179+ Assert . AreEqual ( 0xBF , fileBytes [ 2 ] , "Third byte should be 0xBF (UTF-8 BOM)" ) ;
180+
181+ Console . WriteLine ( "✅ Emoji CSV Test Results:" ) ;
182+ Console . WriteLine ( $ "📁 File size: { fileBytes . Length } bytes") ;
183+ Console . WriteLine ( $ "📋 UTF-8 BOM detected: { fileBytes [ 0 ] == 0xEF && fileBytes [ 1 ] == 0xBB && fileBytes [ 2 ] == 0xBF } ") ;
184+ Console . WriteLine ( $ "🎯 Contains emojis: { csvContent . Contains ( "😀" ) } ") ;
185+ Console . WriteLine ( $ "🌍 Contains international text: { csvContent . Contains ( "陈小明" ) } ") ;
186+
187+ Console . WriteLine ( "\n 📝 For Excel users:" ) ;
188+ Console . WriteLine ( "1. The generated CSV uses UTF-8 with BOM for maximum compatibility" ) ;
189+ Console . WriteLine ( "2. If Excel shows one column, use Data > From Text/CSV and select UTF-8 encoding" ) ;
190+ Console . WriteLine ( "3. All emojis and international characters should display correctly" ) ;
191+
192+ // Clean up
193+ //if (System.IO.File.Exists(emojiTestFile))
194+ // System.IO.File.Delete(emojiTestFile);
195+ }
101196 }
102197}
0 commit comments