content: {-# LANGUAGE OverloadedLists #-}
  {-# LANGUAGE OverloadedStrings #-}
  module Text.Seonbi.Html.ClipperSpec (spec) where
  
  import Control.Monad
  
  import Data.Text
  import Test.Hspec
  
  import Text.Seonbi.Html.Clipper
  import Text.Seonbi.Html.Entity
  import Text.Seonbi.Html.Tag
  
  spec :: Spec
  spec = do
      describe "clipPrefixText" $ do
          it "returns Nothing if entities are empty and a prefix is not empty" $
              clipPrefixText "foo" [] `shouldBe` Nothing
          it "returns Nothing if the first entity is not an HtmlText" $
              forM_ (["", "foo"] :: [Text]) $ \ prefix -> do
                  clipPrefixText prefix
                      [ HtmlStartTag [] P ""
                      , HtmlText [P] "foo"
                      , HtmlEndTag [] P
                      ] `shouldBe` Nothing
                  clipPrefixText prefix
                      [ HtmlComment [] "foo"
                      , HtmlStartTag [] P ""
                      , HtmlText [P] "foo"
                      , HtmlEndTag [] P
                      ] `shouldBe` Nothing
                  clipPrefixText prefix [HtmlEndTag [] P] `shouldBe` Nothing
                  clipPrefixText prefix [HtmlCdata [] "foo"] `shouldBe` Nothing
          it "returns Just [] if entities are empty and a prefix is empty too" $
              clipPrefixText "" [] `shouldBe` Just []
          it "returns entities with the prefix text dropped" $ do
              clipPrefixText "foo"
                  [ HtmlText [] "foobar"
                  , HtmlStartTag [] P ""
                  , HtmlText [P] "foo"
                  , HtmlEndTag [] P
                  ]
                  `shouldBe` Just
                      [ HtmlText [] "bar"
                      , HtmlStartTag [] P ""
                      , HtmlText [P] "foo"
                      , HtmlEndTag [] P
                      ]
              clipPrefixText "foo"
                  [ HtmlText [] "foo"
                  , HtmlStartTag [] P ""
                  , HtmlText [P] "foo"
                  , HtmlEndTag [] P
                  ]
                  `shouldBe` Just
                      [ HtmlStartTag [] P ""
                      , HtmlText [P] "foo"
                      , HtmlEndTag [] P
                      ]
          it "ignores HtmlComment entities but preseves them" $ do
              clipPrefixText "foo"
                  [ HtmlComment [] "comment"
                  , HtmlText [] "foobar"
                  , HtmlStartTag [] P ""
                  , HtmlText [P] "foo"
                  , HtmlEndTag [] P
                  ]
                  `shouldBe` Just
                      [ HtmlComment [] "comment"
                      , HtmlText [] "bar"
                      , HtmlStartTag [] P ""
                      , HtmlText [P] "foo"
                      , HtmlEndTag [] P
                      ]
              clipPrefixText "foo"
                  [ HtmlComment [] "comment"
                  , HtmlText [] "foo"
                  , HtmlStartTag [] P ""
                  , HtmlText [P] "foo"
                  , HtmlEndTag [] P
                  ]
                  `shouldBe` Just
                      [ HtmlComment [] "comment"
                      , HtmlStartTag [] P ""
                      , HtmlText [P] "foo"
                      , HtmlEndTag [] P
                      ]
  
      describe "clipSuffixText" $ do
          it "returns Nothing if entities are empty and a suffix is not empty" $
              clipSuffixText "foo" [] `shouldBe` Nothing
          it "returns Nothing if the last entity is not an HtmlText" $
              forM_ (["", "foo"] :: [Text]) $ \ suffix -> do
                  clipSuffixText suffix
                      [ HtmlStartTag [] P ""
                      , HtmlText [P] "foo"
                      , HtmlEndTag [] P
                      ] `shouldBe` Nothing
                  clipSuffixText suffix
                      [ HtmlStartTag [] P ""
                      , HtmlText [P] "foo"
                      , HtmlEndTag [] P
                      , HtmlComment [] "foo"
                      ] `shouldBe` Nothing
                  clipSuffixText suffix [HtmlEndTag [] P] `shouldBe` Nothing
                  clipSuffixText suffix [HtmlCdata [] "foo"] `shouldBe` Nothing
          it "returns Just [] if entities are empty and a suffix is empty too" $
              clipSuffixText "" [] `shouldBe` Just []
          it "returns entities with the suffix text dropped" $ do
              clipSuffixText "bar"
                  [ HtmlStartTag [] P ""
                  , HtmlText [P] "foo"
                  , HtmlEndTag [] P
                  , HtmlText [] "foobar"
                  ]
                  `shouldBe` Just
                      [ HtmlStartTag [] P ""
                      , HtmlText [P] "foo"
                      , HtmlEndTag [] P
                      , HtmlText [] "foo"
                      ]
              clipSuffixText "foo"
                  [ HtmlStartTag [] P ""
                  , HtmlText [P] "foo"
                  , HtmlEndTag [] P
                  , HtmlText [] "foo"
                  ]
                  `shouldBe` Just
                      [ HtmlStartTag [] P ""
                      , HtmlText [P] "foo"
                      , HtmlEndTag [] P
                      ]
          it "ignores HtmlComment entities but preseves them" $ do
              clipSuffixText "bar"
                  [ HtmlStartTag [] P ""
                  , HtmlText [P] "foo"
                  , HtmlEndTag [] P
                  , HtmlText [] "foobar"
                  , HtmlComment [] "comment"
                  ]
                  `shouldBe` Just
                      [ HtmlStartTag [] P ""
                      , HtmlText [P] "foo"
                      , HtmlEndTag [] P
                      , HtmlText [] "foo"
                      , HtmlComment [] "comment"
                      ]
              clipSuffixText "foo"
                  [ HtmlStartTag [] P ""
                  , HtmlText [P] "foo"
                  , HtmlEndTag [] P
                  , HtmlText [] "foo"
                  , HtmlComment [] "comment"
                  ]
                  `shouldBe` Just
                      [ HtmlStartTag [] P ""
                      , HtmlText [P] "foo"
                      , HtmlEndTag [] P
                      , HtmlComment [] "comment"
                      ]
  
      specify "clipText" $ do
          clipText "foo" "baz"
              [ HtmlText [] "foo"
              , HtmlStartTag [] P ""
              , HtmlText [P] "bar"
              , HtmlEndTag [] P
              , HtmlText [] "baz"
              ] `shouldBe` Just
                  [ HtmlStartTag [] P ""
                  , HtmlText [P] "bar"
                  , HtmlEndTag [] P
                  ]
          clipText "foo" "quux"
              [ HtmlText [] "foobar"
              , HtmlStartTag [] P ""
              , HtmlText [P] "baz"
              , HtmlEndTag [] P
              , HtmlText [] "quxquux"
              ] `shouldBe` Just
                  [ HtmlText [] "bar"
                  , HtmlStartTag [] P ""
                  , HtmlText [P] "baz"
                  , HtmlEndTag [] P
                  , HtmlText [] "qux"
                  ]
  