From a3739f55166a2d0b0ce9f5d3faf2e7f3751634f2 Mon Sep 17 00:00:00 2001 From: Patrick Stevens <3138005+Smaug123@users.noreply.github.com> Date: Tue, 4 Jun 2024 20:01:31 +0100 Subject: [PATCH] Add Actions (#1) --- .github/dependabot.yml | 16 ++++ .github/workflows/dotnet.yaml | 133 ++++++++++++++++++++++++++++++++++ README.md | 1 + TestRunner/Filter.fs | 2 +- TestRunner/Program.fs | 7 +- analyzers/analyzers.fsproj | 16 ++++ 6 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/dotnet.yaml create mode 100644 README.md create mode 100644 analyzers/analyzers.fsproj diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..90ec57b --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,16 @@ +# yaml-language-server: $schema=https://json.schemastore.org/dependabot-2.0.json +version: 2 +updates: + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + + - package-ecosystem: "nuget" + directory: "/" + schedule: + interval: "weekly" + ignore: + # Target the lowest version of FSharp.Core, for max compat + - dependency-name: "FSharp.Core" diff --git a/.github/workflows/dotnet.yaml b/.github/workflows/dotnet.yaml new file mode 100644 index 0000000..5cf4de0 --- /dev/null +++ b/.github/workflows/dotnet.yaml @@ -0,0 +1,133 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/github-workflow.json +name: .NET + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + DOTNET_NOLOGO: true + DOTNET_CLI_TELEMETRY_OPTOUT: true + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + NUGET_XMLDOC_MODE: '' + DOTNET_MULTILEVEL_LOOKUP: 0 + +jobs: + build: + strategy: + matrix: + config: + - Release + - Debug + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # so that NerdBank.GitVersioning has access to history + - name: Install Nix + uses: cachix/install-nix-action@V27 + with: + extra_nix_config: | + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + - name: Restore dependencies + run: nix develop --command dotnet restore + - name: Build + run: nix develop --command dotnet build --no-restore --configuration ${{matrix.config}} + - name: Test + run: nix develop --command dotnet test --no-build --verbosity normal --configuration ${{matrix.config}} + + analyzers: + runs-on: ubuntu-latest + permissions: + security-events: write + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # so that NerdBank.GitVersioning has access to history + - name: Install Nix + uses: cachix/install-nix-action@V27 + with: + extra_nix_config: | + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + - name: Prepare analyzers + run: nix develop --command dotnet restore analyzers/analyzers.fsproj + - name: Build project + run: nix develop --command dotnet build ./TestRunner/TestRunner.fsproj + - name: Run analyzers + run: nix run .#fsharp-analyzers -- --project ./TestRunner/TestRunner.fsproj --analyzers-path ./.analyzerpackages/g-research.fsharp.analyzers/*/ --verbosity detailed --report ./analysis.sarif --treat-as-error GRA-STRING-001 GRA-STRING-002 GRA-STRING-003 GRA-UNIONCASE-001 GRA-INTERPOLATED-001 GRA-TYPE-ANNOTATE-001 GRA-VIRTUALCALL-001 GRA-IMMUTABLECOLLECTIONEQUALITY-001 GRA-JSONOPTS-001 GRA-LOGARGFUNCFULLAPP-001 GRA-DISPBEFOREASYNC-001 --exclude-analyzers PartialAppAnalyzer + + build-nix: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install Nix + uses: cachix/install-nix-action@V27 + with: + extra_nix_config: | + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + - name: Build + run: nix build + + check-dotnet-format: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install Nix + uses: cachix/install-nix-action@V27 + with: + extra_nix_config: | + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + - name: Run Fantomas + run: nix run .#fantomas -- --check . + + check-nix-format: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install Nix + uses: cachix/install-nix-action@V27 + with: + extra_nix_config: | + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + - name: Run Alejandra + run: nix develop --command alejandra --check . + + linkcheck: + name: Check links + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Install Nix + uses: cachix/install-nix-action@V27 + with: + extra_nix_config: | + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + - name: Run link checker + run: nix develop --command markdown-link-check README.md + + flake-check: + name: Check flake + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Install Nix + uses: cachix/install-nix-action@V27 + with: + extra_nix_config: | + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + - name: Flake check + run: nix flake check + + all-required-checks-complete: + needs: [check-dotnet-format, check-nix-format, build, build-nix, linkcheck, flake-check, analyzers] + runs-on: ubuntu-latest + steps: + - run: echo "All required checks complete." diff --git a/README.md b/README.md new file mode 100644 index 0000000..afdd6d0 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Toy NUnit test runner diff --git a/TestRunner/Filter.fs b/TestRunner/Filter.fs index ee9d302..c5c312f 100644 --- a/TestRunner/Filter.fs +++ b/TestRunner/Filter.fs @@ -161,7 +161,7 @@ module FilterIntermediate = ConsumeBeforeInitialToken = false ConsumeAfterFinalToken = false BoundaryTokens = [ TokenType.CloseParen ] - Construct = Seq.exactlyOne + Construct = List.exactlyOne } let parse (s : string) : FilterIntermediate = diff --git a/TestRunner/Program.fs b/TestRunner/Program.fs index b280beb..6662c9a 100644 --- a/TestRunner/Program.fs +++ b/TestRunner/Program.fs @@ -129,6 +129,11 @@ type TestFailure = | TestReturnedNonUnit of obj | TestThrew of exn + override this.ToString () = + match this with + | TestFailure.TestReturnedNonUnit ret -> $"Test returned a non-unit: %O{ret}" + | TestFailure.TestThrew exc -> $"Test threw: %s{exc.Message}\n %s{exc.StackTrace}" + [] module TestFixture = let private runOne (test : MethodInfo) (args : obj[]) : Result = @@ -229,7 +234,7 @@ module TestFixture = for result in results do match result with | Error exc -> - eprintfn $"Test failed: {exc}" + eprintfn $"Test failed: %O{exc}" Interlocked.Increment testFailures |> ignore | Ok () -> Interlocked.Increment testSuccess |> ignore diff --git a/analyzers/analyzers.fsproj b/analyzers/analyzers.fsproj new file mode 100644 index 0000000..8c59f41 --- /dev/null +++ b/analyzers/analyzers.fsproj @@ -0,0 +1,16 @@ + + + + false + false + ../.analyzerpackages/ + net6.0 + true + false + + + + + + +