module HPCThresholdSpec where import Test.Hspec import qualified Control.Exception as E import qualified Control.DeepSeq as D import HPCThreshold spec :: Spec spec = do describe "Threshold" $ it "should be parsable from string" $ do let threshold = Threshold "abc" "(\\d+)% abc" 80 (read . show) threshold `shouldBe` threshold describe "extractCoverage" $ do it "should fail with invalid regexStr" $ (E.evaluate . D.force) (extractCoverage "irrelevant" "ab(c") `shouldThrow` anyErrorCall it "should return 0 for regex with no digit capture" $ extractCoverage "12% abc" "abc" `shouldBe` 0 it "should return 0 if input string does not match regex" $ extractCoverage "12% abc" "(\\d+) abc" `shouldBe` 0 it "should capture the coverage" $ extractCoverage "12% abc" "(\\d+)% abc" `shouldBe` 12 describe "evaluate" $ do let threshold = Threshold "abc" "(\\d+)% abc" 80 it "should correctly evaluate coverage < threshold as FAIL" $ evaluate "10% abc" threshold `shouldBe` (threshold, 10, False) it "should correctly evaluate coverage == threshold as PASS" $ evaluate "80% abc" threshold `shouldBe` (threshold, 80, True) it "should correctly evaluate coverage > threshold as PASS" $ evaluate "100% abc" threshold `shouldBe` (threshold, 100, True) describe "reportThreshold" $ do it "should print passing result correctly" $ do let evalResult = (Threshold "abc" "(\\d+)% abc" 80, 80, True) reportThreshold evalResult `shouldBe` "✓ abc: 80.0% (≥ 80.0%)" it "should print failing result correctly" $ do let evalResult = (Threshold "abc" "(\\d+)% abc" 80, 70, False) reportThreshold evalResult `shouldBe` "· abc: 70.0% (< 80.0%)" describe "evaluateAndReport" $ do let thresholds = [ Threshold "abc" "(\\d+)% abc" 80 , Threshold "def" "(\\d+)% def" 80 ] it "should report passing result correctly" $ evaluateAndReport "80% abc -- 80% def" thresholds `shouldBe` ( unlines [ "Code coverage threshold check: PASS" , "✓ abc: 80.0% (≥ 80.0%)" , "✓ def: 80.0% (≥ 80.0%)" ] , True ) it "should report failing result correctly" $ evaluateAndReport "70% abc -- 80% def" thresholds `shouldBe` ( unlines [ "Code coverage threshold check: FAIL" , "· abc: 70.0% (< 80.0%)" , "✓ def: 80.0% (≥ 80.0%)" ] , False )