packages feed

karps-0.1.9.0: test/Spark/Core/SimpleExamplesSpec.hs

{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE QuasiQuotes #-}

-- Some small examples that get fully verified.
module Spark.Core.SimpleExamplesSpec where

import Data.Either(isRight)
import Data.Maybe(isJust)
import Test.Hspec
import qualified Data.Text as T
import Text.RawString.QQ

import Spark.Core.Dataset
import Spark.Core.Functions
import Spark.Core.Column
import Spark.Core.ColumnFunctions
import Spark.Core.Internal.DatasetStructures
import Spark.Core.Internal.Utilities(pretty)
import Spark.Core.Internal.OpFunctions(extraNodeOpData)

ds1 :: Dataset Int
ds1 = dataset [1,2,3]

ds2 :: Dataset Double
ds2 = error "ds2"

spec :: Spec
spec = do
  describe "Simple examples" $ do
    it "Precdence of renaming" $ do
      let numbers = asCol ds1
      let s = sumCol numbers
      let numCount = count ds1
      let avg = s `div` numCount @@ "myaverage"
      _cnName avg `shouldSatisfy` isJust
    it "name for simple integers" $ do
      let numbers = asCol ds1
      let s = sumCol numbers
      let numCount = count ds1
      let avg = s `div` numCount @@ "myaverage"
      -- TODO: should it show "value: int" instead?
      -- I think it should show it for distributed nodes only.
      -- SQL is not allowed on observables
      (show avg) `shouldBe` "/myaverage@org.spark.LocalDiv!int"
  describe "pack1" $ do
    it "Extracting and packing one column" $ do
      let numbers = asCol ds1
      let ds1' = pack1 numbers
      (nodeType ds1) `shouldBe` (nodeType ds1')
  describe "pack" $ do
    it "Extracting and packing one column" $ do
      let ds1' = pack' . asCol $ ds1
      (nodeType <$> (asDF ds1)) `shouldBe` (nodeType <$> ds1')
  describe "simple json example" $ do
    it "packing and unpacking one column" $ do
      let ds1' = pack' . asCol $ ds1
      let d' = pretty . extraNodeOpData . nodeOp <$> ds1'
      d' `shouldBe` Right (T.pack "{\"cellType\":{\"dt\":\"integer\",\"nullable\":false},\"content\":[1,2,3]}")
    it "packing and unpacking 2 columns, one with a bad name" $ do
      let col1 = asCol ds1
      let col2 = col1 @@ "other"
      let ds1' = pack' (col1, col2)
      ds1' `shouldSatisfy` isRight -- NOT SURE WHY IT WOULD FAIL
    it "packing and unpacking 2 columns, one with a good name" $ do
      let col1 = asCol ds1 @@ "first"
      let col2 = col1 @@ "second"
      let ds1' = pack' (col1, col2)
      ds1' `shouldSatisfy` isRight


    -- it "example2" $ do
    --   let numbers = asCol ds2
    --   let avg = (colSum numbers) / (count ds2)
    --   1 `shouldBe` 1