packages feed

libclang-bindings-0.1.0.0: test/Test/Version.hs

{-# LANGUAGE OverloadedStrings #-}
module Test.Version (tests) where

import Control.Monad
import Data.Text (Text)
import Test.Tasty
import Test.Tasty.HUnit

import Clang.Version

{-------------------------------------------------------------------------------
  List of tests
-------------------------------------------------------------------------------}

tests :: TestTree
tests = testGroup "Test.Version" [
      testCaseInfo "current"  testCurrent
    , testCase     "examples" testExamples
    ]

{-------------------------------------------------------------------------------
  Regression/sanity: test that we can parse specific version strings
-------------------------------------------------------------------------------}

testExamples :: Assertion
testExamples =
    forM_ examples $ \(str, expected) ->
      assertEqual (show str) expected $ parseClangVersion str
  where
    examples :: [(Text, ClangVersion)]
    examples = [
          ( "Ubuntu clang version 14.0.0-1ubuntu1.1"
          , ClangVersion (14, 0, 0)
          )
        , ( "Ubuntu clang version 18.1.3 (1ubuntu1)"
          , ClangVersion (18, 1, 3)
          )
        , ( "Ubuntu clang version 19.1.1 (1ubuntu1~24.04.2)"
          , ClangVersion (19, 1, 1)
          )
        , ( "clang version 14.0.6"
          , ClangVersion (14, 0, 6)
          )
        , ( "clang version 14.0.6 (git@github.com:llvm/llvm-project.git f28c006a5895fc0e329fe15fead81e37457cb1d1)"
          , ClangVersion (14, 0, 6)
          )
        , ( "clang version 18.1.8 (https://github.com/llvm/llvm-project.git ad36915a8c42d51218eee4b53f2c0aae80eb17e9)"
          , ClangVersion (18, 1, 8)
          )
        , ( "clang version 20.1.4 (https://github.com/llvm/llvm-project ec28b8f9cc7f2ac187d8a617a6d08d5e56f9120e)"
          , ClangVersion (20, 1, 4)
          )
        ]


{-------------------------------------------------------------------------------
  Check that we can parse the version string for whatever version we're running.
-------------------------------------------------------------------------------}

testCurrent :: IO String
testCurrent =
    case runtimeClangVersion of
      ClangVersionUnknown version ->
        assertFailure $ "Unknown version: " ++ show version
      ClangVersion version ->
        if plausible version
          then return $
            show runtimeClangVersionString ++ " parsed as " ++ show version
          else assertFailure $ "Unexpected clang version: " ++ show version

-- | Check whether the parsed @clang@ version is plausible
--
-- As an additional sanity check on the parser (that we don't parse the wrong
-- part of the version string as the clang version) we verify that the version
-- number is plausible.
plausible :: (Int, Int, Int) -> Bool
plausible version@(major, _minor, _patch) = or [
      version `elem` historicReleases

      -- For the current versions we don't know which minor/patch to expect
    , major `elem` [21, 22]
    ]

-- | Historic @llvm@ releases
--
-- See <https://releases.llvm.org/> (outdated), or
-- https://github.com/llvm/llvm-project/releases/.
historicReleases :: [(Int, Int, Int)]
historicReleases = [
      ( 21, 1, 0) -- 26 Aug 2025
    , ( 20, 1, 8) -- 08 Jul 2025
    , ( 20, 1, 7) -- 13 Jun 2025
    , ( 20, 1, 6) -- 28 May 2025
    , ( 20, 1, 5) -- 14 May 2025
    , ( 20, 1, 4) -- 30 Apr 2025
    , ( 20, 1, 3) -- 16 Apr 2025
    , ( 20, 1, 2) -- 02 Apr 2025
    , ( 20, 1, 1) -- 19 Mar 2025
    , ( 20, 1, 0) -- 04 Mar 2025
    , ( 19, 1, 7) -- 14 Jan 2025
    , ( 19, 1, 1) -- 01 Oct 2024
    , ( 19, 1, 0) -- 17 Sep 2024
    , ( 18, 1, 8) -- 20 Jun 2024
    , ( 18, 1, 7) -- 06 Jun 2024
    , ( 18, 1, 6) -- 18 May 2024
    , ( 18, 1, 5) -- 02 May 2024
    , ( 18, 1, 4) -- 17 Apr 2024
    , ( 18, 1, 3) -- 04 Apr 2024
    , ( 18, 1, 2) -- 19 Mar 2024
    , ( 18, 1, 1) -- 08 Mar 2024
    , ( 18, 1, 0) -- 05 Mar 2024
    , ( 17, 0, 6) -- 28 Nov 2023
    , ( 17, 0, 5) -- 14 Nov 2023
    , ( 17, 0, 4) -- 31 Oct 2023
    , ( 17, 0, 3) -- 17 Oct 2023
    , ( 17, 0, 2) -- 03 Oct 2023
    , ( 17, 0, 1) -- 09 Sep 2023
    , ( 16, 0, 6) -- 13 Jun 2023
    , ( 16, 0, 5) -- 02 Jun 2023
    , ( 16, 0, 4) -- 16 May 2023
    , ( 16, 0, 3) -- 03 May 2023
    , ( 16, 0, 2) -- 19 Apr 2023
    , ( 16, 0, 1) -- 05 Apr 2023
    , ( 16, 0, 0) -- 17 Mar 2023
    , ( 15, 0, 7) -- 12 Jan 2023
    , ( 15, 0, 6) -- 29 Nov 2022
    , ( 15, 0, 5) -- 16 Nov 2022
    , ( 15, 0, 4) -- 02 Nov 2022
    , ( 15, 0, 3) -- 18 Oct 2022
    , ( 15, 0, 2) -- 04 Oct 2022
    , ( 15, 0, 1) -- 20 Sep 2022
    , ( 15, 0, 0) -- 06 Sep 2022
    , ( 14, 0, 6) -- 24 Jun 2022
    , ( 14, 0, 5) -- 10 Jun 2022
    , ( 14, 0, 4) -- 24 May 2022
    , ( 14, 0, 3) -- 29 Apr 2022
    , ( 14, 0, 2) -- 26 Apr 2022
    , ( 14, 0, 1) -- 12 Apr 2022
    , ( 14, 0, 0) -- 25 Mar 2022
    , ( 13, 0, 1) -- 07 Feb 2022
    , ( 13, 0, 0) -- 04 Oct 2021
    , ( 12, 0, 1) -- 08 Jul 2021
    , ( 12, 0, 0) -- 14 Apr 2021
    , ( 11, 1, 0) -- 25 Feb 2021
    , ( 11, 0, 1) -- 14 Jan 2021
    , ( 11, 0, 0) -- 12 Oct 2020
    , ( 10, 0, 1) -- 06 Aug 2020
    , ( 10, 0, 0) -- 24 Mar 2020
    , (  9, 0, 1) -- 20 Dec 2019
    , (  9, 0, 0) -- 19 Sep 2019
    , (  8, 0, 1) -- 19 Jul 2019
    , (  7, 1, 0) -- 10 May 2019
    , (  8, 0, 0) -- 20 Mar 2019
    , (  7, 0, 1) -- 21 Dec 2018
    , (  7, 0, 0) -- 19 Sep 2018
    , (  6, 0, 1) -- 05 Jul 2018
    , (  5, 0, 2) -- 16 May 2018
    , (  6, 0, 0) -- 08 Mar 2018
    , (  5, 0, 1) -- 21 Dec 2017
    , (  5, 0, 0) -- 07 Sep 2017
    , (  4, 0, 1) -- 04 Jul 2017
    , (  4, 0, 0) -- 13 Mar 2017
    , (  3, 9, 1) -- 23 Dec 2016
    , (  3, 9, 0) -- 02 Sep 2016
    , (  3, 8, 1) -- 11 Jul 2016
    , (  3, 8, 0) -- 08 Mar 2016
    , (  3, 7, 1) -- 05 Jan 2016
    , (  3, 7, 0) -- 01 Sep 2015
    , (  3, 6, 2) -- 16 Jul 2015
    , (  3, 6, 1) -- 26 May 2015
    , (  3, 6, 0) -- 27 Feb 2015
    , (  3, 5, 2) -- 02 Apr 2015
    , (  3, 5, 1) -- 20 Jan 2015
    , (  3, 5, 0) -- 03 Sep 2014
    , (  3, 4, 2) -- 19 Jun 2014
    , (  3, 4, 1) -- 07 May 2014
    , (  3, 4, 0) -- 02 Jan 2014
    , (  3, 3, 0) -- 17 Jun 2013
    , (  3, 2, 0) -- 20 Dec 2012
    , (  3, 1, 0) -- 22 May 2012
    , (  3, 0, 0) -- 01 Dec 2011
    , (  2, 9, 0) -- 06 Apr 2011
    , (  2, 8, 0) -- 05 Oct 2010
    , (  2, 7, 0) -- 27 Apr 2010
    , (  2, 6, 0) -- 23 Oct 2009
    , (  2, 5, 0) -- 02 Mar 2009
    , (  2, 4, 0) -- 09 Nov 2008
    , (  2, 3, 0) -- 09 Jun 2008
    , (  2, 2, 0) -- 11 Feb 2008
    , (  2, 1, 0) -- 26 Sep 2007
    , (  2, 0, 0) -- 23 May 2007
    , (  1, 9, 0) -- 19 Nov 2006
    , (  1, 8, 0) -- 09 Aug 2006
    , (  1, 7, 0) -- 20 Apr 2006
    , (  1, 6, 0) -- 08 Nov 2005
    , (  1, 5, 0) -- 18 May 2005
    , (  1, 4, 0) -- 09 Dec 2004
    , (  1, 3, 0) -- 13 Aug 2004
    , (  1, 2, 0) -- 19 Mar 2004
    , (  1, 1, 0) -- 17 Dec 2003
    , (  1, 0, 0) -- 24 Oct 2003
    ]