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