diff --git a/.github/workflows/update-tools.yml b/.github/workflows/update-tools.yml new file mode 100644 index 0000000..8cc0624 --- /dev/null +++ b/.github/workflows/update-tools.yml @@ -0,0 +1,45 @@ +name: Daily Update Manifests + +on: + workflow_dispatch: + schedule: + - cron: '0 0 * * *' + +jobs: + update-manifests: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Setup pesde + uses: lumin-org/setup-pesde@v0.4.1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + cache: true + + - name: Install packages + run: pesde install + timeout-minutes: 1 # sometimes the install just hangs infinitely, so you won't want spent 12 hours of ci credit for nothing :sob: + + - name: Set up Git + run: | + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' + + - name: Apply updates + run: lune run .lune/update_tools -- --yes + + - name: Publish updates + run: pesde publish + + - name: Commit and push changes + run: | + if [[ -n "$(git status --porcelain)" ]]; then + git add . + git commit -m "chore: daily manifest update [skip ci]" + git push + else + echo "No changes to commit." + fi \ No newline at end of file diff --git a/.gitignore b/.gitignore index ae9db4f..bba6c93 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ **/*_packages/ toolchainlib/pesde.lock + +**/tests/output/** diff --git a/.lune/update_tools.luau b/.lune/update_tools.luau index 059264b..e2ae9b1 100644 --- a/.lune/update_tools.luau +++ b/.lune/update_tools.luau @@ -1,221 +1,240 @@ ---> Updates tooling bin versions and READMEs - -local serde = require("@lune/serde") -local stdio = require("@lune/stdio") -local process = require("@lune/process") -local DateTime = require("@lune/datetime") - -local pathfs = require("../lune_packages/pathfs") -local base64 = require("../lune_packages/base64") - -local manifestTypes = require("../toolchainlib/src/manifest") -local Result = require("../lune_packages/result") -local Option = require("../lune_packages/option") -type Result = Result.Result -type Option = Option.Option - -local Github = require("../toolchainlib/src/github") - -type GithubContents = { - name: string, - path: string, - sha: string, - size: number, - url: string, - html_url: string, - git_url: string, - download_url: string, - type: "file" | "dir" | "symlink", - content: string, - encoding: "base64", - _links: { - self: string, - git: string, - html: string, - }, -} - -local function isoDateToTimestamp(isoDate: string): number - return DateTime.fromIsoDate(isoDate).unixTimestamp -end - -local function stripLeadingVersion(version: string): string - local stripped = string.gsub(version, "^v", "") - return stripped -end - -local function confirmAndClear(msg: string, default: boolean?): boolean - local yes = stdio.prompt("confirm", msg, default) - stdio.write( - -- Move to the previous line, clear it, move cursor to start of line, - -- and show cursor (if hidden) - "\x1b[A\x1b[K\x1b[0G\x1b[?25h" - ) - - return yes -end - -local INFO_PREFIX = `{stdio.color("green")}{stdio.style("bold")}info{stdio.color("reset")}:` -local WARN_PREFIX = `{stdio.color("yellow")}{stdio.style("bold")}warn{stdio.color("reset")}:` -local ERROR_PREFIX = `{stdio.color("red")}{stdio.style("bold")}error{stdio.color("reset")}:` - -local function warn(...) - stdio.ewrite(`{WARN_PREFIX} {stdio.format(...)}\n`) -end - -local function error(msg: string): never - stdio.ewrite(`{ERROR_PREFIX} {msg}\n`) - return process.exit(1) -end - -local function assert(expr: boolean, msg: string) - if not expr then - error(msg) - end -end - -local START_TIME = os.clock() -local BINS_SRC_DIR = pathfs.getAbsolutePathOf(pathfs.Path.from("bins")) - -for _, binSrc in pathfs.readDir(BINS_SRC_DIR) do - local absPath = BINS_SRC_DIR:join(binSrc) - local binEntrypoint = absPath:join("init.luau") - local manifestPath = absPath:join("pesde.toml") - local readmePath = absPath:join("README.md") - - -- Make sure our constructed entrypoint and manifest paths exist - assert( - pathfs.isFile(binEntrypoint) and pathfs.isFile(manifestPath), - "Either binary entrypoint or manifest not found" - ) - - local manifestContents = pathfs.readFile(manifestPath) - local manifest: manifestTypes.PesdeManifest = serde.decode("toml", manifestContents) - local entrypointContents = pathfs.readFile(binEntrypoint) - - local repoName = string.match(entrypointContents, 'require%("./lune_packages/core"%)%("([^"]+)"') - local version = manifest.version - - -- Make sure we have a repo name and version - assert(repoName ~= nil, `Failed to get repo name for tool {binSrc}`) - - local gh = Github.new( - repoName :: string, - Option.Some({ - authToken = Option.from(process.env.GITHUB_TOKEN) :: Option, - retries = Option.None :: Option, - } :: Github.Config) :: Option - ) - local transactions = gh:queueTransactions({ "FetchReleases" }) - - -- Fetch releases, and order them by published date - local releases = transactions[1]:unwrap() :: Github.GithubReleases - table.sort(releases, function(a, b) - return isoDateToTimestamp(a.published_at) < isoDateToTimestamp(b.published_at) - end) - - -- Filter for only versions which are after the current version - local releasesAfter = {} - local versionIdx = math.huge - for idx, release in releases do - if stripLeadingVersion(release.tag_name) == version then - versionIdx = idx - continue - end - - if idx > versionIdx then - releasesAfter[release.tag_name] = release - end - end - - for newVersion, newRelease in releasesAfter do - print( - `{INFO_PREFIX} Found new tool release {stdio.style("bold")}{binSrc}{stdio.style("reset")}@{stdio.style( - "dim" - )}{newVersion}{stdio.style("reset")}` - ) - - -- HACK: To prevent messing with our existing toml ordering and formatting - -- we just replace the old version field string with the new version field - -- string - - -- the string returned by serde.encode end with newlines, so remove them to maintain compatibility with different line endings - -- Old version field string: - local oldField = string.gsub(serde.encode("toml", { version = manifest.version }), "%s+$", "") - - -- New version field string: - local newField = string.gsub(serde.encode("toml", { version = stripLeadingVersion(newVersion) }), "%s+$", "") - - local updatedManifest = string.gsub( - manifestContents, - oldField, - newField, - -- Only replace the first occurrence to be safe - 1 - ) - - local toWrite = table.find(process.args, "--yes") - or table.find(process.args, "-y") - or confirmAndClear(`Update manifest for {binSrc}?`, false) - - if toWrite then - print( - `{INFO_PREFIX} Updated manifest {stdio.style("dim")}{manifestPath:stripPrefix(pathfs.cwd)}{stdio.style( - "reset" - )}` - ) - - pathfs.writeFile(manifestPath, updatedManifest) - end - end - - -- Fetch README for the tool repo, if present - transactions = gh:queueTransactions({ - { - type = "Custom", - payload = { - method = "GET", - url = `https://api.github.com/repos/{repoName}/readme`, - }, - }, - }) - - local contentsResp = transactions[1] :: Result - - local readmeRes = contentsResp:andThen(function(resp: GithubContents) - -- If there was not an error, and the contents are base64 encoded, - -- we decode the contents and return the decoded buffer - if resp.encoding == "base64" then - -- NOTE: Github uses a special format for encoding the contents, where it - -- separates the entire file into multiple lines, and encodes each line in - -- base64 - - -- This should be done by the base64 library, but oh well - local content = string.gsub(resp.content, "%s+", "") - local decoded = base64.decode(buffer.fromstring(content)) - return Result.Ok(decoded) - end - - return Result.Err(`Unsupported encoding: {resp.encoding}`) - end) - - -- NOTE: Ideally this block should be a match, but I cannot make use of - -- control flow expressions from within a function - if readmeRes:isErr() then - warn(`Failed to fetch README from tool repo {repoName}:`, readmeRes:unwrapErr()) - continue - end - - -- Write the updated README to the tool's directory - local readmeContents = readmeRes:unwrap() - -- There used to be some issues with encoding if not deleted and recreated - pathfs.removeFile(readmePath) - pathfs.writeFile(readmePath, readmeContents) - - print( - `{INFO_PREFIX} Wrote README to {stdio.style("dim")}{readmePath:stripPrefix(pathfs.cwd)}{stdio.style("reset")}` - ) -end - -local timeElapsed = string.format("%.2fs", os.clock() - START_TIME) -print(`{INFO_PREFIX} Finished checking for tool updates in {stdio.style("dim")}{timeElapsed}{stdio.style("reset")}!`) +--> Updates tooling bin versions and READMEs + +local serde = require("@lune/serde") +local stdio = require("@lune/stdio") +local process = require("@lune/process") +local DateTime = require("@lune/datetime") + +local pathfs = require("../lune_packages/pathfs") +local base64 = require("../lune_packages/base64") + +local manifestTypes = require("../toolchainlib/src/manifest") +local Result = require("../lune_packages/result") +local Option = require("../lune_packages/option") +type Result = Result.Result +type Option = Option.Option + +local Github = require("../toolchainlib/src/github") + +type GithubContents = { + name: string, + path: string, + sha: string, + size: number, + url: string, + html_url: string, + git_url: string, + download_url: string, + type: "file" | "dir" | "symlink", + content: string, + encoding: "base64", + _links: { + self: string, + git: string, + html: string, + }, +} + +local function isoDateToTimestamp(isoDate: string): number + return DateTime.fromIsoDate(isoDate).unixTimestamp +end + +local function stripLeadingVersion(version: string): string + local stripped = string.gsub(version, "^v", "") + return stripped +end + +local function confirmAndClear(msg: string, default: boolean?): boolean + local yes = stdio.prompt("confirm", msg, default) + stdio.write( + -- Move to the previous line, clear it, move cursor to start of line, + -- and show cursor (if hidden) + "\x1b[A\x1b[K\x1b[0G\x1b[?25h" + ) + + return yes +end + +local INFO_PREFIX = `{stdio.color("green")}{stdio.style("bold")}info{stdio.color("reset")}:` +local WARN_PREFIX = `{stdio.color("yellow")}{stdio.style("bold")}warn{stdio.color("reset")}:` +local ERROR_PREFIX = `{stdio.color("red")}{stdio.style("bold")}error{stdio.color("reset")}:` + +local function warn(...) + stdio.ewrite(`{WARN_PREFIX} {stdio.format(...)}\n`) +end + +local function error(msg: string): never + stdio.ewrite(`{ERROR_PREFIX} {msg}\n`) + return process.exit(1) +end + +local function assert(expr: boolean, msg: string) + if not expr then + error(msg) + end +end + +local START_TIME = os.clock() +local BINS_SRC_DIR = pathfs.getAbsolutePathOf(pathfs.Path.from("bins")) + +for _, binSrc in pathfs.readDir(BINS_SRC_DIR) do + local absPath = BINS_SRC_DIR:join(binSrc) + local testsPath = absPath:join("tests/run.luau") + local binEntrypoint = absPath:join("init.luau") + local manifestPath = absPath:join("pesde.toml") + local readmePath = absPath:join("README.md") + + -- Make sure our constructed entrypoint and manifest paths exist + assert( + pathfs.isFile(binEntrypoint) and pathfs.isFile(manifestPath), + "Either binary entrypoint or manifest not found" + ) + + local manifestContents = pathfs.readFile(manifestPath) + local manifest: manifestTypes.PesdeManifest = serde.decode("toml", manifestContents) + local entrypointContents = pathfs.readFile(binEntrypoint) + + local repoName = string.match(entrypointContents, 'require%("./lune_packages/core"%)%("([^"]+)"') + local version = manifest.version + + -- Make sure we have a repo name and version + assert(repoName ~= nil, `Failed to get repo name for tool {binSrc}`) + + local gh = Github.new( + repoName :: string, + Option.Some({ + authToken = Option.from(process.env.GITHUB_TOKEN) :: Option, + retries = Option.None :: Option, + } :: Github.Config) :: Option + ) + local transactions = gh:queueTransactions({ "FetchReleases" }) + + -- Fetch releases, and order them by published date + local releases = transactions[1]:unwrap() :: Github.GithubReleases + table.sort(releases, function(a, b) + return isoDateToTimestamp(a.published_at) < isoDateToTimestamp(b.published_at) + end) + + -- Filter for only versions which are after the current version + local releasesAfter = {} + local versionIdx = math.huge + for idx, release in releases do + if stripLeadingVersion(release.tag_name) == version then + versionIdx = idx + continue + end + + if idx > versionIdx then + releasesAfter[release.tag_name] = release + end + end + + for newVersion, newRelease in releasesAfter do + print( + `{INFO_PREFIX} Found new tool release {stdio.style("bold")}{binSrc}{stdio.style("reset")}@{stdio.style( + "dim" + )}{newVersion}{stdio.style("reset")}` + ) + + -- Check if the tool has any tests, and run them if they do + if pathfs.isFile(testsPath) then + local success, result = pcall(require, testsPath:toString()) + if not success then + continue + end + + success, result = pcall(result, newVersion) + if not success then + continue + end + else + warn(`Unit tests not found for {binSrc}, assuming that they pass`) + end + + -- HACK: To prevent messing with our existing toml ordering and formatting + -- we just replace the old version field string with the new version field + -- string + + -- the string returned by serde.encode end with newlines, so remove them to maintain compatibility with different line endings + -- Old version field string: + local oldField = string.gsub(serde.encode("toml", { version = manifest.version }), "%s+$", "") + + -- New version field string: + local newField = string.gsub(serde.encode("toml", { version = stripLeadingVersion(newVersion) }), "%s+$", "") + + local updatedManifest, replaces = string.gsub( + manifestContents, + string.gsub(oldField, "[%.%+%-]", "%%%0"), + newField, + -- Only replace the first occurrence to be safe + 1 + ) + if replaces == 0 then + error("failed to replace version field in manifest") + end + + local toWrite = table.find(process.args, "--yes") + or table.find(process.args, "-y") + or confirmAndClear(`Update manifest for {binSrc}?`, false) + + if toWrite then + print( + `{INFO_PREFIX} Updated manifest {stdio.style("dim")}{manifestPath:stripPrefix(pathfs.cwd)}{stdio.style( + "reset" + )}` + ) + + pathfs.writeFile(manifestPath, updatedManifest) + end + end + + -- Fetch README for the tool repo, if present + transactions = gh:queueTransactions({ + { + type = "Custom", + payload = { + method = "GET", + url = `https://api.github.com/repos/{repoName}/readme`, + }, + }, + }) + + local contentsResp = transactions[1] :: Result + + local readmeRes = contentsResp:andThen(function(resp: GithubContents) + -- If there was not an error, and the contents are base64 encoded, + -- we decode the contents and return the decoded buffer + if resp.encoding == "base64" then + -- NOTE: Github uses a special format for encoding the contents, where it + -- separates the entire file into multiple lines, and encodes each line in + -- base64 + + -- This should be done by the base64 library, but oh well + local content = string.gsub(resp.content, "%s+", "") + local decoded = base64.decode(buffer.fromstring(content)) + return Result.Ok(decoded) + end + + return Result.Err(`Unsupported encoding: {resp.encoding}`) + end) + + -- NOTE: Ideally this block should be a match, but I cannot make use of + -- control flow expressions from within a function + if readmeRes:isErr() then + warn(`Failed to fetch README from tool repo {repoName}:`, readmeRes:unwrapErr()) + continue + end + + -- Write the updated README to the tool's directory + local readmeContents = readmeRes:unwrap() + -- There used to be some issues with encoding if not deleted and recreated + pathfs.removeFile(readmePath) + pathfs.writeFile(readmePath, readmeContents) + + print( + `{INFO_PREFIX} Wrote README to {stdio.style("dim")}{readmePath:stripPrefix(pathfs.cwd)}{stdio.style("reset")}` + ) +end + +local timeElapsed = string.format("%.2fs", os.clock() - START_TIME) +print(`{INFO_PREFIX} Finished checking for tool updates in {stdio.style("dim")}{timeElapsed}{stdio.style("reset")}!`) diff --git a/bins/argon/tests/input.project.json b/bins/argon/tests/input.project.json new file mode 100644 index 0000000..318bf32 --- /dev/null +++ b/bins/argon/tests/input.project.json @@ -0,0 +1,6 @@ +{ + "name": "good-input", + "tree": { + "$path": "../" + } +} \ No newline at end of file diff --git a/bins/argon/tests/run.luau b/bins/argon/tests/run.luau new file mode 100644 index 0000000..99568df --- /dev/null +++ b/bins/argon/tests/run.luau @@ -0,0 +1,12 @@ +local toolchainlib = require("../lune_packages/core") +local process = require("@lune/process") +local fs = require("@lune/fs") + +return function(version) + -- not working, needing support + -- process.args = { "sourcemap", "bins/argon/tests/input.project.json", "--output bins/argon/tests/output/sourcemap.json" } + local success, err = pcall(require, "bins/argon/init.luau") + assert(success, `failed to execute argon: {err}`) + + assert(fs.isFile("bins/argon/tests/output/sourcemap.luau"), `output not found`) +end diff --git a/bins/asphalt/tests/asphalt.toml b/bins/asphalt/tests/asphalt.toml new file mode 100644 index 0000000..eac4a5d --- /dev/null +++ b/bins/asphalt/tests/asphalt.toml @@ -0,0 +1,10 @@ +[inputs.assets] +path = "input/**" +output_path = "output" + +[creator] +type = "user" +id = 0 + +[codegen] +output_name = "init.luau" \ No newline at end of file diff --git a/bins/asphalt/tests/input/water_normal_map.png b/bins/asphalt/tests/input/water_normal_map.png new file mode 100644 index 0000000..db9ab4b Binary files /dev/null and b/bins/asphalt/tests/input/water_normal_map.png differ diff --git a/bins/asphalt/tests/run.luau b/bins/asphalt/tests/run.luau new file mode 100644 index 0000000..0e4212a --- /dev/null +++ b/bins/asphalt/tests/run.luau @@ -0,0 +1,13 @@ +local toolchainlib = require("../lune_packages/core") +local process = require("@lune/process") +local fs = require("@lune/fs") + +return function(version) + -- not working, needing support + -- process.cwd = "bins/asphalt" -- bcuz asphalt.toml must to be in the same directory + -- process.args = { "sync", "--target debug" } + local success, err = pcall(require, "bins/asphalt/init.luau") + assert(success, `failed to execute asphalt: {err}`) + + assert(fs.isFile("bins/asphalt/tests/output/water_normal_map.png"), "uploaded asset not found") +end diff --git a/bins/blink/tests/input.blink b/bins/blink/tests/input.blink new file mode 100644 index 0000000..abb487d --- /dev/null +++ b/bins/blink/tests/input.blink @@ -0,0 +1,9 @@ +option ClientOutput = "test/output/client.luau" +option ServerOutput = "test/output/server.luau" + +event MyFirstEvent { + from: Server, + type: Reliable, + call: SingleSync, + data: string +} \ No newline at end of file diff --git a/bins/blink/tests/run.luau b/bins/blink/tests/run.luau new file mode 100644 index 0000000..9e9cce3 --- /dev/null +++ b/bins/blink/tests/run.luau @@ -0,0 +1,16 @@ +local toolchainlib = require("../lune_packages/core") +local process = require("@lune/process") +local fs = require("@lune/fs") + +return function(version) + -- not working, needing support + -- process.args = { "bins/blink/tests/input.blink" } + local success, err = pcall(require, "bins/blink/init.luau") + assert(success, `failed to execute blink: {err}`) + + local client_signature = `\n-- File generated by Blink v{version}` + assert(fs.readFile("bins/blink/tests/output/client.luau"):match(client_signature), `invalid output`) + + local server_signature = `\n-- File generated by Blink v{version}` + assert(fs.readFile("bins/blink/tests/output/server.luau"):match(server_signature), `invalid output`) +end diff --git a/bins/darklua/tests/input.luau b/bins/darklua/tests/input.luau new file mode 100644 index 0000000..a75a69a --- /dev/null +++ b/bins/darklua/tests/input.luau @@ -0,0 +1,8 @@ +opt server_output = "tests/output/server.luau" +opt client_output = "tests/output/client.luau" + +funct Test = { + call: Async, + args: (Foo: u8, Bar: string), + rets: enum { Success, Fail } +} diff --git a/bins/darklua/tests/run.luau b/bins/darklua/tests/run.luau new file mode 100644 index 0000000..45b9dec --- /dev/null +++ b/bins/darklua/tests/run.luau @@ -0,0 +1,16 @@ +local toolchainlib = require("../lune_packages/core") +local process = require("@lune/process") +local fs = require("@lune/fs") + +return function(version) + -- not working, needing support + -- process.args = { "bins/zap/tests/input.zap" } + local success, err = pcall(require, "bins/blink/init.luau") + assert(success, `failed to execute blink: {err}`) + + local client_signature = `\n-- Client generated by Zap v{version} (https://github.com/red-blox/zap)` + assert(fs.readFile("tests/output/client.luau"):match(client_signature), `invalid output`) + + local server_signature = `\n-- Server generated by Zap v{version} (https://github.com/red-blox/zap)` + assert(fs.readFile("tests/output/server.luau"):match(server_signature), `invalid output`) +end diff --git a/bins/luau-lsp/tests/input.luau b/bins/luau-lsp/tests/input.luau new file mode 100644 index 0000000..0a36ff2 --- /dev/null +++ b/bins/luau-lsp/tests/input.luau @@ -0,0 +1 @@ +local a: string = 1 diff --git a/bins/luau-lsp/tests/run.luau b/bins/luau-lsp/tests/run.luau new file mode 100644 index 0000000..bc4ad64 --- /dev/null +++ b/bins/luau-lsp/tests/run.luau @@ -0,0 +1,15 @@ +local toolchainlib = require("../lune_packages/core") +local process = require("@lune/process") +local fs = require("@lune/fs") + +return function(version) + -- not working, needing support + -- process.args = { "process bins/darklua/tests/input.luau bins/darklua/tests/output.luau" --format dense } + local success, result = pcall(require, "bins/darklua/init.luau") + assert(success, `failed to execute darklua: {result}`) + + assert( + fs.readFile("bins/darklua/tests/output.luau") ~= fs.readFile("bins/darklua/tests/input.luau"), + `any expected error was found: {result}` + ) +end diff --git a/bins/rojo/tests/input.project.json b/bins/rojo/tests/input.project.json new file mode 100644 index 0000000..318bf32 --- /dev/null +++ b/bins/rojo/tests/input.project.json @@ -0,0 +1,6 @@ +{ + "name": "good-input", + "tree": { + "$path": "../" + } +} \ No newline at end of file diff --git a/bins/rojo/tests/run.luau b/bins/rojo/tests/run.luau new file mode 100644 index 0000000..3fbbca4 --- /dev/null +++ b/bins/rojo/tests/run.luau @@ -0,0 +1,12 @@ +local toolchainlib = require("../lune_packages/core") +local process = require("@lune/process") +local fs = require("@lune/fs") + +return function(version) + -- not working, needing support + -- process.args = { "sourcemap", "bins/rojo/tests/input.project.json", "--output bins/rojo/tests/output/sourcemap.json" } + local success, err = pcall(require, "bins/rojo/init.luau") + assert(success, `failed to execute rojo: {err}`) + + assert(fs.isFile("bins/rojo/tests/output/sourcemap.luau"), `output not found`) +end diff --git a/bins/selene/tests/bad_input.luau b/bins/selene/tests/bad_input.luau new file mode 100644 index 0000000..52f76b0 --- /dev/null +++ b/bins/selene/tests/bad_input.luau @@ -0,0 +1,3 @@ +if {} == {} then + error("impossible") +end diff --git a/bins/selene/tests/good_input.luau b/bins/selene/tests/good_input.luau new file mode 100644 index 0000000..2f082ee --- /dev/null +++ b/bins/selene/tests/good_input.luau @@ -0,0 +1,3 @@ +if 1 == 1 then + print("always true") +end diff --git a/bins/selene/tests/run.luau b/bins/selene/tests/run.luau new file mode 100644 index 0000000..96cd3ee --- /dev/null +++ b/bins/selene/tests/run.luau @@ -0,0 +1,28 @@ +local toolchainlib = require("../lune_packages/core") +local process = require("@lune/process") + +return function(version) + do + -- not working, needing support + -- process.args = { "bins/selene/tests/bad_input.luau" } + local success, result = pcall(require, "bins/selene/init.luau") + assert(success, `failed to execute selene: {result}`) + + assert( + string.find(result, "%d warnings") or string.find(result, "%d errors"), + `any expected error was found: {result}` + ) + end + + do + -- not working, needing support + -- process.args = { "bins/selene/tests/good_input.luau" } + local success, result = pcall(require, "bins/selene/init.luau") + assert(success, `failed to execute selene: {result}`) + + assert( + string.find(result, "0 warnings") or string.find(result, "0 errors"), + `a unexpected error was found: {result}` + ) + end +end diff --git a/bins/stylua/tests/bad_input.luau b/bins/stylua/tests/bad_input.luau new file mode 100644 index 0000000..ed9997c --- /dev/null +++ b/bins/stylua/tests/bad_input.luau @@ -0,0 +1 @@ + local a = 5 diff --git a/bins/stylua/tests/good_input.luau b/bins/stylua/tests/good_input.luau new file mode 100644 index 0000000..2a28ef9 --- /dev/null +++ b/bins/stylua/tests/good_input.luau @@ -0,0 +1 @@ +local a = 5 diff --git a/bins/stylua/tests/run.luau b/bins/stylua/tests/run.luau new file mode 100644 index 0000000..fbcff48 --- /dev/null +++ b/bins/stylua/tests/run.luau @@ -0,0 +1,22 @@ +local toolchainlib = require("../lune_packages/core") +local process = require("@lune/process") + +return function(version) + do + -- not working, needing support + -- process.args = { "--check bins/stylua/tests/bad_input.luau", "--output-format summary" } + local success, result = pcall(require, "bins/stylua/init.luau") + assert(success, `failed to execute stylua: {result}`) + + assert(string.find(result, "Code style issues found"), `any expected error was found: {result}`) + end + + do + -- not working, needing support + -- process.args = { "--check bins/stylua/tests/good_input.luau", "--output-format summary" } + local success, result = pcall(require, "bins/stylua/init.luau") + assert(success, `failed to execute stylua: {result}`) + + assert(string.find(result, "All files are correctly formatted."), `a unexpected error was found: {result}`) + end +end diff --git a/bins/zap/tests/input.zap b/bins/zap/tests/input.zap new file mode 100644 index 0000000..a75a69a --- /dev/null +++ b/bins/zap/tests/input.zap @@ -0,0 +1,8 @@ +opt server_output = "tests/output/server.luau" +opt client_output = "tests/output/client.luau" + +funct Test = { + call: Async, + args: (Foo: u8, Bar: string), + rets: enum { Success, Fail } +} diff --git a/bins/zap/tests/run.luau b/bins/zap/tests/run.luau new file mode 100644 index 0000000..6416dce --- /dev/null +++ b/bins/zap/tests/run.luau @@ -0,0 +1,16 @@ +local toolchainlib = require("../lune_packages/core") +local process = require("@lune/process") +local fs = require("@lune/fs") + +return function(version) + -- not working, needing support + -- process.args = { "bins/zap/tests/input.zap" } + local success, err = pcall(require, "bins/zap/init.luau") + assert(success, `failed to execute zap: {err}`) + + local client_signature = `\n-- Client generated by Zap v{version} (https://github.com/red-blox/zap)` + assert(fs.readFile("bins/zap/tests/output/client.luau"):match(client_signature), `invalid output`) + + local server_signature = `\n-- Server generated by Zap v{version} (https://github.com/red-blox/zap)` + assert(fs.readFile("bins/zap/tests/output/server.luau"):match(server_signature), `invalid output`) +end