packages feed

dataframe-3.0.0.0: tests/Operations/WriteCsv.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}

module Operations.WriteCsv where

import qualified Data.Text as T
import qualified Data.Text.IO as TIO
import qualified DataFrame as D
import qualified DataFrame.Internal.Column as DI
import DataFrame.Internal.DataFrame (DataFrame (..), toCsv, toSeparated)
import Test.HUnit

-- Basic test: Int and Text columns produce correct CSV
toCsvBasic :: Test
toCsvBasic = TestLabel "toCsv_basic" $ TestCase $ do
    let df =
            D.fromNamedColumns
                [ ("name", DI.fromList @T.Text ["Alice", "Bob", "Charlie"])
                , ("age", DI.fromList @Int [30, 25, 35])
                ]
        expected = "name,age\nAlice,30\nBob,25\nCharlie,35\n"
    assertEqual "basic toCsv" expected (toCsv df)

-- Empty DataFrame produces empty text
toCsvEmpty :: Test
toCsvEmpty =
    TestLabel "toCsv_empty" $
        TestCase $
            assertEqual "empty toCsv" T.empty (toCsv D.empty)

-- toSeparated with tab produces tab-delimited output
toSeparatedTab :: Test
toSeparatedTab = TestLabel "toSeparated_tab" $ TestCase $ do
    let df =
            D.fromNamedColumns
                [ ("x", DI.fromList @Int [1, 2])
                , ("y", DI.fromList @Int [3, 4])
                ]
        expected = "x\ty\n1\t3\n2\t4\n"
    assertEqual "tab separated" expected (toSeparated '\t' df)

-- Double values render correctly
toCsvDouble :: Test
toCsvDouble = TestLabel "toCsv_double" $ TestCase $ do
    let df =
            D.fromNamedColumns
                [ ("value", DI.fromList @Double [1.5, 2.0, 2.5])
                ]
        expected = "value\n1.5\n2.0\n2.5\n"
    assertEqual "double toCsv" expected (toCsv df)

-- Single column DataFrame
toCsvSingleColumn :: Test
toCsvSingleColumn = TestLabel "toCsv_single_column" $ TestCase $ do
    let df =
            D.fromNamedColumns
                [ ("id", DI.fromList @Int [10, 20, 30])
                ]
        expected = "id\n10\n20\n30\n"
    assertEqual "single column toCsv" expected (toCsv df)

-- Round trip: toCsv then readCsv preserves data
toCsvRoundTrip :: Test
toCsvRoundTrip = TestLabel "toCsv_roundTrip" $ TestCase $ do
    let df =
            D.fromNamedColumns
                [ ("a", DI.fromList @Int [1, 2, 3])
                , ("b", DI.fromList @T.Text ["hello", "world", "test"])
                ]
    let csvText = toCsv df
    let tmpPath = "/tmp/dataframe_test_toCsv_roundtrip.csv"
    TIO.writeFile tmpPath csvText
    df' <- D.readCsv tmpPath
    assertEqual
        "round trip dimensions"
        (dataframeDimensions df)
        (dataframeDimensions df')
    assertEqual "round trip data" df df'

tests :: [Test]
tests =
    [ toCsvBasic
    , toCsvEmpty
    , toSeparatedTab
    , toCsvDouble
    , toCsvSingleColumn
    , toCsvRoundTrip
    ]