Preliminary support for generating test vectors.

This commit is contained in:
2019-08-15 20:24:04 -07:00
parent f4a3cf69ad
commit 4ae957aac6
7 changed files with 34 additions and 26 deletions

View File

@@ -11,7 +11,8 @@ base :: File
base = File {
predicate = \ _ _ -> True,
outputName = "base",
generator = declareBaseStructure
generator = declareBaseStructure,
testGenerator = Nothing
}
declareBaseStructure :: Word -> Gen ()

View File

@@ -11,7 +11,8 @@ binaryOps :: File
binaryOps = File {
predicate = \ _ _ -> True,
outputName = "binary",
generator = declareBinaryOperators
generator = declareBinaryOperators,
testGenerator = Nothing
}
declareBinaryOperators :: Word -> Gen ()

View File

@@ -9,7 +9,8 @@ comparisons :: File
comparisons = File {
predicate = \ _ _ -> True,
outputName = "compare",
generator = declareComparators
generator = declareComparators,
testGenerator = Nothing
}
declareComparators :: Word -> Gen ()

View File

@@ -11,7 +11,8 @@ conversions :: File
conversions = File {
predicate = \ _ _ -> True,
outputName = "conversions",
generator = declareConversions
generator = declareConversions,
testGenerator = Nothing
}
declareConversions :: Word -> Gen ()

View File

@@ -11,7 +11,8 @@ cryptoNum :: File
cryptoNum = File {
predicate = \ _ _ -> True,
outputName = "cryptonum",
generator = declareCryptoNumInstance
generator = declareCryptoNumInstance,
testGenerator = Nothing
}
declareCryptoNumInstance :: Word -> Gen ()

View File

@@ -2,7 +2,7 @@ module File(
File(..),
Task(..),
addModuleTasks,
makeTask
makeTasks
)
where
@@ -15,7 +15,8 @@ import System.FilePath(takeBaseName,takeDirectory,takeFileName,(</>))
data File = File {
predicate :: Word -> [Word] -> Bool,
outputName :: FilePath,
generator :: Word -> Gen ()
generator :: Word -> Gen (),
testGenerator :: Maybe (Word -> Gen ())
}
data Task = Task {
@@ -23,18 +24,18 @@ data Task = Task {
fileGenerator :: Gen ()
}
makeTask :: FilePath ->
makeTasks :: FilePath -> FilePath ->
Word -> [Word] ->
File ->
Maybe Task
makeTask base size allSizes file
[Task]
makeTasks srcBase testBase size allSizes file
| predicate file size allSizes =
Just Task {
outputFile = base </> ("u" ++ show size) </> outputName file <> ".rs",
fileGenerator = generator file size
}
| otherwise =
Nothing
let base = Task (srcBase </> ("u" ++ show size) </> outputName file <> ".rs") (generator file size)
in case testGenerator file of
Nothing -> [base]
Just x ->
[base, Task (testBase </> outputName file </> ("U" ++ show size ++ ".test")) (x size)]
| otherwise = []
addModuleTasks :: FilePath -> [Task] -> [Task]
addModuleTasks base baseTasks = unsignedTask : (baseTasks ++ moduleTasks)

View File

@@ -7,9 +7,8 @@ import Compare(comparisons)
import Conversions(conversions)
import CryptoNum(cryptoNum)
import Control.Monad(forM_,unless)
import Data.Maybe(mapMaybe)
import Data.Word(Word)
import File(File,Task(..),addModuleTasks,makeTask)
import File(File,Task(..),addModuleTasks,makeTasks)
import Gen(runGen)
import System.Directory(createDirectoryIfMissing)
import System.Environment(getArgs)
@@ -38,21 +37,24 @@ signedFiles :: [File]
signedFiles = [
]
makeTasks :: FilePath -> [File] -> [Task]
makeTasks basePath files =
concatMap (\ sz -> mapMaybe (makeTask basePath sz bitsizes) files) bitsizes
makeTasks' :: FilePath -> FilePath -> [File] -> [Task]
makeTasks' srcPath testPath files =
concatMap (\ sz -> concatMap (makeTasks srcPath testPath sz bitsizes) files) bitsizes
makeAllTasks :: FilePath -> [Task]
makeAllTasks basePath = addModuleTasks basePath $
makeTasks (basePath </> "unsigned") unsignedFiles ++
makeTasks (basePath </> "signed") signedFiles
makeAllTasks :: FilePath -> FilePath -> [Task]
makeAllTasks srcPath testPath = addModuleTasks srcPath $
makeTasks' (srcPath </> "unsigned") testPath unsignedFiles ++
makeTasks' (srcPath </> "signed") testPath signedFiles
main :: IO ()
main =
do args <- getArgs
unless (length args == 1) $
die ("generation takes exactly one argument, the target directory")
let tasks = makeAllTasks (head args)
let topLevel = head args
srcPath = topLevel </> "src"
testPath = topLevel </> "testdata"
tasks = makeAllTasks srcPath testPath
total = length tasks
forM_ (zip [(1::Word)..] tasks) $ \ (i, task) ->
do putStrLn ("[" ++ show i ++ "/" ++ show total ++ "] " ++ outputFile task)