From eb617a454fbef762e56352e1bbb1f614b8842a76 Mon Sep 17 00:00:00 2001 From: filoxenace Date: Thu, 25 Sep 2025 20:00:49 -0400 Subject: [PATCH] Make testing framework more generic --- lib/compression.luau | 12 +++---- lib/core.luau | 3 +- lib/types.luau | 14 ++++---- tests/tests.luau | 78 ++++++++++++++++---------------------------- 4 files changed, 44 insertions(+), 63 deletions(-) diff --git a/lib/compression.luau b/lib/compression.luau index cecb964..b6fdfcc 100644 --- a/lib/compression.luau +++ b/lib/compression.luau @@ -1,4 +1,5 @@ local serde = require("@lune/serde") +local types = require("./types") type CompressionModule = { zlibDecompress: (contents: string, recursive: boolean?) -> string | boolean @@ -10,19 +11,18 @@ local compressionModule = {} :: CompressionModule -- take in file contents and zlib decompress them -- if recursive param is true repeatedly zlib decompress the file until it fails -- (modelscrape files are often double/triple zlib decompressed) -function compressionModule.zlibDecompress(contents: string, recursive: boolean?): string | boolean +function compressionModule.zlibDecompress(contents: string, opts: types.opts): string | boolean assert(typeof(contents) == "string", "Expected contents to be of type 'string'") - if recursive == nil then recursive = false end - assert(typeof(recursive) == "boolean", "Expected recursive to be of type 'boolean'") + assert(typeof(opts) == "table", "Expected opts to be of type 'table'") local success, decompressed: string = pcall(function() return serde.decompress("zlib", contents) end) if not success then return false end - if recursive then - local nextDecompressed = compressionModule.zlibDecompress(decompressed, true) + if opts.zlibDecompressFilesRecursive then + local nextDecompressed = compressionModule.zlibDecompress(decompressed, opts) while nextDecompressed do decompressed = nextDecompressed - nextDecompressed = compressionModule.zlibDecompress(decompressed, true) + nextDecompressed = compressionModule.zlibDecompress(decompressed, opts) end end return decompressed diff --git a/lib/core.luau b/lib/core.luau index e9009f6..9e09891 100644 --- a/lib/core.luau +++ b/lib/core.luau @@ -40,7 +40,7 @@ function core.fileContainsWorkspace(fileContents: string, opts: types.opts): boo assert(typeof(fileContents) == "string", "Expected fileContents to be of type 'string'") assert(typeof(opts) == "table", "Expected opts to be of type 'table'") if opts.zlibDecompressFiles or opts.zlibDecompressFilesRecursive then - local success = pcall(function() fileContents = compression.zlibDecompress(fileContents, opts.zlibDecompressFilesRecursive) end) + local success = pcall(function() fileContents = compression.zlibDecompress(fileContents, opts) end) if not success then stdio.write(stdio.color("yellow")) stdio.write("Warning: Failed to decompress file with zlib. Proceeding with original contents.\n") @@ -54,6 +54,7 @@ function core.fileContainsWorkspace(fileContents: string, opts: types.opts): boo return core.scanForWorkspace(instances, opts.printInstanceNames) end + -- formats the workspace detection result as a colored string function core.formatResult(result: boolean, fileName: string): string assert(typeof(result) == "boolean", "Expected result to be of type 'boolean'") diff --git a/lib/types.luau b/lib/types.luau index 5e7a98c..ced3e99 100644 --- a/lib/types.luau +++ b/lib/types.luau @@ -3,14 +3,14 @@ local types = {} export type opts = { - outputFile: string?, - directoryMode: boolean, - directoryPath: string?, - forceBinaryRead: boolean, - printInstanceNames: boolean, - zlibDecompressFiles: boolean, + outputFile: string?, + directoryMode: boolean, + directoryPath: string?, + forceBinaryRead: boolean, + printInstanceNames: boolean, + zlibDecompressFiles: boolean, zlibDecompressFilesRecursive: boolean, - filesToProcess: {string?} + filesToProcess: {string?} } export type model = {Instance} diff --git a/tests/tests.luau b/tests/tests.luau index 2da30e3..7ce8b6d 100644 --- a/tests/tests.luau +++ b/tests/tests.luau @@ -2,67 +2,47 @@ local fs = require("@lune/fs") local process = require("@lune/process") local core = require("../lib/core") local compression = require("../lib/compression") +local types = require("../lib/types") -local containsWorkspaceDir = fs.readDir("./containsworkspace") -local containsWorkspaceTestsPassed = 0 - -for _, filePath in containsWorkspaceDir do - local fileContents = fs.readFile("./containsworkspace/" .. filePath) - local result = core.fileContainsWorkspace(fileContents, { - forceBinaryRead = false, - directoryMode = false, - printInstanceNames = false, - zlibDecompressFiles = false, - zlibDecompressFilesRecursive = false - }) - if result then - containsWorkspaceTestsPassed += 1 - else - print("Test failed for file: " .. filePath) +function testFolder(callback: (file: string, opts: types.opts) -> boolean, opts: types.opts, folderPath: string): {boolean} + local results = {} + local folder = fs.readDir(folderPath) + for _, file in pairs(folder) do + local filePath = `./{folderPath}/{file}` + local fileContents = fs.readFile(filePath) + local result = callback(fileContents, opts) + results[file] = result end + return results end -local doesntContainWorkspaceDir = fs.readDir("./doesntcontainworkspace") -local doesntContainWorkspaceTestsPassed = 0 +local containsWorkspaceTest = testFolder(core.fileContainsWorkspace, {outputFile = nil, directoryMode = false, directoryPath = nil, forceBinaryRead = false, printInstanceNames = false, zlibDecompressFiles = false, zlibDecompressFilesRecursive = false, filesToProcess = nil} , "containsworkspace") -for _, filePath in doesntContainWorkspaceDir do - local fileContents = fs.readFile("./doesntcontainworkspace/" .. filePath) - local result = core.fileContainsWorkspace(fileContents, { - forceBinaryRead = false, - directoryMode = false, - printInstanceNames = false, - zlibDecompressFiles = false, - zlibDecompressFilesRecursive = false - }) +for fileName, result in pairs(containsWorkspaceTest) do if not result then - doesntContainWorkspaceTestsPassed += 1 - else - print("Test failed for file: " .. filePath) + print(`Test failed: {fileName} should contain a workspace instance.`) + process.exit(1) end end +print("All tests passed for files in containsworkspace.") -local zlibCompressedDir = fs.readDir("./zlibCompressed") -local zlibCompressedTestsPassed = 0 - -for _, filePath in zlibCompressedDir do - local fileContents = fs.readFile("./zlibCompressed/" .. filePath) - local result = compression.zlibDecompress(fileContents, true) +local doesntContainWorkspaceTest = testFolder(core.fileContainsWorkspace, {outputFile = nil, directoryMode = false, directoryPath = nil, forceBinaryRead = false, printInstanceNames = false, zlibDecompressFiles = false, zlibDecompressFilesRecursive = false, filesToProcess = nil}, "doesntcontainworkspace") +for fileName, result in pairs(doesntContainWorkspaceTest) do if result then - zlibCompressedTestsPassed += 1 - else - print("Test failed for file: " .. filePath) + print(`Test failed: {fileName} shouldn't contain a workspace instance.`) + process.exit(1) end end +print("All tests passed for files in doesntcontainworkspace.") -print(`Passed {containsWorkspaceTestsPassed}/{#containsWorkspaceDir} "contains workspace" tests.`) -print(`Passed {doesntContainWorkspaceTestsPassed}/{#doesntContainWorkspaceDir} "doesn't contain workspace" tests.`) -print(`Passed {zlibCompressedTestsPassed}/{#zlibCompressedDir} "zlib compressed" tests.`) +local zlibDecompressedTest = testFolder(compression.zlibDecompress, {outputFile = nil, directoryMode = false, directoryPath = nil, forceBinaryRead = false, printInstanceNames = false, zlibDecompressFiles = false, zlibDecompressFilesRecursive = true, filesToProcess = nil}, "zlibCompressed") -if containsWorkspaceTestsPassed == #containsWorkspaceDir and doesntContainWorkspaceTestsPassed == #doesntContainWorkspaceDir and zlibCompressedTestsPassed == #zlibCompressedDir then - print("All tests passed!") - process.exit(0) -else - print("Some tests failed.") - process.exit(1) -end \ No newline at end of file +for fileName, result in pairs(zlibDecompressedTest) do + if not result then + print(`Test failed: {fileName} should be zlib decompressed successfully.`) + process.exit(1) + end +end +print("All tests passed for zlib decompression.") +print("All tests passed.") \ No newline at end of file