diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6de821464cf..960da9f0703 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,5 +1,5 @@ # Last match in file takes precedence. - +* @HardLightSector/review-team # Sorting by path instead of by who added it one day :( # this isn't how codeowners rules work pls read the first comment instead of trying to force a sorting order diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index c8528fb1577..5568eab27ce 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -16,7 +16,7 @@ body: attributes: label: What happened? description: Describe what actually occurred, including any error messages. - placeholder: "When I do X, Y occurs. Error log: ..." + placeholder: "When I do X, Y occurs. Error logs or images also help!" validations: required: true @@ -51,37 +51,9 @@ body: - Minor (visual glitch, typo, annoyance) - Moderate (feature partially broken, workaround exists) - Major (feature completely broken, impacts gameplay) - - Critical (crash, data loss, server issue) validations: required: true - - type: input - id: version - attributes: - label: Game version / build - description: Which version of Hardlight are you running? - placeholder: "e.g., v1.2.3 or latest main branch commit hash" - validations: - required: true - - - type: input - id: context - attributes: - label: Server / Round ID / Timestamp - description: If applicable – helps us match server logs. - placeholder: "e.g., Hardlight-Main, Round 4821, 2026-05-06 ~14:30 UTC" - validations: - required: false - - - type: textarea - id: logs - attributes: - label: Relevant logs / screenshots - description: Paste any error logs, console output, or attach screenshots. - placeholder: "Paste logs here or drag and drop images" - validations: - required: false - - type: checkboxes id: checklist attributes: @@ -92,5 +64,3 @@ body: required: true - label: I can reproduce this bug consistently with the steps above required: true - - label: I understand that bug fixes will be tested locally before PR and tested again before merge - required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 5d2de0b4097..211c3a74fbc 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,11 +1,10 @@ - - ## About the PR ## Why / Balance + ## Technical details @@ -14,7 +13,7 @@ ## Media - ## Breaking changes diff --git a/.github/actions/apply-label/action.yml b/.github/actions/apply-label/action.yml new file mode 100644 index 00000000000..280cf36c1f9 --- /dev/null +++ b/.github/actions/apply-label/action.yml @@ -0,0 +1,45 @@ +name: 'Apply Label From Artifact' +description: 'Applies the label based on an artifact, so we can label things from weird places' + +outputs: + pr_num: + description: "The PR Number" + value: ${{ steps.pr_data.outputs.pr_num }} + +runs: + using: "composite" + steps: + - name: Fetch Run Artifact + uses: actions/download-artifact@v4 + with: + merge-multiple: true + github-token: ${{ github.token }} + run-id: ${{ github.event.workflow_run.id }} + + - name: Parse and Apply Label + id: pr_data + shell: bash + env: + GH_TOKEN: ${{ github.token }} + run: | + if [ ! -f "NR" ]; then + echo "Missing Data" + exit 0 + fi + PR_NUMBER=$(cat NR) + LABEL_NAME=$(cat LABEL) + + gh pr edit "$PR_NUMBER" --repo "${{ github.repository }}" --add-label "$LABEL_NAME" + echo "pr_num=$PR_NUMBER" >> $GITHUB_OUTPUT + + # Delete cuz disk space is expensive in this economy + - name: Delete Artifact + shell: bash + env: + GH_TOKEN: ${{ github.token }} + TARGET_NAME: pr-approval-${{ github.event.workflow_run.id }} + run: | + ID=$(gh api repos/${{ github.repository }}/actions/artifacts --jq ".artifacts[] | select(.name==\"$TARGET_NAME\") | .id" | head -n 1) + if [ ! -z "$ID" ]; then + gh api --method DELETE repos/${{ github.repository }}/actions/artifacts/$ID + fi diff --git a/.github/labeler.yml b/.github/labeler.yml index 425e85003bb..b78e04a653b 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -42,10 +42,6 @@ - changed-files: - any-glob-to-any-file: "**/*.xaml*" -"C#": -- changed-files: - - any-glob-to-any-file: "**/*.cs" - "Shaders": - changed-files: - any-glob-to-any-file: '**/*.swsl' diff --git a/.github/workflows/build-test-debug.yml b/.github/workflows/build-test-debug.yml index 5bc97a6b9b8..10c42cf6974 100644 --- a/.github/workflows/build-test-debug.yml +++ b/.github/workflows/build-test-debug.yml @@ -1,29 +1,30 @@ name: Build & Test Debug on: - push: - branches: [ master, staging, stable ] merge_group: pull_request: types: [ opened, reopened, synchronize, ready_for_review ] branches: [ master, staging, stable ] +concurrency: + group: integration-tests-${{ github.event.pull_request.number }} + cancel-in-progress: true + jobs: build: if: github.actor != 'PJBot' && github.event.pull_request.draft == false && github.actor != 'FrontierATC' # Frontier - strategy: - matrix: - os: [ubuntu-latest] - - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest + name: Build Client & Server + outputs: + test-list: ${{ steps.listtests.outputs.tests }} steps: + # Make sure we check out the exact SHA that started the flow, so we don't test someone elses code - name: Checkout Master - uses: actions/checkout@v4.2.2 - - - name: Setup Submodule - run: | - git submodule update --init --recursive + uses: actions/checkout@v7 + with: + ref: ${{ github.event.pull_request.head.sha || github.sha }} + submodules: recursive - name: Pull engine updates uses: space-wizards/submodule-dependency@v0.1.5 @@ -34,9 +35,9 @@ jobs: git submodule update --init --recursive - name: Setup .NET Core - uses: actions/setup-dotnet@v4.1.0 + uses: actions/setup-dotnet@v5 with: - dotnet-version: 9.0.x + dotnet-version: 10.0.100 - name: Install dependencies run: dotnet restore @@ -44,18 +45,146 @@ jobs: - name: Build Project run: dotnet build --configuration DebugOpt --no-restore /p:WarningsAsErrors=nullable /m - - name: Run Content.Tests - run: dotnet test --no-build --configuration DebugOpt Content.Tests/Content.Tests.csproj -- NUnit.ConsoleOut=0 + # This takes all the test namespaces and puts them into the output so we can run multiple jobs for the tests at once + - name: List all Tests + id: listtests + run: | + echo "tests=$(dotnet test --no-build Content.IntegrationTests/Content.IntegrationTests.csproj \ + --list-tests -- NUnit.DisplayName=FullName \ + | grep -E "^[[:space:]]+[A-Za-z0-9_]+\." \ + | sed 's/^[[:space:]]*//' \ + | awk -F. '{print $1"."$2"."$3"."$4}' \ + | sort -u | jq -R . | jq -s -c .)" >> "$GITHUB_OUTPUT" + + # Rather than re-building for every test, we store the built workspace and just share that between all the jobs + - name: Cache Build Objects + uses: actions/cache/save@v5 + with: + path: bin + key: build-pr-${{ github.event.pull_request.number }} + + # We have to checkout because the tests look for a bunch of local resources + # But the cache means we don't have to re-build every time at least. + tests: + runs-on: ubuntu-latest + name: Run Tests + needs: build + steps: + - name: Checkout Master + uses: actions/checkout@v7 + with: + ref: ${{ github.event.pull_request.head.sha || github.sha }} + submodules: recursive + + - name: Setup .NET Core + uses: actions/setup-dotnet@v5 + with: + dotnet-version: 10.0.100 + + - name: Fetch Pre-Built Workspace + id: fetch + continue-on-error: true + uses: actions/cache/restore@v5 + with: + path: bin + key: build-pr-${{ github.event.pull_request.number }} + fail-on-cache-miss: true + + - name: Re-Build the files if the cached build is missing + if: steps.fetch.outcome == 'failure' + run: | + dotnet restore + dotnet build --configuration DebugOpt --no-restore /p:WarningsAsErrors=nullable /m + + - name: Run Tests + run: dotnet vstest ./bin/Content.Tests/Content.Tests.dll -- NUnit.ConsoleOut=0 + + + integrationtests: + runs-on: ubuntu-latest + needs: build + name: Run Integration Tests + strategy: + fail-fast: false + max-parallel: 20 + matrix: + test: ${{ fromJson(needs.build.outputs.test-list) }} + steps: + - name: Checkout Master + uses: actions/checkout@v7 + with: + ref: ${{ github.event.pull_request.head.sha || github.sha }} + submodules: recursive + + # Github sometimes gets a bit angry if ALL the jobs hit the cache at once, so staggering a little bit seems to make them start happier + - name: Delay to stagger starts + run: | + DELAY=$((1 + RANDOM % 15)) + echo "Staggering for $DELAY seconds" + sleep $DELAY - - name: Run Content.IntegrationTests - shell: pwsh + - name: Setup .NET Core + uses: actions/setup-dotnet@v5 + with: + dotnet-version: 10.0.100 + + - name: Fetch Pre-Built Workspace + id: fetch + continue-on-error: true + uses: actions/cache/restore@v5 + with: + path: bin + key: build-pr-${{ github.event.pull_request.number }} + fail-on-cache-miss: true + + - name: Re-Build the files if the cached build is missing + if: steps.fetch.outcome == 'failure' + run: | + dotnet restore + dotnet build --configuration DebugOpt --no-restore /p:WarningsAsErrors=nullable /m + + - name: Run Integration Tests + continue-on-error: true + id: integrationtestrun + env: + DOTNET_GCHighMemPercent: 75 + run: | + dotnet test ./bin/Content.IntegrationTests/Content.IntegrationTests.dll \ + --logger "console;verbosity=normal" \ + --filter "FullyQualifiedName~${{ matrix.test }}" -- \ + NUnit.ConsoleOut=0 NUnit.MapWarningTo=Failed + + # For some reason, the github runners just randomly crash + # If they do, re-run the tests and slow things down a bit + # But also upload the crash dump as an artifact in-case things are really broken. + - name: Re-Run Integration Tests on failure + if: steps.integrationtestrun.outcome == 'failure' + env: + DOTNET_gcServer: 0 + DOTNET_GCHighMemPercent: 75 + ROBUST_TEST_THREADS: 2 run: | - $env:DOTNET_gcServer=1 - dotnet test --no-build --configuration DebugOpt Content.IntegrationTests/Content.IntegrationTests.csproj --filter "FullyQualifiedName!~ShipyardTest" -- NUnit.ConsoleOut=0 NUnit.MapWarningTo=Failed + dotnet test ./bin/Content.IntegrationTests/Content.IntegrationTests.dll \ + --logger "console;verbosity=normal" \ + --blame-crash --blame-crash-dump-type mini \ + --filter "FullyQualifiedName~${{ matrix.test }}" -- \ + MaxCpuCount=1 NUnit.NumberOfTestWorkers=1 NUnit.ConsoleOut=0 NUnit.MapWarningTo=Failed + + - name: Upload Crash Dump + if: failure() && steps.integrationtestrun.outcome == 'failure' + uses: actions/upload-artifact@v4 + with: + name: crash-dump-${{matrix.test}} + retention-days: 3 + path: | + **/TestResults/**/*.xml + **/TestResults/**/*.dmp + ci-success: - name: Build & Test Debug + name: Testing Success needs: - - build + - tests + - integrationtests runs-on: ubuntu-latest steps: - name: CI succeeded diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index fa9e83c8d1b..ecf810b77c7 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -1,5 +1,9 @@ name: PR Changelogs -concurrency: commit_action +concurrency: + group: commit_action + cancel-in-progress: false + queue: max + on: pull_request_target: types: [closed] @@ -40,6 +44,7 @@ jobs: shell: bash - name: Generate Changelog + id: gen_changelog run: | cd "Tools/changelog" node changelog.js @@ -53,3 +58,10 @@ jobs: git push shell: bash continue-on-error: true + + - name: Publish changelog + run: Tools/actions_changelog_publish_discord.py + env: + DISCORD_WEBHOOK_URL: ${{ secrets.CHANGELOG_DISCORD_WEBHOOK }} + DISCORD_CHANGELOG: ${{ steps.gen_changelog.outputs.changelog }} + continue-on-error: true diff --git a/.github/workflows/close-master-pr.yml b/.github/workflows/close-master-pr.yml index e298498f3c1..62497109c02 100644 --- a/.github/workflows/close-master-pr.yml +++ b/.github/workflows/close-master-pr.yml @@ -7,25 +7,25 @@ on: permissions: issues: write pull-requests: write - + jobs: run: runs-on: ubuntu-latest if: ${{github.head_ref == 'master' || github.head_ref == 'main' || github.head_ref == 'develop'}} - - steps: - - uses: superbrothers/close-pull-request@v3 - with: - comment: "Thank you for your contribution! It appears you created a PR from your master branch, this is [something you should avoid doing](https://jmeridth.com/posts/do-not-issue-pull-requests-from-your-master-branch/), and thus this PR has been automatically closed. \n \n We suggest you follow [our git usage documentation](https://docs.spacestation14.com/en/general-development/setup/git-for-the-ss14-developer.html). \n \n You can move your current work from the master branch to another branch by following [these commands](https://ohshitgit.com/#accidental-commit-master). And then you may recreate your PR using the new branch." + + steps: + #- uses: superbrothers/close-pull-request@v3 + # with: + # comment: "Thank you for your contribution! It appears you created a PR from your master branch, this is [something you should avoid doing](https://jmeridth.com/posts/do-not-issue-pull-requests-from-your-master-branch/), and thus this PR has been automatically closed. \n \n We suggest you follow [our git usage documentation](https://docs.spacestation14.com/en/general-development/setup/git-for-the-ss14-developer.html). \n \n You can move your current work from the master branch to another branch by following [these commands](https://ohshitgit.com/#accidental-commit-master). And then you may recreate your PR using the new branch." # If you prefer to just comment on the pr and not close it, uncomment the bellow and comment the above - - # - uses: actions/github-script@v7 - # with: - # script: | - # github.rest.issues.createComment({ - # issue_number: ${{ github.event.number }}, - # owner: context.repo.owner, - # repo: context.repo.repo, - # body: "Thank you for contributing to the Space Station 14 repository. Unfortunately, it looks like you submitted your pull request from the master branch. We suggest you follow [our git usage documentation](https://docs.spacestation14.com/en/general-development/setup/git-for-the-ss14-developer.html) \n\n You can move your current work from the master branch to another branch by doing `git branch ./pr/NR + echo "$LABEL" > ./pr/LABEL + + - name: Upload PR number + uses: actions/upload-artifact@v4 + with: + name: pr-approval-${{ github.run_id }} + path: pr/ + retention-days: 1 + + # For PRs from local branches, we don't need to do all that shit + branch-approval: + if: github.event.review.state == 'approved' && github.event.pull_request.head.repo.full_name == github.repository + runs-on: ubuntu-latest permissions: contents: read + issues: write pull-requests: write - runs-on: ubuntu-latest steps: - - uses: tspascoal/get-user-teams-membership@v3 - id: checkUserMember - with: - username: ${{ github.actor }} - team: "content-maintainers,junior-maintainers" - GITHUB_TOKEN: ${{ secrets.LABELER_PAT }} - - if: ${{ steps.checkUserMember.outputs.isTeamMember == 'true' }} - uses: actions-ecosystem/action-add-labels@v1 - with: - labels: "S: Approved" + - name: Add Label + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + run: gh pr edit "$PR_NO" --add-label "$LABEL" + - name: Remove Old Label + continue-on-error: true + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + run: gh pr edit "$PR_NO" --repo "${{ github.repository }}" --remove-label "$OLD_LABEL" diff --git a/.github/workflows/labeler-size.yml b/.github/workflows/labeler-size.yml index f5990a544f2..f3d31d01930 100644 --- a/.github/workflows/labeler-size.yml +++ b/.github/workflows/labeler-size.yml @@ -1,5 +1,10 @@ name: "Labels: Size" +concurrency: + group: labels + cancel-in-progress: false + queue: max + on: pull_request_target permissions: diff --git a/.github/workflows/labeler-stable.yml b/.github/workflows/labeler-stable.yml index f6fd2033a11..680f414e3da 100644 --- a/.github/workflows/labeler-stable.yml +++ b/.github/workflows/labeler-stable.yml @@ -1,5 +1,10 @@ name: "Labels: Branch stable" +concurrency: + group: labels + cancel-in-progress: false + queue: max + on: pull_request_target: types: @@ -7,10 +12,20 @@ on: branches: - 'stable' +permissions: + contents: read + issues: write + pull-requests: write + jobs: add_label: runs-on: ubuntu-latest steps: - - uses: actions-ecosystem/action-add-labels@v1 - with: - labels: "Branch: Stable" + - name: Add stable branch label + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + REPO: ${{ github.repository }} + run: | + gh api --method POST "repos/$REPO/issues/$PR_NUMBER/labels" \ + --field labels[]="Branch: Stable" diff --git a/.github/workflows/labeler-staging.yml b/.github/workflows/labeler-staging.yml index b46a198aefb..a5704cec677 100644 --- a/.github/workflows/labeler-staging.yml +++ b/.github/workflows/labeler-staging.yml @@ -1,5 +1,10 @@ name: "Labels: Branch staging" +concurrency: + group: labels + cancel-in-progress: false + queue: max + on: pull_request_target: types: @@ -7,10 +12,20 @@ on: branches: - 'staging' +permissions: + contents: read + issues: write + pull-requests: write + jobs: add_label: runs-on: ubuntu-latest steps: - - uses: actions-ecosystem/action-add-labels@v1 - with: - labels: "Branch: Staging" + - name: Add staging branch label + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + REPO: ${{ github.repository }} + run: | + gh api --method POST "repos/$REPO/issues/$PR_NUMBER/labels" \ + --field labels[]="Branch: Staging" diff --git a/.github/workflows/labeler-untriaged.yml b/.github/workflows/labeler-untriaged.yml index adf355c3dd2..750a60dee69 100644 --- a/.github/workflows/labeler-untriaged.yml +++ b/.github/workflows/labeler-untriaged.yml @@ -1,5 +1,10 @@ name: "Labels: Untriaged" +concurrency: + group: labels + cancel-in-progress: false + queue: max + on: issues: types: [opened] @@ -7,7 +12,7 @@ on: types: [opened] permissions: - contents: write + contents: read pull-requests: write issues: write @@ -15,8 +20,15 @@ jobs: add_label: runs-on: ubuntu-latest steps: - - uses: actions-ecosystem/action-add-labels@v1 - if: join(github.event.issue.labels) == '' - with: - labels: "S: Untriaged" - github_token: "${{ secrets.GITHUB_TOKEN }}" + - name: Add untriaged label + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + ISSUE_NUMBER: ${{ github.event.issue.number || github.event.pull_request.number }} + REPO: ${{ github.repository }} + run: | + label_count=$(gh api "repos/$REPO/issues/$ISSUE_NUMBER/labels" --jq 'length') + + if [ "$label_count" -eq 0 ]; then + gh api --method POST "repos/$REPO/issues/$ISSUE_NUMBER/labels" \ + --field labels[]="S: Untriaged" + fi diff --git a/.github/workflows/publish-changelog.yml b/.github/workflows/publish-changelog.yml deleted file mode 100644 index 18abe64aa7a..00000000000 --- a/.github/workflows/publish-changelog.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Publish Changelog - -on: - workflow_dispatch: - schedule: - - cron: '0 10 * * *' - -jobs: - publish_changelog: - runs-on: ubuntu-latest - steps: - - - name: checkout - uses: actions/checkout@v3 - with: - token: ${{secrets.GITHUB_TOKEN}} - ref: master - - - name: Publish changelog - run: Tools/actions_changelogs_since_last_run.py - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - DISCORD_WEBHOOK_URL: ${{ secrets.CHANGELOG_DISCORD_WEBHOOK }} - continue-on-error: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000000..32b15f3bedc --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,87 @@ +# Branch Structure +## Public Branches +These branches are on the HardLight github and should generally never directly merged or pushed into (neither on a fork or on the official github) +* prod + * This is the version the game server is running on + * It should always be only comprised of tested and validated code + * direct merges into prod are prohibited + * Merges into prod happen weekly and are only comprised of code from master that has been individually tested by multiple people + * PRs into prod are from the master branch with an exception for hotfixes + * Changelogs are read from PRs going into prod + * Hotfix PRs into prod need to be reviewed for code quality *and* tested by at least one additional reviewer. See [[#Testing Guidelines]] +* master + * This is the branch the test server is running on (once available) + * The test server is publicly available for whitelisted players + * The test server will be updated and restarted daily (if changes exist) + * PRs into master have to be tested by the developer for stability and functionality and only need to be reviewed by sighting the changed files for code quality. See [[#Testing Guidelines]] and [[#PR Guidelines]] + * features merged into master can be announced in upcoming-content on the discord +## Fork Branches +These branches are created on forks and are meant for general development. You are free to merge or push into these branches whenever you feel like it. It is recommended to delete the branch after merging it into master. Branches can be restored if needed +* feature + * A feature branch explicitly adds *new* features to the game or adds/changes capabilities to features that are already in the game. + * Feature branches are personal branches by developers branching off of the master branch and getting PRd back into master. +* bugfix + * Bugfix branches are personal branches meant to fix issues that have been found on the master branch + * They branch off of master and go back into master once the bug is deemed to be fixed +* hotfix + * Hotfix branches are personal branches that are meant to fix an issue that has been found on the prod branch + * They branch off of prod and are getting PRd into master *and* prod alike + + +## General recommendation for branch names +for easier organization on local branches, you can use a forward slash (/) to structure your branches. These branches will be automatically categorized by most git GUIs. +It is also recommended to add issue numbers (if applicable) to the respective branches +Examples: +* feature/12355-new-antag +* bugfix/12355-new-antag-avali +* hotfix/12358-cryosleep-spawn + + +# PR Guidelines +* PRs need to come from one of the aforementioned fork branches. You cannot PR from your own master or prod branch into HardLight +* All content of a PR should be related to one topic. +* The title and body of a PR need to follow guidelines + * The title needs to be prefixed with one of the following prefixes + * **feat**: A new feature + * **bugfix**: A bug fix + * **hotfix**: A hot fix + * **build**: Changes that affect the build system or external dependencies + * **conf**: Changes to configurations + * **docs**: Documentation only changes + * **perf**: A code change that improves performance + * **refactor**: A code change that neither fixes a bug nor adds a feature + * **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) + * **test**: Adding missing tests or correcting existing tests + * **chore**: Updates and similar tasks, No production code change + * The title should include the related issue number(s) (if applicable) and be a concise summary of the changes + * The body should follow the standardized body with every applicable category filled out +* Refactors and cleanups must be in a separate PR +* A PR needs to be classified for size by a maintainer before getting merged +* A PR needs to be tested thoroughly by the developer before submission. See [[#Testing Guidelines]] +* A PR is not considered *submitted* while it is in draft or has the *do not merge* tag +* Keep your PR as small and concise as possible. If you need to implement/port things for your main feature to work, PR these implementations/ports individually first + + +# Testing Guidelines +* When building and starting the game, no new errors or warnings shall appear in either the server or client console +* Every aspect of your change should be tested + * YML entity additions/changes + * Every related entity needs to be spawned, used and observed for functionality + * The entity needs to be locally saved and loaded on a ship at least once + * The entity needs to be locally saved and loaded in an apartment at least once + * child entities of the changed entity need to be tested as well + * YML recipes + * Every construction and deconstruction recipe has to be tested at least once + * If the recipe has alternative construction materials, all combinations should be tested + * YML game rules + * The game rule has to be added 5 consecutive times + * No warnings or errors shall appear in the consoles + * C# Components + * a wide variety of entities using the component need to be spawned, used and observed + * an entity using the component needs to be saved and loaded on a ship + * New/Ported C# systems + * The needs are entirely based on the system itself + * It is required to summarize what kinds of tests have been done +* Unit/Integration tests + * C# code that adds functionality needs a unit test for every public functionality + diff --git a/Content.Benchmarks/GlobalUsings.cs b/Content.Benchmarks/GlobalUsings.cs new file mode 100644 index 00000000000..120b7f39b5f --- /dev/null +++ b/Content.Benchmarks/GlobalUsings.cs @@ -0,0 +1,3 @@ +// Global usings for Content.Benchmarks + +global using Robust.UnitTesting.Pool; diff --git a/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml b/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml index 2c27fdd2ce3..9a3103c449f 100644 --- a/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml +++ b/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml @@ -5,18 +5,18 @@ - + - - - -