diff --git a/src/Session.hs b/src/Session.hs index d66c4cb4..fb4d1ec7 100644 --- a/src/Session.hs +++ b/src/Session.hs @@ -20,7 +20,9 @@ module Session ( , hasSpec , hasHspecCommandSignature , hspecCommand +, Extract(..) , extractSummary +, ansiShowCursor #endif ) where @@ -123,16 +125,21 @@ isSuccess = not . isFailure extractSummary :: Extract Summary extractSummary = Extract { isPartialMessage = partialMessageStartsWithOneOf [summaryPrefix, ansiShowCursor <> summaryPrefix] -, parseMessage = fmap (flip (,) "") . parseSummary +, parseMessage } where summaryPrefix :: ByteString summaryPrefix = "Summary {" + parseMessage :: ByteString -> Maybe (Summary, ByteString) + parseMessage input = case ByteString.stripPrefix ansiShowCursor input of + Nothing -> flip (,) "" <$> parseSummary input + Just i -> flip (,) ansiShowCursor <$> parseSummary i + parseSummary :: ByteString -> Maybe Summary parseSummary = readMaybe . decodeUtf8 . stripAnsiShowCursor - ansiShowCursor :: ByteString - ansiShowCursor = "\ESC[?25h" - stripAnsiShowCursor :: ByteString -> ByteString stripAnsiShowCursor input = fromMaybe input $ ByteString.stripPrefix ansiShowCursor input + +ansiShowCursor :: ByteString +ansiShowCursor = "\ESC[?25h" diff --git a/test/SessionSpec.hs b/test/SessionSpec.hs index 2f0e5d94..58cefd14 100644 --- a/test/SessionSpec.hs +++ b/test/SessionSpec.hs @@ -88,3 +88,18 @@ spec = do withSession [name, "--no-color", "-m", "foo"] $ \session -> do _ <- runSpec session >> runSpec session hspecPreviousSummary session `shouldReturn` Just (Summary 1 0) + + describe "extractSummary" $ do + let + summary :: Summary + summary = Summary 0 0 + + input :: ByteString + input = fromString $ show summary + + it "extracts summary" $ do + extractSummary.parseMessage input `shouldBe` Just (summary, "") + + context "when the input starts with the ANSI \"show cursor\"-sequence" $ do + it "extracts summary" $ do + extractSummary.parseMessage (ansiShowCursor <> input) `shouldBe` Just (summary, ansiShowCursor)