diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 58ead3b..0000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,114 +0,0 @@ -version: 2.1 -executors: - unity: - # https://hub.docker.com/r/gableroux/unity3d/tags - parameters: - version: {type: string} - docker: - - image: gableroux/unity3d:<< parameters.version >> - go: - docker: - - image: circleci/golang -commands: - unity_activate: - parameters: - unity_version: {type: string} - unity_license: {type: string} - steps: - # get activation file, if fail to activate unity, use this key and activate from https://license.unity3d.com/manual - - run: apt update && apt install libunwind8 -y - - run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -logFile -createManualActivationFile || exit 0 - - run: cat Unity_v<< parameters.unity_version >>.alf - # get from UNITY_LICENSE envvar(base64 encoded(cat foo.ulf | base64 )), this file is generated from above manual activation - - run: echo << parameters.unity_license >> | base64 -di >> .circleci/Unity.ulf - - run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -manualLicenseFile .circleci/Unity.ulf || exit 0 -jobs: - build-and-test: - parameters: - unity_version: {type: string} - unity_license: {type: string} - executor: - name: unity - version: << parameters.unity_version >> - steps: - - checkout - - unity_activate: - unity_version: << parameters.unity_version >> - unity_license: << parameters.unity_license >> - - run: - name: Build Linux(Mono) - command: /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -projectPath . -executeMethod UnitTestBuilder.BuildUnitTest /headless /ScriptBackend Mono2x /BuildTarget StandaloneLinux64 - working_directory: . - # TODO:check unity version and packages... - # - run: ./bin/UnitTest/StandaloneLinux64_Mono2x/test - build-and-create-package: - parameters: - unity_version: {type: string} - unity_license: {type: string} - executor: - name: unity - version: << parameters.unity_version >> - steps: - - checkout - - unity_activate: - unity_version: << parameters.unity_version >> - unity_license: << parameters.unity_license >> - - run: - name: Export unitypackage - command: /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -projectPath . -executeMethod PackageExporter.Export - working_directory: . - - store_artifacts: - path: ./UniRx.Async.unitypackage - destination: /UniRx.Async.unitypackage - # upload to github by ghr - upload-github: - executor: go - steps: - - attach_workspace: - at: . - - run: go get github.com/tcnksm/ghr - - run: ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} ${CIRCLE_TAG} . - - store_artifacts: - path: UniRx.Async.unitypackage - destination: UniRx.Async.unitypackage -workflows: - version: 2 - build-unity: - jobs: - # does not exists yet. - # - build-and-test: - # unity_version: 2019.3.0a2 - # unity_license: ${UNITY_LICENSE_2019_3} - # - build-and-test: - # unity_version: 2019.2.0b2 - # unity_license: ${UNITY_LICENSE_2019_2} - - build-and-test: - unity_version: 2019.1.2f1 - unity_license: ${UNITY_LICENSE_2019_1} - filters: - tags: - only: /.*/ - # test asmdef will not found. - # - build-and-test: - # unity_version: 2018.4.0f1 - # unity_license: ${UNITY_LICENSE_2018_4} - # # UniTask minimum support version is 2018.3(C# 7.x) - # - build-and-test: - # unity_version: 2018.3.12f1 - # unity_license: ${UNITY_LICENSE_2018_3} - - build-and-create-package: - unity_version: 2019.1.2f1 - unity_license: ${UNITY_LICENSE_2019_1} - filters: - tags: - only: /^\d\.\d\.\d.*/ - branches: - ignore: /.*/ - - upload-github: - requires: - - build-and-create-package - filters: - tags: - only: /^\d\.\d\.\d.*/ - branches: - ignore: /.*/ diff --git a/.github/workflows/build-debug.yml b/.github/workflows/build-debug.yml new file mode 100644 index 0000000..02f3eca --- /dev/null +++ b/.github/workflows/build-debug.yml @@ -0,0 +1,73 @@ +name: Build-Debug + +on: + push: + branches: + - "**" + tags: + - "!*" # not a tag push + pull_request: + types: + - opened + - synchronize + +jobs: + build-dotnet: + runs-on: ubuntu-latest + env: + DOTNET_CLI_TELEMETRY_OPTOUT: 1 + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1 + NUGET_XMLDOC_MODE: skip + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-dotnet@v1 + with: + dotnet-version: 3.1.101 + - run: dotnet test -c Debug ./src/UniTask.NetCoreTests/UniTask.NetCoreTests.csproj + + build-unity: + strategy: + matrix: + unity: ['2019.3.9f1', '2020.1.0b5'] + include: + - unity: 2019.3.9f1 + license: UNITY_2019_3 + - unity: 2020.1.0b5 + license: UNITY_2020_1 + runs-on: ubuntu-latest + container: + # with linux-il2cpp. image from https://hub.docker.com/r/gableroux/unity3d/tags + image: gableroux/unity3d:${{ matrix.unity }}-linux-il2cpp + steps: + - run: apt update && apt install git -y + - uses: actions/checkout@v2 + # create unity activation file and store to artifacts. + - run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -logFile -createManualActivationFile || exit 0 + - uses: actions/upload-artifact@v1 + with: + name: Unity_v${{ matrix.unity }}.alf + path: ./Unity_v${{ matrix.unity }}.alf + # activate Unity from manual license file(ulf) + - run: echo -n "$UNITY_LICENSE" >> .Unity.ulf + env: + UNITY_LICENSE: ${{ secrets[matrix.license] }} + - name: Activate Unity, always returns a success. But if a subsequent run fails, the activation may have failed(if succeeded, shows `Next license update check is after` and not shows other message(like GUID != GUID). If fails not). In that case, upload the artifact's .alf file to https://license.unity3d.com/manual to get the .ulf file and set it to secrets. + run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -manualLicenseFile .Unity.ulf || exit 0 + + # Execute scripts: RuntimeUnitTestToolkit + - name: Build UnitTest(Linux64, mono) + run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -projectPath . -executeMethod UnitTestBuilder.BuildUnitTest /headless /ScriptBackend mono /BuildTarget StandaloneLinux64 + working-directory: src/UniTask + - name: Execute UnitTest + run: ./src/UniTask/bin/UnitTest/StandaloneLinux64_Mono2x/test + + # Execute scripts: Export Package + - name: Export unitypackage + run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -projectPath . -executeMethod PackageExporter.Export + working-directory: src/UniTask + + # Store artifacts. + - uses: actions/upload-artifact@v2 + with: + name: UniTask.unitypackage.zip + path: ./src/UniTask/*.unitypackage \ No newline at end of file diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml new file mode 100644 index 0000000..fbcf639 --- /dev/null +++ b/.github/workflows/build-release.yml @@ -0,0 +1,105 @@ +name: Build-Release + +on: + push: + tags: + - "[0-9]+.[0-9]+.[0-9]+*" + +jobs: + build-dotnet: + runs-on: ubuntu-latest + env: + DOTNET_CLI_TELEMETRY_OPTOUT: 1 + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1 + NUGET_XMLDOC_MODE: skip + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-dotnet@v1 + with: + dotnet-version: 3.1.101 + # set release tag(*.*.*) to env.GIT_TAG + - run: echo ::set-env name=GIT_TAG::${GITHUB_REF#refs/tags/} + + # build and pack + - run: dotnet build -c Release -p:Version=${{ env.GIT_TAG }} + - run: dotnet test -c Release --no-build + - run: dotnet pack ./src/UniTask.NetCore/UniTask.NetCore.csproj -c Release --no-build -p:Version=${{ env.GIT_TAG }} + + # Store artifacts. + - uses: actions/upload-artifact@v1 + with: + name: nuget + path: ./src/UniTask.NetCore/bin/Release/UniTask.${{ env.GIT_TAG }}.nupkg + + build-unity: + strategy: + matrix: + unity: ['2019.3.9f1'] + include: + - unity: 2019.3.9f1 + license: UNITY_2019_3 + runs-on: ubuntu-latest + container: + # with linux-il2cpp. image from https://hub.docker.com/r/gableroux/unity3d/tags + image: gableroux/unity3d:${{ matrix.unity }}-linux-il2cpp + steps: + - run: apt update && apt install git -y + - uses: actions/checkout@v2 + - run: echo -n "$UNITY_LICENSE" >> .Unity.ulf + env: + UNITY_LICENSE: ${{ secrets[matrix.license] }} + - run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -manualLicenseFile .Unity.ulf || exit 0 + + # set release tag(*.*.*) to env.GIT_TAG + - run: echo ::set-env name=GIT_TAG::${GITHUB_REF#refs/tags/} + + # Execute scripts: Export Package + - name: Export unitypackage + run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -projectPath . -executeMethod PackageExporter.Export + working-directory: src/UniTask + + # Store artifacts. + - uses: actions/upload-artifact@v2 + with: + name: UniTask.unitypackage.zip + path: ./src/UniTask/*.unitypackage + + create-release: + needs: [build-dotnet, build-unity] + runs-on: ubuntu-latest + env: + DOTNET_CLI_TELEMETRY_OPTOUT: 1 + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1 + NUGET_XMLDOC_MODE: skip + steps: + # setup dotnet for nuget push + - uses: actions/setup-dotnet@v1 + with: + dotnet-version: 3.1.101 + # set release tag(*.*.*) to env.GIT_TAG + - run: echo ::set-env name=GIT_TAG::${GITHUB_REF#refs/tags/} + + # Create Releases + - uses: actions/create-release@v1 + id: create_release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: Ver.${{ github.ref }} + + # Download (All) Artifacts to current directory + - uses: actions/download-artifact@v2-preview + + # Upload to NuGet + - run: dotnet nuget push "./nuget/*.nupkg" -s https://www.nuget.org/api/v2/package -k ${{ secrets.NUGET_KEY }} + + # Upload to Releases(unitypackage) + - uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./UniTask.${{ env.GIT_TAG }}.unitypackage/UniTask.${{ env.GIT_TAG }}.unitypackage + asset_name: UniTask.${{ env.GIT_TAG }}.unitypackage + asset_content_type: application/octet-stream \ No newline at end of file diff --git a/.github/workflows/toc.yml b/.github/workflows/toc.yml new file mode 100644 index 0000000..f7519c3 --- /dev/null +++ b/.github/workflows/toc.yml @@ -0,0 +1,15 @@ +name: TOC Generator + +on: + push: + paths: + - 'README.md' + +jobs: + generateTOC: + name: TOC Generator + runs-on: ubuntu-latest + steps: + - uses: technote-space/toc-generator@v2.4.0 + with: + TOC_TITLE: "## Table of Contents" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 0408dca..bddc628 100644 --- a/.gitignore +++ b/.gitignore @@ -147,3 +147,15 @@ Assembly-CSharp-Editor\.csproj UniRx\.Async\.unitypackage UniRx.Async.Tests.Editor.csproj + +src/UniTask/UniTask.csproj + +src/UniTask/UniTask.Editor.csproj + +src/UniTask/UniTask.Tests.csproj + +src/UniTask/UniTask.Tests.Editor.csproj + +src/UniTask/UniTask.*.unitypackage + +src/UniTask/UniTask.Linq.csproj diff --git a/Assets/Editor/PackageExporter.cs b/Assets/Editor/PackageExporter.cs deleted file mode 100644 index 1e3fa93..0000000 --- a/Assets/Editor/PackageExporter.cs +++ /dev/null @@ -1,35 +0,0 @@ -#if UNITY_EDITOR - -using System; -using System.IO; -using System.Linq; -using UnityEditor; -using UnityEngine; - -public static class PackageExporter -{ - [MenuItem("Tools/Export Unitypackage")] - public static void Export() - { - // configure - var root = "UniRx.Async"; - var exportPath = "./UniRx.Async.unitypackage"; - - var path = Path.Combine(Application.dataPath, root); - var assets = Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories) - .Where(x => Path.GetExtension(x) == ".cs" || Path.GetExtension(x) == ".asmdef" || Path.GetExtension(x) == ".json" || Path.GetExtension(x) == ".meta") - .Select(x => "Assets" + x.Replace(Application.dataPath, "").Replace(@"\", "/")) - .ToArray(); - - UnityEngine.Debug.Log("Export below files" + Environment.NewLine + string.Join(Environment.NewLine, assets)); - - AssetDatabase.ExportPackage( - assets, - exportPath, - ExportPackageOptions.Default); - - UnityEngine.Debug.Log("Export complete: " + Path.GetFullPath(exportPath)); - } -} - -#endif \ No newline at end of file diff --git a/Assets/RuntimeUnitTestToolkit/UnitTestRunner.cs b/Assets/RuntimeUnitTestToolkit/UnitTestRunner.cs deleted file mode 100644 index ff7041c..0000000 --- a/Assets/RuntimeUnitTestToolkit/UnitTestRunner.cs +++ /dev/null @@ -1,450 +0,0 @@ -using NUnit.Framework; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using UnityEngine; -using UnityEngine.Events; -using UnityEngine.TestTools; -using UnityEngine.UI; - -namespace RuntimeUnitTestToolkit -{ - public class UnitTestRunner : MonoBehaviour - { - // object is IEnumerator or Func - Dictionary>> tests = new Dictionary>>(); - - List additionalActionsOnFirst = new List(); - - public Button clearButton; - public RectTransform list; - public Scrollbar listScrollBar; - - public Text logText; - public Scrollbar logScrollBar; - - readonly Color passColor = new Color(0f, 1f, 0f, 1f); // green - readonly Color failColor = new Color(1f, 0f, 0f, 1f); // red - readonly Color normalColor = new Color(1f, 1f, 1f, 1f); // white - - bool allTestGreen = true; - - void Start() - { - try - { - UnityEngine.Application.logMessageReceived += (a, b, c) => - { - logText.text += "[" + c + "]" + a + "\n"; - }; - - // register all test types - foreach (var item in GetTestTargetTypes()) - { - RegisterAllMethods(item); - } - - var executeAll = new List>(); - foreach (var ___item in tests) - { - var actionList = ___item; // be careful, capture in lambda - - executeAll.Add(() => StartCoroutine(RunTestInCoroutine(actionList))); - Add(actionList.Key, () => StartCoroutine(RunTestInCoroutine(actionList))); - } - - var executeAllButton = Add("Run All Tests", () => StartCoroutine(ExecuteAllInCoroutine(executeAll))); - - clearButton.gameObject.GetComponent().color = new Color(170 / 255f, 170 / 255f, 170 / 255f, 1); - executeAllButton.gameObject.GetComponent().color = new Color(250 / 255f, 150 / 255f, 150 / 255f, 1); - executeAllButton.transform.SetSiblingIndex(1); - - additionalActionsOnFirst.Reverse(); - foreach (var item in additionalActionsOnFirst) - { - var newButton = GameObject.Instantiate(clearButton); - newButton.name = item.Name; - newButton.onClick.RemoveAllListeners(); - newButton.GetComponentInChildren().text = item.Name; - newButton.onClick.AddListener(item.Action); - newButton.transform.SetParent(list); - newButton.transform.SetSiblingIndex(1); - } - - clearButton.onClick.AddListener(() => - { - logText.text = ""; - foreach (var btn in list.GetComponentsInChildren