content: module Test.StyleSpec (spec) where
  
  import Skeletest
  import Web.Atomic.CSS
  import Web.Atomic.Types
  import Prelude hiding (span)
  
  
  spec :: Spec
  spec = do
    mainSpec
    selectorSpec
  
  
  mainSpec :: Spec
  mainSpec = do
    describe "PropertyStyle" $ do
      it "should compile, and set both the className and styles" $ do
        let rs = rules $ list Decimal
        length rs `shouldBe` 1
        [c] <- pure rs
        ruleClassName c `shouldBe` ClassName "list-decimal"
        ruleSelector c `shouldBe` ".list-decimal"
        c.properties `shouldBe` ["list-style-type" :. "decimal"]
  
      it "should work with outside member None" $ do
        let rs = rules $ list None
        length rs `shouldBe` 1
        [c] <- pure rs
        ruleClassName c `shouldBe` ClassName "list-none"
        ruleSelector c `shouldBe` ".list-none"
        c.properties `shouldBe` ["list-style-type" :. "none"]
  
    describe "PxRem" $ do
      it "uses absolutes for 0,1" $ do
        style (PxRem 0) `shouldBe` "0px"
        style (PxRem 16) `shouldBe` "1.000rem"
  
      it "uses rem for others" $ do
        style (PxRem 2) `shouldBe` "0.125rem"
        style (PxRem 10) `shouldBe` "0.625rem"
        style (PxRem 16) `shouldBe` "1.000rem"
  
    describe "Length" $ do
      it "styles pct" $ do
        style (Pct (1 / 3)) `shouldBe` "33.3%"
  
      it "adds values" $ do
        style (PxRem 6 + PxRem 10) `shouldBe` "1.000rem"
  
    describe "Align" $ do
      it "should produce correct style values" $ do
        style AlignCenter `shouldBe` "center"
        style AlignJustify `shouldBe` "justify"
  
    describe "ToClassName" $ do
      it "should hyphenate classnames" $ do
        "woot" -. None `shouldBe` "woot-none"
  
      it "should not hyphenate with empty suffix" $ do
        "woot" -. () `shouldBe` "woot"
  
      it "should escape classNames" $ do
        className "hello.woot-hi" `shouldBe` ClassName "hello-woot-hi"
  
    describe "Colors" $ do
      it "correct styleValue independent of leading slash" $ do
        style (HexColor "#FFF") `shouldBe` Style "#FFF"
        style (HexColor "FFF") `shouldBe` Style "#FFF"
        style ("FFF" :: HexColor) `shouldBe` Style "#FFF"
        style ("#FFF" :: HexColor) `shouldBe` Style "#FFF"
  
      it "correct className independent of leading slash" $ do
        toClassName (HexColor "#FFF") `shouldBe` "fff"
        toClassName (HexColor "FFF") `shouldBe` "fff"
        toClassName ("FFF" :: HexColor) `shouldBe` "fff"
        toClassName ("#FFF" :: HexColor) `shouldBe` "fff"
  
      it "works with custom colors" $ do
        style (colorValue Danger) `shouldBe` Style "#F00"
        style (colorValue Warning) `shouldBe` Style "#FF0"
  
    describe "Styleable" $ do
      it "applies styles" $ do
        let rs :: [Rule] = [] ~ bold . fontSize 24
        fmap (.className) rs `shouldBe` ["bold", "fs-24"]
  
      it "writes in composition order" $ do
        let rs :: [Rule] = [] ~ bold . fontSize 12 . italic
        fmap (.className) rs `shouldBe` ["bold", "fs-12", "italic"]
  
      it "overrides in operator order" $ do
        let rs :: [Rule] = [] ~ bold . fontSize 12 ~ italic
        fmap (.className) rs `shouldBe` ["italic", "bold", "fs-12"]
  
    describe "External Classes" $ do
      it "adds external classes" $ do
        let CSS rs = CSS [] ~ cls "external"
        rs `shouldBe` [Rule "external" mempty mempty []]
        fmap (.className) rs `shouldBe` ["external"]
  
  
  selectorSpec :: Spec
  selectorSpec = do
    describe "Selector" $ do
      it "normal selector" $ do
        selector "myclass" `shouldBe` Selector ".myclass"
  
      it "escapes colons" $ do
        selector "hover:bold" `shouldBe` Selector ".hover\\:bold"
  
  
  data AppColor
    = Danger
    | Warning
    deriving (Show, Eq)
  
  
  instance ToColor AppColor where
    colorValue Danger = "#F00"
    colorValue Warning = "FF0"
  