module Hydra.Sources.Tier4.Test.Lib.Strings (stringPrimitiveTests) where

import Hydra.Dsl.Tests


stringPrimitiveTests :: TestGroup
stringPrimitiveTests :: TestGroup
stringPrimitiveTests = String -> Maybe String -> [TestGroup] -> [TestCase] -> TestGroup
TestGroup String
"hydra/lib/strings primitives" Maybe String
forall a. Maybe a
Nothing [TestGroup]
groups []
  where
    groups :: [TestGroup]
groups = [TestGroup
stringsCat, TestGroup
stringsLength, TestGroup
stringsSplitOn, TestGroup
stringsToLower, TestGroup
stringsToUpper]

stringsCat :: TestGroup
stringsCat :: TestGroup
stringsCat = String -> Maybe String -> [TestGroup] -> [TestCase] -> TestGroup
TestGroup String
"cat" Maybe String
forall a. Maybe a
Nothing [] [
    [String] -> String -> TestCase
test [String
"one", String
"two", String
"three"] String
"onetwothree",
    [String] -> String -> TestCase
test [String
"", String
"one", String
"", String
""] String
"one",
    [String] -> String -> TestCase
test [] String
""]
  where
    test :: [String] -> String -> TestCase
test [String]
ls String
result = Name -> [Term] -> Term -> TestCase
primCase Name
_strings_cat [[Term] -> Term
list (String -> Term
string (String -> Term) -> [String] -> [Term]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [String]
ls)] (String -> Term
string String
result)

stringsLength :: TestGroup
stringsLength :: TestGroup
stringsLength = String -> Maybe String -> [TestGroup] -> [TestCase] -> TestGroup
TestGroup String
"length" Maybe String
forall a. Maybe a
Nothing [] [
    String -> Int -> TestCase
test String
"" Int
0,
    String -> Int -> TestCase
test String
"a" Int
1,
    String -> Int -> TestCase
test String
"one" Int
3]
  where
    test :: String -> Int -> TestCase
test String
s Int
result = Name -> [Term] -> Term -> TestCase
primCase Name
_strings_length [String -> Term
string String
s] (Int -> Term
int32 Int
result)

stringsSplitOn :: TestGroup
stringsSplitOn :: TestGroup
stringsSplitOn = String -> Maybe String -> [TestGroup] -> [TestCase] -> TestGroup
TestGroup String
"splitOn" Maybe String
forall a. Maybe a
Nothing [] [
    String -> String -> [String] -> TestCase
test String
"ss" String
"Mississippi" [String
"Mi", String
"i", String
"ippi"],
    String -> String -> [String] -> TestCase
test String
"Mississippi" String
"Mississippi" [String
"", String
""],

    String -> String -> [String] -> TestCase
test String
" " String
"one two three" [String
"one", String
"two", String
"three"],
    String -> String -> [String] -> TestCase
test String
" " String
" one two three " [String
"", String
"one", String
"two", String
"three", String
""],
    String -> String -> [String] -> TestCase
test String
" " String
"  one two three" [String
"", String
"", String
"one", String
"two", String
"three"],
    String -> String -> [String] -> TestCase
test String
"  " String
"  one two three" [String
"", String
"one two three"],

    String -> String -> [String] -> TestCase
test String
"aa" String
"aaa" [String
"", String
"a"],

    String -> String -> [String] -> TestCase
test String
"a" String
"" [String
""],

    String -> String -> [String] -> TestCase
test String
"" String
"abc" [String
"", String
"a", String
"b", String
"c"],
    String -> String -> [String] -> TestCase
test String
"" String
"" [String
""]]
  where
    test :: String -> String -> [String] -> TestCase
test String
s0 String
s1 [String]
result = Name -> [Term] -> Term -> TestCase
primCase Name
_strings_splitOn [String -> Term
string String
s0, String -> Term
string String
s1] ([Term] -> Term
list (String -> Term
string (String -> Term) -> [String] -> [Term]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [String]
result))

stringsToLower :: TestGroup
stringsToLower :: TestGroup
stringsToLower = String -> Maybe String -> [TestGroup] -> [TestCase] -> TestGroup
TestGroup String
"toLower" Maybe String
forall a. Maybe a
Nothing [] [
    String -> String -> TestCase
test String
"One TWO threE" String
"one two three",
    String -> String -> TestCase
test String
"Abc123" String
"abc123"]
  where
    test :: String -> String -> TestCase
test String
s String
result = Name -> [Term] -> Term -> TestCase
primCase Name
_strings_toLower [String -> Term
string String
s] (String -> Term
string String
result)

stringsToUpper :: TestGroup
stringsToUpper :: TestGroup
stringsToUpper = String -> Maybe String -> [TestGroup] -> [TestCase] -> TestGroup
TestGroup String
"toUpper" Maybe String
forall a. Maybe a
Nothing [] [
    String -> String -> TestCase
test String
"One TWO threE" String
"ONE TWO THREE",
    String -> String -> TestCase
test String
"Abc123" String
"ABC123"]
  where
    test :: String -> String -> TestCase
test String
s String
result = Name -> [Term] -> Term -> TestCase
primCase Name
_strings_toUpper [String -> Term
string String
s] (String -> Term
string String
result)