/ nix / script / exe / test-tools.hs
test-tools.hs
  1  #!/usr/bin/env runghc
  2  {-# LANGUAGE OverloadedStrings #-}
  3  
  4  {- | Test all generated tool wrappers
  5  
  6  Run: nix-shell -p "haskellPackages.ghcWithPackages (p: [p.megaparsec p.text p.shelly p.aeson p.foldl])" \
  7         bat fd ripgrep delta deadnix dust hyperfine statix stylua taplo tokei zoxide \
  8         --run "runghc -i. test-tools.hs"
  9  -}
 10  module Main where
 11  
 12  import Data.Text (Text)
 13  import qualified Data.Text as T
 14  import Shelly
 15  
 16  import qualified Aleph.Script.Tools.Bat as Bat
 17  import qualified Aleph.Script.Tools.Deadnix as Deadnix
 18  import qualified Aleph.Script.Tools.Delta as Delta
 19  import qualified Aleph.Script.Tools.Dust as Dust
 20  import qualified Aleph.Script.Tools.Fd as Fd
 21  import qualified Aleph.Script.Tools.Hyperfine as Hyperfine
 22  import qualified Aleph.Script.Tools.Rg as Rg
 23  import qualified Aleph.Script.Tools.Stylua as Stylua
 24  import qualified Aleph.Script.Tools.Tokei as Tokei
 25  
 26  -- GNU tools
 27  
 28  import qualified Aleph.Script.Tools.Grep as Grep
 29  import qualified Aleph.Script.Tools.Ls as Ls
 30  import qualified Aleph.Script.Tools.Tar as Tar
 31  
 32  main :: IO ()
 33  main = shelly $ verbosely $ do
 34      echo "=== Testing Aleph.Script.Tools ==="
 35      echo ""
 36  
 37      -- Test Rg (ripgrep)
 38      echo ">>> Rg: searching for 'module' in .hs files..."
 39      rgOut <-
 40          Rg.rg
 41              Rg.defaults
 42                  { Rg.glob = Just "*.hs"
 43                  , Rg.maxCount = Just 1 -- limit to 1 match per file
 44                  }
 45              "^module"
 46              ["."]
 47      echo $ "Found " <> tshow (length (T.lines rgOut)) <> " modules"
 48      echo ""
 49  
 50      -- Test Fd (find)
 51      echo ">>> Fd: finding .hs files..."
 52      hsFiles <-
 53          Fd.fd
 54              Fd.defaults
 55                  { Fd.extension = Just "hs"
 56                  }
 57              Nothing
 58              ["."]
 59      echo $ "Found " <> tshow (length hsFiles) <> " Haskell files"
 60      echo ""
 61  
 62      -- Test Tokei (code stats)
 63      echo ">>> Tokei: counting lines of code..."
 64      tokeiOut <-
 65          Tokei.tokei
 66              Tokei.defaults
 67                  { Tokei.output = Just "json"
 68                  }
 69              ["."]
 70      echo $ "Tokei output length: " <> tshow (T.length tokeiOut) <> " chars"
 71      echo ""
 72  
 73      -- Test Dust (disk usage)
 74      echo ">>> Dust: checking disk usage of corpus/..."
 75      dustOut <-
 76          errExit False $
 77              Dust.dust
 78                  Dust.defaults
 79                      { Dust.depth = Just "1"
 80                      , Dust.apparentSize = True
 81                      }
 82                  ["corpus"]
 83      echo $ "Dust output: " <> tshow (length (T.lines dustOut)) <> " lines"
 84      echo ""
 85  
 86      -- Test Bat (syntax highlighting) - just verify it runs
 87      echo ">>> Bat: displaying first 5 lines of this script..."
 88      batOut <-
 89          Bat.bat
 90              Bat.defaults
 91                  { Bat.lineRange = Just "1:5"
 92                  , Bat.plain = True -- no decorations for easier parsing
 93                  }
 94              ["test-tools.hs"]
 95      echo batOut
 96      echo ""
 97  
 98      -- Test Hyperfine (benchmarking)
 99      echo ">>> Hyperfine: benchmarking 'echo hello'..."
100      _ <-
101          errExit False $
102              Hyperfine.hyperfine
103                  Hyperfine.defaults
104                      { Hyperfine.runs = Just 3
105                      , Hyperfine.warmup = Just 1
106                      }
107                  ["echo hello"]
108      echo "Hyperfine ran successfully"
109      echo ""
110  
111      -- Test Deadnix (dead Nix code finder)
112      echo ">>> Deadnix: checking flake.nix for dead code..."
113      dnOut <-
114          errExit False $
115              Deadnix.deadnix
116                  Deadnix.defaults
117                      { Deadnix.quiet = True
118                      }
119                  ["../../flake.nix"]
120      echo $ "Deadnix output: " <> tshow (length (T.lines dnOut)) <> " lines"
121      echo ""
122  
123      -- ========================================
124      -- GNU Tools
125      -- ========================================
126  
127      echo "=== Testing GNU Tools ==="
128      echo ""
129  
130      -- Test Ls (list directory)
131      echo ">>> Ls: listing directory with long format..."
132      lsOut <-
133          Ls.ls
134              Ls.defaults
135                  { Ls.optL = True -- -l long format
136                  , Ls.humanReadable = True
137                  }
138              ["."]
139      echo $ "Listed " <> tshow (length (T.lines lsOut)) <> " entries"
140      echo ""
141  
142      -- Test Grep (pattern matching)
143      echo ">>> Grep: searching for 'module' in .hs files..."
144      grepOut <-
145          errExit False $
146              Grep.grep
147                  Grep.defaults
148                      { Grep.recursive = True
149                      , Grep.lineNumber = True
150                      }
151                  ["module", "Weyl/Script.hs"]
152      echo $ "Grep found " <> tshow (length (T.lines grepOut)) <> " matches"
153      echo ""
154  
155      -- Test Tar (just list, don't create)
156      echo ">>> Tar: creating and listing a test archive..."
157      -- Create a simple test archive
158      _ <- errExit False $ run_ "tar" ["cf", "/tmp/test-tools-archive.tar", "Weyl/Script.hs"]
159      tarOut <-
160          Tar.tar
161              Tar.defaults
162                  { Tar.list = True
163                  , Tar.verbose = True
164                  , Tar.file = Just "/tmp/test-tools-archive.tar"
165                  }
166              []
167      echo $ "Tar archive contains: " <> tarOut
168      -- Clean up
169      _ <- errExit False $ run_ "rm" ["/tmp/test-tools-archive.tar"]
170      echo ""
171  
172      echo "=== All tools working! ==="
173  
174  tshow :: (Show a) => a -> Text
175  tshow = T.pack . show