diff --git a/scripts/build-geometry-unity-package.ps1 b/scripts/build-geometry-unity-package.ps1 index 31002f5e..27f3c567 100644 --- a/scripts/build-geometry-unity-package.ps1 +++ b/scripts/build-geometry-unity-package.ps1 @@ -61,6 +61,8 @@ $requiredTemplateFiles = @( "Runtime\Unity\GameCult.Geometry.Unity.asmdef", "Runtime\Unity\PlanetaryPatchMeshAdapter.cs", "Runtime\Unity\PlanetaryPageUpload.cs", + "Tests\Editor\GameCult.Geometry.Tests.Editor.asmdef", + "Tests\Editor\GeometryPackageTests.cs", "Shaders\AdvancedErosionFilter.hlsl", "Shaders\GameCult.Geometry.hlsl", "Shaders\Planetary.hlsl", @@ -85,6 +87,12 @@ if ($missingAssetMetas.Count -ne 0 -or $missingDirectoryMetas.Count -ne 0) { throw "Tracked Geometry Unity package has assets without stable .meta files: $($missing -join ', ')" } +$assemblyDirectories = @($unityAssetFiles | Where-Object { $_.Extension -eq ".asmdef" } | Group-Object DirectoryName) +$duplicateAssemblyDirectories = @($assemblyDirectories | Where-Object { $_.Count -ne 1 }) +if ($duplicateAssemblyDirectories.Count -ne 0) { + throw "Each Geometry Unity assembly directory must contain exactly one asmdef: $($duplicateAssemblyDirectories.Name -join ', ')" +} + $templateManifest = Get-Content -LiteralPath (Join-Path $templateRoot "package.json") -Raw | ConvertFrom-Json $expectedFileVersion = "$($templateManifest.version).0" $trackedAssembly = Join-Path $templatePluginRoot "GameCult.Geometry.dll" diff --git a/unity/org.gamecult.geometry/Tests.meta b/unity/org.gamecult.geometry/Tests.meta new file mode 100644 index 00000000..68cfab58 --- /dev/null +++ b/unity/org.gamecult.geometry/Tests.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 97ae3726627d441b8d85e69d4ea804b9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/org.gamecult.geometry/Tests/Editor.meta b/unity/org.gamecult.geometry/Tests/Editor.meta new file mode 100644 index 00000000..89790e17 --- /dev/null +++ b/unity/org.gamecult.geometry/Tests/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3aa2de1207ba4593a6927bed95bdfea0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/org.gamecult.geometry/Tests/Editor/GameCult.Geometry.Tests.Editor.asmdef b/unity/org.gamecult.geometry/Tests/Editor/GameCult.Geometry.Tests.Editor.asmdef new file mode 100644 index 00000000..817ba8f6 --- /dev/null +++ b/unity/org.gamecult.geometry/Tests/Editor/GameCult.Geometry.Tests.Editor.asmdef @@ -0,0 +1,19 @@ +{ + "name": "GameCult.Geometry.Tests.Editor", + "rootNamespace": "GameCult.Geometry.Tests.Editor", + "references": [ + "CultMath", + "GameCult.Geometry", + "GameCult.Geometry.Unity" + ], + "includePlatforms": ["Editor"], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": false, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false, + "optionalUnityReferences": ["TestAssemblies"] +} diff --git a/unity/org.gamecult.geometry/Tests/Editor/GameCult.Geometry.Tests.Editor.asmdef.meta b/unity/org.gamecult.geometry/Tests/Editor/GameCult.Geometry.Tests.Editor.asmdef.meta new file mode 100644 index 00000000..7d75ac20 --- /dev/null +++ b/unity/org.gamecult.geometry/Tests/Editor/GameCult.Geometry.Tests.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 73e8e3a82a3441ec9f2a0f668c90f5b5 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/org.gamecult.geometry/Tests/Editor/GeometryPackageTests.cs b/unity/org.gamecult.geometry/Tests/Editor/GeometryPackageTests.cs new file mode 100644 index 00000000..dec669a7 --- /dev/null +++ b/unity/org.gamecult.geometry/Tests/Editor/GeometryPackageTests.cs @@ -0,0 +1,54 @@ +using CultMath; +using GameCult.Geometry.Unity; +using NUnit.Framework; +using UnityEngine; + +namespace GameCult.Geometry.Tests.Editor +{ + public sealed class GeometryPackageTests + { + [Test] + public void CultMathPrimitivesAreVisible() + { + var value = new float3(2f, 3f, 4f); + + Assert.That(value.x, Is.EqualTo(2f)); + Assert.That(value.y, Is.EqualTo(3f)); + Assert.That(value.z, Is.EqualTo(4f)); + } + + [Test] + public void CoreGeometryTypesUseCultMathPrimitives() + { + var sphere = new CultSphere(new float3(1f, 2f, 3f), 4f); + + Assert.That(sphere.Center, Is.EqualTo(new float3(1f, 2f, 3f))); + Assert.That(sphere.Radius, Is.EqualTo(4f)); + Assert.That(sphere.Contains(new float3(1f, 2f, 7f)), Is.True); + } + + [Test] + public void PlanetaryAdapterCreatesUnityMesh() + { + var mesh = PlanetaryPatchMeshAdapter.CreateFaceMesh( + PlanetaryCubeFace.PositiveZ, + 2, + 3f); + + try + { + Assert.That(mesh, Is.Not.Null); + Assert.That(mesh.name, Does.Contain("PositiveZ")); + Assert.That(mesh.vertexCount, Is.EqualTo(9)); + Assert.That(mesh.normals.Length, Is.EqualTo(9)); + Assert.That(mesh.uv.Length, Is.EqualTo(9)); + Assert.That(mesh.triangles.Length, Is.EqualTo(24)); + Assert.That(mesh.bounds.size.sqrMagnitude, Is.GreaterThan(0f)); + } + finally + { + Object.DestroyImmediate(mesh); + } + } + } +} diff --git a/unity/org.gamecult.geometry/Tests/Editor/GeometryPackageTests.cs.meta b/unity/org.gamecult.geometry/Tests/Editor/GeometryPackageTests.cs.meta new file mode 100644 index 00000000..89858d8d --- /dev/null +++ b/unity/org.gamecult.geometry/Tests/Editor/GeometryPackageTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cc0a7b5b20004c72b9c9395d3c73360c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: