packages feed

yamlscript-0.2.26.0: test/YAMLScript/Tests.hs

-- Copyright 2022-2026 Ingy döt Net
-- This code is licensed under MIT license (See License for details)

{-# LANGUAGE OverloadedStrings #-}

module YAMLScript.Tests where

import Test.Hspec
import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Key as Key
import qualified Data.Aeson.KeyMap as KeyMap
import qualified Data.Vector as V
import YAMLScript

-- | Test basic YAML functionality
basicTests :: Spec
basicTests = describe "Basic YAML" $ do
  it "parses simple key-value pairs" $ do
    result <- loadYAMLScript "key: value"
    result `shouldBe` Aeson.object
      [("data", Aeson.object [("key", Aeson.String "value")])]

  it "parses lists" $ do
    result <- loadYAMLScript "list: [1, 2, 3]"
    result `shouldBe` Aeson.object
      [ ("data", Aeson.object
          [ ("list", Aeson.Array $ V.fromList
              [Aeson.Number 1, Aeson.Number 2, Aeson.Number 3])
          ])
      ]

  it "parses nested objects" $ do
    result <- loadYAMLScript "nested:\n  key: value"
    result `shouldBe` Aeson.object
      [ ("data", Aeson.object
          [ ("nested", Aeson.object [("key", Aeson.String "value")])
          ])
      ]

-- | Test YAMLScript functionality
yamlscriptTests :: Spec
yamlscriptTests = describe "YAMLScript Features" $ do
  it "evaluates arithmetic expressions" $ do
    result <- loadYAMLScript "!ys-0\nadd(2, 3)"
    result `shouldBe` Aeson.object [("data", Aeson.Number 5)]

  it "evaluates function calls" $ do
    result <- loadYAMLScript "!ys-0\ninc(41)"
    result `shouldBe` Aeson.object [("data", Aeson.Number 42)]

-- | Test error handling
errorTests :: Spec
errorTests = describe "Error Handling" $ do
  it "returns error on invalid YAMLScript" $ do
    result <- loadYAMLScript "!ys-0\ninvalid: syntax"
    case result of
      Aeson.Object obj -> case KeyMap.lookup (Key.fromString "error") obj of
        Just _ -> return () -- Error present, test passes
        Nothing -> expectationFailure "Expected error response"
      _ -> expectationFailure "Expected JSON object"

  it "throws on missing file" $ do
    (loadYAMLScriptFile "nonexistent.ys") `shouldThrow` anyException