content: {-# LANGUAGE RecordWildCards #-}
  
  module Ormolu.Integration.FixitySpec (spec) where
  
  import Control.Monad (forM_)
  import Ormolu.Integration.Utils (getFourmoluExe, readProcess)
  import System.Directory (copyFile)
  import System.IO.Temp (withSystemTempDirectory)
  import Test.Hspec
  
  -- | Tests for the `fixity-tests/` directory Ormolu implemented, converted
  -- from nix tests to hspec tests.
  spec :: Spec
  spec =
    describe "fixity-tests" . beforeAll getFourmoluExe $
      forM_ tests $ \Test {..} ->
        specify testLabel $ \fourmoluExe ->
          withSystemTempDirectory "fixity-test-dir" $ \tmpdir -> do
            let configFile = tmpdir ++ "/fourmolu.yaml"
                srcFile = tmpdir ++ "/input.hs"
  
            copyFile ("fixity-tests/" ++ testInputFileName) srcFile
  
            -- extend fourmolu.yaml to keep same formatting as Ormolu
            rootConfig <- readFile "fourmolu.yaml"
            writeFile configFile $
              if testUseConfig
                then
                  unlines
                    [ rootConfig,
                      -- add information in the original `fixity-tests/.ormolu` file
                      "fixities:",
                      "- 'infixr 8 .='",
                      "- 'infixr 5 #, :>'",
                      "reexports:",
                      "- 'module Foo exports Control.Lens'"
                    ]
                else rootConfig
  
            actual <-
              readProcess fourmoluExe . concat $
                [ [srcFile, "--check-idempotence"],
                  testArgs,
                  if testUseConfig then [] else ["--no-cabal"]
                ]
            expected <- readFile $ "fixity-tests/" ++ testExpectedFileName
            actual `shouldBe` expected
  
  data Test = Test
    { testLabel :: String,
      testInputFileName :: FilePath,
      testArgs :: [String],
      testUseConfig :: Bool,
      testExpectedFileName :: FilePath
    }
  
  tests :: [Test]
  tests =
    [ Test
        { testLabel = "File #0 works with no extra info",
          testInputFileName = "test-0-input.hs",
          testArgs = [],
          testUseConfig = False,
          testExpectedFileName = "test-0-ugly-expected.hs"
        },
      Test
        { testLabel = "File #0 works with manual fixity info",
          testInputFileName = "test-0-input.hs",
          testArgs = ["--fixity", "infixr 8 .=", "--fixity", "infixr 5 :>"],
          testUseConfig = False,
          testExpectedFileName = "test-0-with-fixity-info-expected.hs"
        },
      Test
        { testLabel = "File #0 works with fixity info from config",
          testInputFileName = "test-0-input.hs",
          testArgs = ["--package", "base"],
          testUseConfig = True,
          testExpectedFileName = "test-0-with-fixity-info-expected.hs"
        },
      Test
        { testLabel = "File #0 works when CLI overrides .ormolu",
          testInputFileName = "test-0-input.hs",
          testArgs = ["--package", "base", "--fixity", "infixr 5 .=", "--no-cabal"],
          testUseConfig = True,
          testExpectedFileName = "test-0-ugly-expected.hs"
        },
      Test
        { testLabel = "File #1 works with no extra info",
          testInputFileName = "test-1-input.hs",
          testArgs = [],
          testUseConfig = False,
          testExpectedFileName = "test-1-no-extra-info-expected.hs"
        },
      Test
        { testLabel = "File #1 works with manual fixity info",
          testInputFileName = "test-1-input.hs",
          testArgs = ["--fixity", "infixr 8 .=", "--fixity", "infixr 5 #"],
          testUseConfig = False,
          testExpectedFileName = "test-1-with-fixity-info-expected.hs"
        },
      Test
        { testLabel = "File #1 works with fixity info from config",
          testInputFileName = "test-1-input.hs",
          testArgs = ["--package", "base"],
          testUseConfig = True,
          testExpectedFileName = "test-1-with-fixity-info-expected.hs"
        },
      Test
        { testLabel = "File #1 works with weird fixity info overwrite",
          testInputFileName = "test-1-input.hs",
          testArgs = ["--package", "base", "--fixity", "infixr 5 $"],
          testUseConfig = True,
          testExpectedFileName = "test-1-with-fixity-info-weird-overwrite-expected.hs"
        },
      Test
        { testLabel = "File #2 works with no extra info",
          testInputFileName = "test-2-input.hs",
          testArgs = ["--package", "base", "--package", "lens"],
          testUseConfig = False,
          testExpectedFileName = "test-2-no-extra-info-expected.hs"
        },
      Test
        { testLabel = "File #2 works with manual reexport info",
          testInputFileName = "test-2-input.hs",
          testArgs = ["--package", "base", "--package", "lens", "--reexport", "module Foo exports Control.Lens"],
          testUseConfig = False,
          testExpectedFileName = "test-2-with-reexports-expected.hs"
        },
      Test
        { testLabel = "File #2 works with fixity info from config",
          testInputFileName = "test-2-input.hs",
          testArgs = ["--package", "base", "--package", "lens"],
          testUseConfig = True,
          testExpectedFileName = "test-2-with-reexports-expected.hs"
        }
    ]
  