packages feed

granite-0.7.3.0: test/FlameSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module FlameSpec (spec) where

import Data.Text qualified as Text

import Granite.Flame
import Test.Hspec

-- A 3-level tree: a root with two children, one of which has a child. Mixes
-- increases (fnPos) and decreases (fnNeg) so both colours must appear.
sampleTree :: FlameNode
sampleTree =
    FlameNode
        { fnLabel = "root"
        , fnPos = 9.0e6
        , fnNeg = 7.0e6
        , fnChildren =
            [ FlameNode
                { fnLabel = "Parse.parseModule"
                , fnPos = 8.0e6
                , fnNeg = 2.0e6
                , fnChildren =
                    [ FlameNode "lexer" 1.0e6 3.0e6 []
                    ]
                }
            , FlameNode "Typecheck.check" 1.0e6 5.0e6 []
            ]
        }

spec :: Spec
spec = describe "Granite.Flame.flameDiff" $ do
    let svg = flameDiff sampleTree defFlameOpts

    it "emits a standalone <svg> document" $ do
        svg `shouldSatisfy` Text.isInfixOf "<svg"
        svg `shouldSatisfy` Text.isInfixOf "viewBox"
        svg `shouldSatisfy` Text.isInfixOf "</svg>"

    it "draws both red (increase) and blue (decrease) rects" $ do
        svg `shouldSatisfy` Text.isInfixOf "#ce50"
        svg `shouldSatisfy` Text.isInfixOf "#5064ce"

    it "carries a <title> tooltip with the full label and pos/neg detail" $ do
        svg `shouldSatisfy` Text.isInfixOf "<title>"
        svg `shouldSatisfy` Text.isInfixOf "Parse.parseModule"
        svg `shouldSatisfy` Text.isInfixOf "MB"

    it "renders the title heading" $ do
        flameDiff sampleTree defFlameOpts{foTitle = "My flame"}
            `shouldSatisfy` Text.isInfixOf "My flame"