diff --git a/.yamato/package-test.yml b/.yamato/package-test.yml index 48f800929..86ba75eb9 100644 --- a/.yamato/package-test.yml +++ b/.yamato/package-test.yml @@ -13,7 +13,11 @@ test_{{ platform.name }}_{{ editor.version }}: UPMCI_PKG: "upm-ci-utils@stable" commands: - npm install {% if platform.name == "win" %}"%UPMCI_PKG%"{% else %}"$UPMCI_PKG"{% endif %} -g --registry {{ registry.npm }} + {% if editor.version == "trunk" %} + - upm-ci package test -u {{ editor.version }} --package-path package/com.unity.formats.usd --type package-tests --extra-utr-arg="--api-profile=NET_4_6" --extra-editor-arg=-editorAnalyticsTestMode + {% else %} - upm-ci package test -u {{ editor.version }} --package-path package/com.unity.formats.usd --type package-tests --extra-utr-arg="--api-profile=NET_4_6" + {% endif %} artifacts: logs: paths: diff --git a/package/com.unity.formats.usd/Common/UsdEditorAnalytics.cs b/package/com.unity.formats.usd/Common/UsdEditorAnalytics.cs index 274ce7d67..f0118e0b2 100644 --- a/package/com.unity.formats.usd/Common/UsdEditorAnalytics.cs +++ b/package/com.unity.formats.usd/Common/UsdEditorAnalytics.cs @@ -11,10 +11,12 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + # if ENABLE_CLOUD_SERVICES_ANALYTICS && UNITY_EDITOR # define USE_EDITOR_ANALYTICS # endif +using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; @@ -40,7 +42,8 @@ public static class UsdEditorAnalytics // Universal USD Analytics const string k_UsageEventName = "USDPackageUsage"; - struct UsageAnalyticsData + [Serializable] + public struct UsageAnalyticsData { public bool InitSucceeded; public double TimeTakenMs; @@ -49,7 +52,8 @@ struct UsageAnalyticsData // USD Import Analytics const string k_ImportEventName = "USDFileImport"; - struct ImportAnalyticsData + [Serializable] + public struct ImportAnalyticsData { public string FileExtension; public double TimeTakenMs; @@ -83,7 +87,8 @@ public struct ImportResult // USD Reimport Analytics const string k_ReimportEventName = "USDFileReimport"; - struct ReimportAnalyticsData + [Serializable] + public struct ReimportAnalyticsData { public string FileExtension; public double TimeTakenMs; @@ -98,7 +103,8 @@ struct ReimportAnalyticsData // USD Export Analytics const string k_ExportEventName = "USDFileExport"; - struct ExportAnalyticsData + [Serializable] + public struct ExportAnalyticsData { public string FileExtension; public double TimeTakenMs; @@ -109,7 +115,7 @@ struct ExportAnalyticsData // USD Recorder Export Analytics const string k_RecorderExportEventName = "USDFileRecorderExport"; - struct RecorderExportAnalyticsData + public struct RecorderExportAnalyticsData { public string FileExtension; public double TimeTakenMs; diff --git a/package/com.unity.formats.usd/Tests/Common/BaseFixture.cs b/package/com.unity.formats.usd/Tests/Common/BaseFixture.cs index ba81df6a9..3af041d09 100644 --- a/package/com.unity.formats.usd/Tests/Common/BaseFixture.cs +++ b/package/com.unity.formats.usd/Tests/Common/BaseFixture.cs @@ -17,6 +17,9 @@ using UnityEngine; using UnityEditor; using UnityScene = UnityEngine.SceneManagement.Scene; +using USD.NET; +using USD.NET.Unity; +using System; namespace Unity.Formats.USD.Tests { @@ -47,7 +50,15 @@ public void CleanupTestArtifacts() { if (Directory.Exists(ArtifactsDirectoryFullPath)) { - Directory.Delete(ArtifactsDirectoryFullPath, true); + try + { + Directory.Delete(ArtifactsDirectoryFullPath, true); + } + catch (Exception e) + { + Debug.Log("Artifact Clean up has failed - This should not happen in most cases, but even if so, the test case should not be affected."); + Debug.Log($"Exception Message: {e.Message}"); + } } TestUtility.DeleteMetaFile(ArtifactsDirectoryFullPath); diff --git a/package/com.unity.formats.usd/Tests/Common/Data/Invalid.meta b/package/com.unity.formats.usd/Tests/Common/Data/Invalid.meta new file mode 100644 index 000000000..999a3be90 --- /dev/null +++ b/package/com.unity.formats.usd/Tests/Common/Data/Invalid.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2f1636a7e72dc004f84c01644fd1dac8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package/com.unity.formats.usd/Tests/Common/Data/Invalid/Invalid.format b/package/com.unity.formats.usd/Tests/Common/Data/Invalid/Invalid.format new file mode 100644 index 000000000..e69de29bb diff --git a/package/com.unity.formats.usd/Tests/Common/Data/Invalid/Invalid.format.meta b/package/com.unity.formats.usd/Tests/Common/Data/Invalid/Invalid.format.meta new file mode 100644 index 000000000..d07c0919c --- /dev/null +++ b/package/com.unity.formats.usd/Tests/Common/Data/Invalid/Invalid.format.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9765cdc7a6ee373409cbb919cf78dfac +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package/com.unity.formats.usd/Tests/Common/Data/Invalid/InvalidContent.usda b/package/com.unity.formats.usd/Tests/Common/Data/Invalid/InvalidContent.usda new file mode 100644 index 000000000..ae33ec71c --- /dev/null +++ b/package/com.unity.formats.usd/Tests/Common/Data/Invalid/InvalidContent.usda @@ -0,0 +1 @@ +invalidFile \ No newline at end of file diff --git a/package/com.unity.formats.usd/Tests/Common/Data/Invalid/InvalidContent.usda.meta b/package/com.unity.formats.usd/Tests/Common/Data/Invalid/InvalidContent.usda.meta new file mode 100644 index 000000000..fb70266db --- /dev/null +++ b/package/com.unity.formats.usd/Tests/Common/Data/Invalid/InvalidContent.usda.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 14e668cfd7cd716428839dd6b6235e83 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package/com.unity.formats.usd/Tests/Common/Data/Invalid/NoBindingsFound.usda b/package/com.unity.formats.usd/Tests/Common/Data/Invalid/NoBindingsFound.usda new file mode 100644 index 000000000..d0b9c34e5 --- /dev/null +++ b/package/com.unity.formats.usd/Tests/Common/Data/Invalid/NoBindingsFound.usda @@ -0,0 +1,54 @@ +#usda 1.0 +( + defaultPrim = "stage1" + endTimeCode = 268 + framesPerSecond = 30 + metersPerUnit = 0.01 + startTimeCode = 0 + timeCodesPerSecond = 30 + upAxis = "Y" +) + +def SkelRoot "stage1" ( + kind = "component" +) +{ + float3[] extent = [(-53.05333, 265.47928, -72.659065), (53.05333, 382.0265, 16.884062)] + float3[] extent.timeSamples = { + 0: [(-53.05333, 265.4792, -72.65901), (53.05333, 382.02634, 16.88407)], + 1: [(-53.053596, 265.4765, -72.65901), (53.053062, 382.02365, 16.88407)], + 2: [(-53.05434, 265.46823, -72.65901), (53.05232, 382.01535, 16.884068)], + 3: [(-53.05547, 265.45398, -72.65901), (53.051178, 382.00113, 16.884064)], + 4: [(-53.0569, 265.43344, -72.65901), (53.049732, 381.9806, 16.884054)], + } + + def Skeleton "Root_Skel" ( + prepend apiSchemas = ["SkelBindingAPI"] + customData = { + dictionary Maya = { + bool generated = 1 + } + } + ) + { + uniform matrix4d[] bindTransforms = [( (4.440892098500626e-16, 0.9997134876465046, 0.023936219786376493, 0), (-5.5511151231257815e-17, -0.02393621978637639, 0.9997134876465046, 0), (0.9999999999999998, -2.775557561562891e-16, 2.220446049250313e-16, 0), (2.891197464137364e-15, 124.10803985595703, -28.4235782623291, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (4.440892098500626e-16, 0.9997134876465046, 0.023936219786376493, 0), (-5.5511151231257815e-17, -0.02393621978637639, 0.9997134876465046, 0), (0.9999999999999998, -2.775557561562891e-16, 2.220446049250313e-16, 0), (4.511449307732199e-15, 131.85853753168777, -28.2380074781869, 1) ), ( (4.440892098500626e-16, 0.9997134876465046, 0.023936219786376493, 0), (-5.5511151231257815e-17, -0.02393621978637639, 0.9997134876465046, 0), (0.9999999999999998, -2.775557561562891e-16, 2.220446049250313e-16, 0), (6.992425856778108e-15, 139.60903520741851, -28.0524366940447, 1) ), ( (4.4121886838724947e-16, 0.9976941264602537, 0.06787068606335707, 0), (-7.49841609631496e-17, -0.06787068606335697, 0.9976941264602537, 0), (0.9999999999999998, -2.775557561562891e-16, 2.220446049250313e-16, 0), (6.6888331548561675e-15, 147.35953288314926, -27.866865909902465, 1) ), ( (4.4121886838724947e-16, 0.9976941264602537, 0.06787068606335707, 0), (-7.49841609631496e-17, -0.06787068606335697, 0.9976941264602537, 0), (0.9999999999999998, -2.775557561562891e-16, 2.220446049250313e-16, 0), (8.912802405430759e-15, 158.76963471567905, -27.090664648525788, 1) ), ( (4.4121886838724947e-16, 0.9976941264602537, 0.06787068606335707, 0), (-7.49841609631496e-17, -0.06787068606335697, 0.9976941264602537, 0), (0.9999999999999998, -2.775557561562891e-16, 2.220446049250313e-16, 0), (9.867068209279965e-15, 170.17973654820884, -26.314463387149054, 1) ), ( (0, 0.9885691006649282, -0.15077216786852551, -8.673617379884035e-19), (0, 0.15077216786852551, 0.9885691006649282, -1.0842021724855044e-19), (1, 0, 0, 0), (0, 181.58995474979488, -25.53820744504786, 0.9999999999999999) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (0, 0.9816485225212506, -0.19069790724358443, 0), (0, 0.19069790724358443, 0.9816485225212502, 0), (1, 0, 0, 0), (0, 217.95491508505253, -31.084576459497587, 1) ), ( (0, 0.9816485225212505, -0.19069790724358443, 0), (0, 0.19069790724358446, 0.9816485225212505, 0), (1, 0, 0, 0), (0, 227.6159994592588, -32.96136690902933, 1) ), ( (0, 0.9816485225212505, -0.19069790724358446, 0), (0, 0.19069790724358443, 0.9816485225212503, 0), (1, 0, 0, 0), (0, 237.27708383346507, -34.83815735856108, 1) ), ( (0, 0.9994729197336809, -0.03247772988661472, 0), (0, 0.0324777298866147, 0.999472919733681, 0), (1, 0, 0, 0), (0, 246.9383502547419, -36.714921136428465, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (0, -0.5070694057640377, 0.8619056897089996, 0), (0, -0.8619056897089996, -0.5070694057640375, 0), (1, 0, 0, 0), (0, 258.56355142448774, -30.277837514269468, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) )] + uniform token[] joints = ["NonExistentJointRoot", "NonExistentJointRoot/Joint_1", "NonExistentJointRoot/Joint_1/Part_1"] + uniform matrix4d[] restTransforms = [( (4.440892098500626e-16, 0.9997134876465046, 0.023936219786376493, 0), (-5.5511151231257815e-17, -0.02393621978637639, 0.9997134876465046, 0), (0.9999999999999998, -2.775557561562891e-16, 2.220446049250313e-16, 0), (2.891197464137364e-15, 124.10803985595703, -28.4235782623291, 1) ), ( (2.7216132453750207e-16, -2.2862462198502427e-16, 1.0000000000000002, 0), (0.999713487646505, -0.023936219786376504, -4.45290699921853e-16, 0), (0.0239362197863764, 0.999713487646505, 4.486542966894401e-17, 0), (-123.39212835296787, 31.386111875274977, 5.3648194520719233e-14, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 2.4074124304840448e-32, 0), (0, 1, 6.162975822039155e-33, 0), (2.311115933264683e-33, 2.465190328815662e-32, 1, 0), (7.75271892547606, 7.105427357601002e-15, -1.822646978209455e-15, 1) ), ( (1, 0, 2.4074124304840448e-32, 0), (0, 1, 6.162975822039155e-33, 0), (2.311115933264683e-33, 2.465190328815662e-32, 1, 0), (7.752718925476074, 3.552713678800501e-15, -9.619222727583934e-16, 1) ), ( (0.9990328424266781, 0.0439702143828302, 2.5037089277034066e-32, 0), (-0.043970214382830206, 0.9990328424266781, 6.162975822039155e-33, 0), (2.311115933264683e-33, 2.465190328815662e-32, 1, 0), (7.752718925476074, 3.907985046680551e-14, -3.746491523726235e-15, 1) ), ( (1, 0, 2.465190328815662e-32, 0), (0, 1, 0, 0), (2.7733391199176196e-32, 2.465190328815662e-32, 1, 0), (11.43647289276123, -7.105427357601002e-15, -2.8220183775109864e-15, 1) ), ( (1, 0, 2.465190328815662e-32, 0), (0, 1, 0, 0), (2.7733391199176196e-32, 2.465190328815662e-32, 1, 0), (11.43647289276123, 4.973799150320701e-14, -4.091721824236367e-15, 1) ), ( (0.9760565748609984, -0.21751936939927205, -4.469650848497423e-16, -8.673617379884035e-19), (0.21751936939927194, 0.9760565748609983, -2.2784866700137286e-17, -1.0842021724855044e-19), (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (11.436592704703457, 0.00004665658997993205, -1.4913105202149834e-14, 0.9999999999999999) ), ( (0, 0, 1, 0), (0.9885679999999998, 0.15077199999999996, 0, 8.737927915947187e-19), (-0.15077199999999996, 0.9885679999999999, 0, -2.359310663502254e-20), (-183.36446499999997, -2.1324259999999953, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (0.9991782214827172, -0.04051273773040179, 0, 8.622565589193481e-19), (0.040512737730401815, 0.999178221482717, 0, 1.4347031845168616e-19), (0, 0, 1, 0), (36.78547325775156, -0.00014512420906953594, 0, 1.0000000000000002) ), ( (1, -2.7755575615628914e-17, 0, 0), (-2.7755575615628914e-17, 1.0000000000000002, 0, 0), (0, 0, 1, 0), (9.841694000000018, -3.552713678800501e-15, 0, 1) ), ( (1.0000000000000002, -2.7755575615628914e-17, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (9.84169399999999, -3.552713678800501e-15, 0, 1) ), ( (0.9873250303175658, 0.15871575578190805, 0, 0), (-0.15871575578190808, 0.987325030317566, 0, 0), (0, 0, 1, 0), (9.841867620091762, 0.000060898224898409126, 0, 1) ), ( (0, 0, 1, 0), (0.9994719999999999, 0.03247770000000001, 0, 0), (-0.03247769999999999, 0.9994719999999998, 0, 0), (-248.00038299999997, 28.67554599999999, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (-0.5347943875364563, 0.8449821554652504, 0, 0), (-0.8449821554652505, -0.534794387536456, 0, 0), (0, 0, 1, 0), (11.410001392772784, 6.811244638037152, 0, 1) ), ( (0, 0, 1, 0), (-0.5070689999999999, -0.8619049999999999, 0, 0), (0.8619049999999999, -0.5070690000000001, 0, 0), (157.206181, 207.50426499999998, 0, 1) ), ( (0, 0, 1, 0), (-0.5070689999999999, -0.8619049999999999, 0, 0), (0.8619049999999999, -0.5070690000000001, 0, 0), (157.206181, 207.50426499999998, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (0, 0, 1, 0), (0.9994719999999999, 0.03247770000000001, 0, 0), (-0.03247769999999999, 0.9994719999999998, 0, 0), (-248.00038299999997, 28.67554599999999, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (0, 0, 1, 0), (0.9994719999999999, 0.03247770000000001, 0, 0), (-0.03247769999999999, 0.9994719999999998, 0, 0), (-248.00038299999997, 28.67554599999999, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (0, 0, 1, 0), (0.9885679999999998, 0.15077199999999996, 0, 8.737927915947187e-19), (-0.15077199999999996, 0.9885679999999999, 0, -2.359310663502254e-20), (-183.36446499999997, -2.1324259999999953, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (0, 0, 1, 0), (0.9885679999999998, 0.15077199999999996, 0, 8.737927915947187e-19), (-0.15077199999999996, 0.9885679999999999, 0, -2.359310663502254e-20), (-183.36446499999997, -2.1324259999999953, 0, 1) ), ( (0, 0, 1, 0), (0.9885679999999998, 0.15077199999999996, 0, 8.737927915947187e-19), (-0.15077199999999996, 0.9885679999999999, 0, -2.359310663502254e-20), (-183.36446499999997, -2.1324259999999953, 0, 1) ), ( (0, 0, 1, 0), (0.9885679999999998, 0.15077199999999996, 0, 8.737927915947187e-19), (-0.15077199999999996, 0.9885679999999999, 0, -2.359310663502254e-20), (-183.36446499999997, -2.1324259999999953, 0, 1) ), ( (0, 0, 1, 0), (0.9885679999999998, 0.15077199999999996, 0, 8.737927915947187e-19), (-0.15077199999999996, 0.9885679999999999, 0, -2.359310663502254e-20), (-183.36446499999997, -2.1324259999999953, 0, 1) ), ( (0, 0, 1, 0), (0.9885679999999998, 0.15077199999999996, 0, 8.737927915947187e-19), (-0.15077199999999996, 0.9885679999999999, 0, -2.359310663502254e-20), (-183.36446499999997, -2.1324259999999953, 0, 1) ), ( (0, 0, 1, 0), (0.9885679999999998, 0.15077199999999996, 0, 8.737927915947187e-19), (-0.15077199999999996, 0.9885679999999999, 0, -2.359310663502254e-20), (-183.36446499999997, -2.1324259999999953, 0, 1) ), ( (0, 0, 1, 0), (0.9885679999999998, 0.15077199999999996, 0, 8.737927915947187e-19), (-0.15077199999999996, 0.9885679999999999, 0, -2.359310663502254e-20), (-183.36446499999997, -2.1324259999999953, 0, 1) ), ( (0, 0, 1, 0), (0.9885679999999998, 0.15077199999999996, 0, 8.737927915947187e-19), (-0.15077199999999996, 0.9885679999999999, 0, -2.359310663502254e-20), (-183.36446499999997, -2.1324259999999953, 0, 1) ), ( (0, 0, 1, 0), (0.9885679999999998, 0.15077199999999996, 0, 8.737927915947187e-19), (-0.15077199999999996, 0.9885679999999999, 0, -2.359310663502254e-20), (-183.36446499999997, -2.1324259999999953, 0, 1) ), ( (0, 0, 1, 0), (0.9885679999999998, 0.15077199999999996, 0, 8.737927915947187e-19), (-0.15077199999999996, 0.9885679999999999, 0, -2.359310663502254e-20), (-183.36446499999997, -2.1324259999999953, 0, 1) ), ( (0, 0, 1, 0), (0.9885679999999998, 0.15077199999999996, 0, 8.737927915947187e-19), (-0.15077199999999996, 0.9885679999999999, 0, -2.359310663502254e-20), (-183.36446499999997, -2.1324259999999953, 0, 1) ), ( (0, 0, 1, 0), (0.9885679999999998, 0.15077199999999996, 0, 8.737927915947187e-19), (-0.15077199999999996, 0.9885679999999999, 0, -2.359310663502254e-20), (-183.36446499999997, -2.1324259999999953, 0, 1) ), ( (0, 0, 1, 0), (0.9885679999999998, 0.15077199999999996, 0, 8.737927915947187e-19), (-0.15077199999999996, 0.9885679999999999, 0, -2.359310663502254e-20), (-183.36446499999997, -2.1324259999999953, 0, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-168.00134291322655, 37.80400103592033, 6.709299549716066e-14, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-168.00134291322655, 37.80400103592033, 6.709299549716066e-14, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-168.00134291322655, 37.80400103592033, 6.709299549716066e-14, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-168.00134291322655, 37.80400103592033, 6.709299549716066e-14, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-168.00134291322655, 37.80400103592033, 6.709299549716066e-14, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-168.00134291322655, 37.80400103592033, 6.709299549716066e-14, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-168.00134291322655, 37.80400103592033, 6.709299549716066e-14, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-168.00134291322655, 37.80400103592033, 6.709299549716066e-14, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-145.1283971277041, 37.80400103592036, 6.01792552954133e-14, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-145.1283971277041, 37.80400103592036, 6.01792552954133e-14, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-145.1283971277041, 37.80400103592036, 6.01792552954133e-14, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-145.1283971277041, 37.80400103592036, 6.01792552954133e-14, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-145.1283971277041, 37.80400103592036, 6.01792552954133e-14, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-145.1283971277041, 37.80400103592036, 6.01792552954133e-14, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-145.1283971277041, 37.80400103592036, 6.01792552954133e-14, 1) ), ( (2.6184542800943537e-16, -2.403704977370526e-16, 1.0000000000000002, 0), (0.9976941264602543, -0.06787068606335711, -4.45290699921853e-16, 0), (0.06787068606335701, 0.9976941264602543, 4.4865429668944006e-17, 0), (-145.1283971277041, 37.80400103592036, 6.01792552954133e-14, 1) ), ( (2.7216132453750207e-16, -2.2862462198502427e-16, 1.0000000000000002, 0), (0.999713487646505, -0.023936219786376504, -4.45290699921853e-16, 0), (0.0239362197863764, 0.999713487646505, 4.486542966894401e-17, 0), (-131.14484727844393, 31.38611187527497, 5.547084149892868e-14, 1) ), ( (2.7216132453750207e-16, -2.2862462198502427e-16, 1.0000000000000002, 0), (0.999713487646505, -0.023936219786376504, -4.45290699921853e-16, 0), (0.0239362197863764, 0.999713487646505, 4.486542966894401e-17, 0), (-131.14484727844393, 31.38611187527497, 5.547084149892868e-14, 1) ), ( (2.7216132453750207e-16, -2.2862462198502427e-16, 1.0000000000000002, 0), (0.999713487646505, -0.023936219786376504, -4.45290699921853e-16, 0), (0.0239362197863764, 0.999713487646505, 4.486542966894401e-17, 0), (-131.14484727844393, 31.38611187527497, 5.547084149892868e-14, 1) ), ( (2.7216132453750207e-16, -2.2862462198502427e-16, 1.0000000000000002, 0), (0.999713487646505, -0.023936219786376504, -4.45290699921853e-16, 0), (0.0239362197863764, 0.999713487646505, 4.486542966894401e-17, 0), (-131.14484727844393, 31.38611187527497, 5.547084149892868e-14, 1) ), ( (2.7216132453750207e-16, -2.2862462198502427e-16, 1.0000000000000002, 0), (0.999713487646505, -0.023936219786376504, -4.45290699921853e-16, 0), (0.0239362197863764, 0.999713487646505, 4.486542966894401e-17, 0), (-131.14484727844393, 31.38611187527497, 5.547084149892868e-14, 1) ), ( (2.7216132453750207e-16, -2.2862462198502427e-16, 1.0000000000000002, 0), (0.999713487646505, -0.023936219786376504, -4.45290699921853e-16, 0), (0.0239362197863764, 0.999713487646505, 4.486542966894401e-17, 0), (-131.14484727844393, 31.38611187527497, 5.547084149892868e-14, 1) ), ( (2.7216132453750207e-16, -2.2862462198502427e-16, 1.0000000000000002, 0), (0.999713487646505, -0.023936219786376504, -4.45290699921853e-16, 0), (0.0239362197863764, 0.999713487646505, 4.486542966894401e-17, 0), (-131.14484727844393, 31.38611187527497, 5.547084149892868e-14, 1) ), ( (2.7216132453750207e-16, -2.2862462198502427e-16, 1.0000000000000002, 0), (0.999713487646505, -0.023936219786376504, -4.45290699921853e-16, 0), (0.0239362197863764, 0.999713487646505, 4.486542966894401e-17, 0), (-131.14484727844393, 31.38611187527497, 5.547084149892868e-14, 1) ), ( (2.7216132453750207e-16, -2.2862462198502427e-16, 1.0000000000000002, 0), (0.999713487646505, -0.023936219786376504, -4.45290699921853e-16, 0), (0.0239362197863764, 0.999713487646505, 4.486542966894401e-17, 0), (-123.39212835296787, 31.386111875274977, 5.3648194520719233e-14, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (2.7216132453750207e-16, -2.2862462198502427e-16, 1.0000000000000002, 0), (0.999713487646505, -0.023936219786376504, -4.45290699921853e-16, 0), (0.0239362197863764, 0.999713487646505, 4.486542966894401e-17, 0), (-123.39212835296787, 31.386111875274977, 5.3648194520719233e-14, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (2.7216132453750207e-16, -2.2862462198502427e-16, 1.0000000000000002, 0), (0.999713487646505, -0.023936219786376504, -4.45290699921853e-16, 0), (0.0239362197863764, 0.999713487646505, 4.486542966894401e-17, 0), (-123.39212835296787, 31.386111875274977, 5.3648194520719233e-14, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ), ( (2.7216132453750207e-16, -2.2862462198502427e-16, 1.0000000000000002, 0), (0.999713487646505, -0.023936219786376504, -4.45290699921853e-16, 0), (0.0239362197863764, 0.999713487646505, 4.486542966894401e-17, 0), (-123.39212835296787, 31.386111875274977, 5.3648194520719233e-14, 1) ), ( (2.7216132453750207e-16, -2.2862462198502427e-16, 1.0000000000000002, 0), (0.999713487646505, -0.023936219786376504, -4.45290699921853e-16, 0), (0.0239362197863764, 0.999713487646505, 4.486542966894401e-17, 0), (-123.39212835296787, 31.386111875274977, 5.3648194520719233e-14, 1) )] + rel skel:animationSource = + + def SkelAnimation "Animation" + { + uniform token[] blendShapes = ["shape1", "shape2", "shape3"] + float[] blendShapeWeights = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.040814493, 0.041623376, 0.01583821, 0.01378248, 0, 0, 0, 0] + float[] blendShapeWeights.timeSamples = { + 0: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + 2: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + 3: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + 4: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + } + uniform token[] joints = ["NonExistentJointRoot", "NonExistentJointRoot/Joint_1", "NonExistentJointRoot/Joint_1/Part_1"] + half3[] scales = [(1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1)] + } + } +} \ No newline at end of file diff --git a/package/com.unity.formats.usd/Tests/Common/Data/Invalid/NoBindingsFound.usda.meta b/package/com.unity.formats.usd/Tests/Common/Data/Invalid/NoBindingsFound.usda.meta new file mode 100644 index 000000000..3843638d3 --- /dev/null +++ b/package/com.unity.formats.usd/Tests/Common/Data/Invalid/NoBindingsFound.usda.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1a61f8a8f354bba4cb68212f4609270e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package/com.unity.formats.usd/Tests/Common/Data/Simple/reloadTest.usda b/package/com.unity.formats.usd/Tests/Common/Data/Simple/reloadTest.usda index 3ca2845a2..d80385b31 100644 --- a/package/com.unity.formats.usd/Tests/Common/Data/Simple/reloadTest.usda +++ b/package/com.unity.formats.usd/Tests/Common/Data/Simple/reloadTest.usda @@ -2,7 +2,7 @@ def Xform "TestPrim" { - double3 xformOp:translate = (1, 1, 1) + double3 xformOp:translate = (2, 2, 2) uniform token[] xformOpOrder = ["xformOp:translate"] } diff --git a/package/com.unity.formats.usd/Tests/Common/TestDataGuids.cs b/package/com.unity.formats.usd/Tests/Common/TestDataGuids.cs index 26ebca5b0..efac51876 100644 --- a/package/com.unity.formats.usd/Tests/Common/TestDataGuids.cs +++ b/package/com.unity.formats.usd/Tests/Common/TestDataGuids.cs @@ -75,5 +75,10 @@ public struct Instancer public const string UpAxisZLeftHandedUsda = "a01f0befc190ba34e9b0a5405f145a86"; // Tests/Common/Data/Instancer/UsdInstance_UpAxisZ_LeftHanded.usda public const string UpAxisZRightHandedUsda = "051b4a1cb85f6024191275df09e12fc2"; // Tests/Common/Data/Instancer/UsdInstance_UpAxisZ_RightHanded.usda } + + public struct Invalid + { + public const string InvalidContent = "1a61f8a8f354bba4cb68212f4609270e"; // Tests/Common/Data/Invalid/InvalidContent.usda + } } } diff --git a/package/com.unity.formats.usd/Tests/Common/TestUtility.cs b/package/com.unity.formats.usd/Tests/Common/TestUtility.cs index bb59065d3..977a03326 100644 --- a/package/com.unity.formats.usd/Tests/Common/TestUtility.cs +++ b/package/com.unity.formats.usd/Tests/Common/TestUtility.cs @@ -132,6 +132,15 @@ public static string CreateTmpUsdFile(string testArtifactFullPath, string fileNa return usdScenePath; } + public static USDScene CreateEmptyTestUsdScene(string testArtifactFullPath, string fileName = "testUsd.usda") + { + var dummyUsdPath = CreateTmpUsdFile(testArtifactFullPath, fileName); + var scene = ImportHelpers.InitForOpen(dummyUsdPath); + scene.Write("/emptyRoot", new XformSample()); + scene.Save(); + return scene; + } + public static USDScene CreateTestUsdScene(string testArtifactFullPath, string fileName = "testUsd.usda") { var dummyUsdPath = CreateTmpUsdFile(testArtifactFullPath, fileName); diff --git a/package/com.unity.formats.usd/Tests/Editor/EditorAnalyticsBaseFixture.cs b/package/com.unity.formats.usd/Tests/Editor/EditorAnalyticsBaseFixture.cs new file mode 100644 index 000000000..0324dd894 --- /dev/null +++ b/package/com.unity.formats.usd/Tests/Editor/EditorAnalyticsBaseFixture.cs @@ -0,0 +1,132 @@ +# if UNITY_2023_3_OR_NEWER + +using System.Collections; +using NUnit.Framework; +using UnityEditor; +using UnityEngine; +using UnityEngine.TestTools; + +namespace Unity.Formats.USD.Tests +{ + public class EditorAnalyticsBaseFixture : BaseFixtureEditor + { + protected const string k_TestPrefabName = "TestPrefab"; + protected static string[] usdExtensions = new string[] { TestUtility.FileExtension.Usd, TestUtility.FileExtension.Usda, TestUtility.FileExtension.Usdc }; + + protected struct UsdAnalyticsTypes + { + public const string Import = "editor.USDFileImport"; + public const string ReImport = "editor.USDFileReimport"; + public const string Export = "editor.USDFileExport"; + } + + public enum ImportMethods + { + AsGameObject, + AsPrefab, + AsTimelineRecording + } + + bool m_initialAnalyticsSetting; + bool m_initialRecordEventsSetting; + bool m_initialSendEventsImmediatelySetting; + + [OneTimeSetUp] + public void SetEditorAnalyticsSettings() + { + m_initialAnalyticsSetting = EditorAnalytics.enabled; + m_initialRecordEventsSetting = EditorAnalytics.recordEventsEnabled; + m_initialSendEventsImmediatelySetting = EditorAnalytics.SendAnalyticsEventsImmediately; + + EditorAnalytics.enabled = true; + EditorAnalytics.recordEventsEnabled = true; + EditorAnalytics.SendAnalyticsEventsImmediately = true; + } + + [OneTimeTearDown] + public void RevertEditorAnalyticsSettings() + { + // Maybe implmeent a package clean up here + + EditorAnalytics.enabled = m_initialAnalyticsSetting; + EditorAnalytics.recordEventsEnabled = m_initialRecordEventsSetting; + EditorAnalytics.SendAnalyticsEventsImmediately = m_initialSendEventsImmediatelySetting; + } + + [SetUp] + public void ResetEventList() + { + DebuggerEventListHandler.ClearEventList(); + InitUsd.Initialize(); + } + + public IEnumerator WaitForUsdAnalytics(string expectedType, System.Action actualEvent, float attemptTimeLimitMs = 1500) where T: UsdAnalyticsEvent + { + bool found = false; + var stopWatch = System.Diagnostics.Stopwatch.StartNew(); + + while (!found && stopWatch.Elapsed.TotalMilliseconds < attemptTimeLimitMs) + { + T expectedAnalyticsEvent = null; + foreach (var concattedEvent in DebuggerEventListHandler.fetchEventList()) + { + if (!concattedEvent.Contains(expectedType)) + { + continue; + } + + var splitEvents = concattedEvent.Split("\n"); + var usdIndex = FindUsdAnalyticsIndex(expectedType, splitEvents); + var usdEvent = JsonUtility.FromJson(splitEvents[usdIndex]); + + if (usdEvent.type.Contains(expectedType)) + { + expectedAnalyticsEvent = usdEvent; + + actualEvent(expectedAnalyticsEvent); + found = true; + break; + } + } + + DebuggerEventListHandler.ClearEventList(); + + yield return null; + } + } + + private int FindUsdAnalyticsIndex(string expectedType, string[] splitEvents) + { + for (int index = 0; index < splitEvents.Length; index++) + { + if (splitEvents[index].Contains(expectedType)) + { + return index; + } + } + + return -1; + } + } + + public class UsdAnalyticsEvent + { + public string type; + } + + public class UsdAnalyticsEventImport: UsdAnalyticsEvent + { + public UsdEditorAnalytics.ImportAnalyticsData msg; + } + + public class UsdAnalyticsEventReImport : UsdAnalyticsEvent + { + public UsdEditorAnalytics.ReimportAnalyticsData msg; + } + + public class UsdAnalyticsEventExport : UsdAnalyticsEvent + { + public UsdEditorAnalytics.ExportAnalyticsData msg; + } +} +#endif diff --git a/package/com.unity.formats.usd/Tests/Editor/EditorAnalyticsBaseFixture.cs.meta b/package/com.unity.formats.usd/Tests/Editor/EditorAnalyticsBaseFixture.cs.meta new file mode 100644 index 000000000..f93de4ede --- /dev/null +++ b/package/com.unity.formats.usd/Tests/Editor/EditorAnalyticsBaseFixture.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aae3f0aa42b7b1946918a00a5233391a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package/com.unity.formats.usd/Tests/Editor/EditorExportAnalyticsTests.cs b/package/com.unity.formats.usd/Tests/Editor/EditorExportAnalyticsTests.cs new file mode 100644 index 000000000..ddbf80553 --- /dev/null +++ b/package/com.unity.formats.usd/Tests/Editor/EditorExportAnalyticsTests.cs @@ -0,0 +1,133 @@ +# if UNITY_2023_3_OR_NEWER + +using System.Collections; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.TestTools; + +namespace Unity.Formats.USD.Tests +{ + public class EditorExportAnalyticsTests : EditorAnalyticsBaseFixture + { + static bool[] forceRebuild = new bool[] { true, false }; + static PrimitiveType[] primitiveTypes = new PrimitiveType[] { PrimitiveType.Cube, PrimitiveType.Sphere }; + + string m_USDScenePath; + + [SetUp] + public void SetUp() + { + m_USDScenePath = TestUtility.GetUSDScenePath(ArtifactsDirectoryFullPath, "EditorExportAnalyticsTests"); + } + + [UnityTest] + [Retry(3)] + // sending valid export analytics returns ok + // Analytics have correct file ending for valid files exported + // Analytics for a small / empty export are empty but valid + // Analytics for valid export contains non-zero timestamp + public IEnumerator OnValidExportPrimitiveTypeAndExtensions_AnalyticsAreSent([ValueSource("usdExtensions")] string extension, [ValueSource("primitiveTypes")] PrimitiveType primitiveType) + { + var unityGO = GameObject.CreatePrimitive(primitiveType); + ExportHelpers.ExportGameObjects(new GameObject[] { unityGO }, ExportHelpers.InitForSave(m_USDScenePath + extension), BasisTransformation.SlowAndSafe); + + UsdAnalyticsEventExport exportEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Export, waitedEvent => { + exportEvent = waitedEvent; + })); + + Assert.IsNotNull(exportEvent); + var exportUsdEventData = exportEvent.msg; + + Assert.IsTrue(exportUsdEventData.Succeeded, "Expected True for export Successful"); + Assert.AreEqual(exportUsdEventData.FileExtension, extension); + Assert.Greater(exportUsdEventData.TimeTakenMs, 0); + } + + [UnityTest] + [Retry(3)] + // Analytics for a small / empty export are empty but valid + public IEnumerator OnValidExportEmptyGameObject_AnalyticsAreSent() + { + var unityGO = new GameObject(); + ExportHelpers.ExportGameObjects(new GameObject[] { unityGO }, ExportHelpers.InitForSave(m_USDScenePath), BasisTransformation.SlowAndSafe); + + UsdAnalyticsEventExport exportEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Export, waitedEvent => { + exportEvent = waitedEvent; + })); + + Assert.IsNotNull(exportEvent); + var exportUsdEventData = exportEvent.msg; + + Assert.IsTrue(exportUsdEventData.Succeeded, "Expected True for export Successful"); + Assert.Greater(exportUsdEventData.TimeTakenMs, 0); + } + + [UnityTest] + [Retry(3)] + public IEnumerator OnInvalidExport_AnalyticsAreSent() + { + var unityGO = new GameObject(); + ExportHelpers.ExportGameObjects(new GameObject[] { unityGO }, null, BasisTransformation.SlowAndSafe); + + UsdAnalyticsEventExport exportEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Export, waitedEvent => { + exportEvent = waitedEvent; + })); + + Assert.IsNotNull(exportEvent); + var exportUsdEventData = exportEvent.msg; + + Assert.IsFalse(exportUsdEventData.Succeeded, "Expected Fail for export Successful"); + Assert.AreEqual(exportUsdEventData.TimeTakenMs, 0, "Expected 0 for export error of null USD Scene"); + Assert.IsTrue(string.IsNullOrEmpty(exportUsdEventData.FileExtension), "Expected \"\" for export error of null USD Scene"); + } + + [UnityTest] + [Retry(3)] + public IEnumerator OnValidExportTransformOverrides_AnalyticsAreSent() + { + var unityGO = new GameObject(); + var fullExportScene = ExportHelpers.InitForSave(m_USDScenePath); + + var child1 = GameObject.CreatePrimitive(PrimitiveType.Cube); + child1.transform.SetParent(unityGO.transform); + var child2 = GameObject.CreatePrimitive(PrimitiveType.Sphere); + child2.transform.SetParent(unityGO.transform); + + ExportHelpers.ExportGameObjects(new GameObject[] { unityGO }, fullExportScene, BasisTransformation.SlowAndSafe); + fullExportScene.Close(); + + UsdAnalyticsEventExport fullExportEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Export, waitedEvent => { + fullExportEvent = waitedEvent; + })); + + var fullexportUsdEventData = fullExportEvent.msg; + Assert.IsFalse(fullexportUsdEventData.OnlyOverrides, "Expected Only overrides to be False for full file export"); + + var reImportedObject = ImportHelpers.ImportSceneAsGameObject(ImportHelpers.InitForOpen(m_USDScenePath)); + foreach (Transform child in reImportedObject.transform) + { + child.localPosition = Random.insideUnitSphere; + } + + var overridesExportScene = ExportHelpers.InitForSave(m_USDScenePath + "_overs.usda"); + reImportedObject.GetComponent().ExportOverrides(overridesExportScene); + + UsdAnalyticsEventExport overridesExportEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Export, waitedEvent => { + overridesExportEvent = waitedEvent; + })); + + Assert.IsNotNull(overridesExportEvent); + var overridesExportUsdEvent = overridesExportEvent.msg; + + Assert.IsTrue(overridesExportUsdEvent.Succeeded, "Expected Only overrides Export to be successful"); + Assert.IsTrue(overridesExportUsdEvent.OnlyOverrides, "Expected Only overrides to be True"); + Assert.Greater(overridesExportUsdEvent.TimeTakenMs, 0, "Expected Only overrides export to take more than 0ms"); + } + } +} +#endif diff --git a/package/com.unity.formats.usd/Tests/Editor/EditorExportAnalyticsTests.cs.meta b/package/com.unity.formats.usd/Tests/Editor/EditorExportAnalyticsTests.cs.meta new file mode 100644 index 000000000..db1e4ef94 --- /dev/null +++ b/package/com.unity.formats.usd/Tests/Editor/EditorExportAnalyticsTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cd54d376c98b6a648a22bd59ca94946a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package/com.unity.formats.usd/Tests/Editor/EditorImportAnalyticsTests.cs b/package/com.unity.formats.usd/Tests/Editor/EditorImportAnalyticsTests.cs new file mode 100644 index 000000000..3731453a6 --- /dev/null +++ b/package/com.unity.formats.usd/Tests/Editor/EditorImportAnalyticsTests.cs @@ -0,0 +1,212 @@ +# if UNITY_2023_3_OR_NEWER + +using System.Collections; +using NUnit.Framework; +using USD.NET; +using UnityEngine.TestTools; + +namespace Unity.Formats.USD.Tests +{ + public class EditorImportAnalyticsTests : EditorAnalyticsBaseFixture + { + static ImportMethods[] importMethod = new ImportMethods[] { ImportMethods.AsGameObject, ImportMethods.AsPrefab, ImportMethods.AsTimelineRecording }; + + Scene m_scene; + + [UnityTest] + [Retry(3)] + // sending valid import analytics returns ok + // Analytics have correct file ending for valid files imported + // Analytics for valid import contains non-zero timestamp + public IEnumerator OnValidImportExtensions_AnalyticsAreSent([ValueSource("importMethod")] ImportMethods importMethod, [ValueSource("usdExtensions")] string extension) + { + m_scene = TestUtility.CreateTestUsdScene(ArtifactsDirectoryFullPath, "testFile" + extension); + ImportAs(m_scene, importMethod); + + UsdAnalyticsEventImport importEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Import, waitedEvent => { + importEvent = waitedEvent; + })); + + Assert.IsNotNull(importEvent); + + var importUsdEventData = importEvent.msg; + Assert.IsTrue(importUsdEventData.Succeeded, "Expected True for import successful"); + Assert.AreEqual(extension, importUsdEventData.FileExtension, "Expected file extension was incorrect"); + Assert.Greater(importUsdEventData.TimeTakenMs, 0, "Time Taken MS was reported to be 0 or less"); + } + + [UnityTest] + [Retry(3)] + // Analytics for a mesh 'contains mesh' + public IEnumerator OnValidImportMeshedScene_AnalyticsAreSent([ValueSource("importMethod")] ImportMethods importMethod) + { + m_scene = OpenUSDGUIDAssetScene(TestDataGuids.Material.SimpleMaterialUsd, out _); + ImportAs(m_scene, importMethod); + + UsdAnalyticsEventImport importEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Import, waitedEvent => { + importEvent = waitedEvent; + })); + + Assert.IsNotNull(importEvent); + + var importUsdEventMsg = importEvent.msg; + Assert.IsTrue(importUsdEventMsg.Succeeded, "Expected True for import successful"); + Assert.Greater(importUsdEventMsg.TimeTakenMs, 0, "Time Taken MS was reported to be 0 or less"); + + // Import as Timeline recording does not include meshes, materials, skels, or point instancers + var includesMeshes = importMethod != ImportMethods.AsTimelineRecording; + Assert.AreEqual(importUsdEventMsg.IncludesMeshes, includesMeshes, $"Expected Includes Meshes to be {includesMeshes}"); + } + + [UnityTest] + [Retry(3)] + // Analytics for a mesh 'contains material' + public IEnumerator OnValidImportSceneWithMaterial_AnalyticsAreSent() + { + m_scene = OpenUSDGUIDAssetScene(TestDataGuids.Material.SimpleMaterialUsd, out _); + ImportHelpers.ImportSceneAsGameObject(m_scene, null, new SceneImportOptions() { materialImportMode = MaterialImportMode.ImportPreviewSurface }); + + UsdAnalyticsEventImport importEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Import, waitedEvent => { + importEvent = waitedEvent; + })); + + Assert.IsNotNull(importEvent); + + var importUsdEventMsg = importEvent.msg; + Assert.IsTrue(importUsdEventMsg.Succeeded, "Expected True for import successful"); + Assert.Greater(importUsdEventMsg.TimeTakenMs, 0, "Time Taken MS was reported to be 0 or less"); + Assert.IsTrue(importUsdEventMsg.IncludesMeshes, "Expected Includes Meshes to be True"); + Assert.IsTrue(importUsdEventMsg.IncludesMaterials, "Expected Includes Materials to be True"); + } + + [UnityTest] + [Retry(3)] + // Analytics for valid import contains non-zero timestamp + // Analytics for a small / empty import are empty but valid + public IEnumerator OnValidImportEmptyScene_AnalyticsAreSent([ValueSource("importMethod")] ImportMethods importMethod, [ValueSource("usdExtensions")] string extension) + { + m_scene = TestUtility.CreateEmptyTestUsdScene(ArtifactsDirectoryFullPath, "testFile" + extension); + ImportAs(m_scene, importMethod); + + UsdAnalyticsEventImport importEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Import, waitedEvent => { + importEvent = waitedEvent; + })); + + Assert.IsNotNull(importEvent); + + var importUsdEventMsg = importEvent.msg; + Assert.IsTrue(importUsdEventMsg.Succeeded, "Expected True for import Successful"); + Assert.AreEqual(extension, importUsdEventMsg.FileExtension, "Expected file extension was incorrect"); + Assert.Greater(importUsdEventMsg.TimeTakenMs, 0, "Expected Time Taken MS should be greater than 0"); + Assert.IsFalse(importUsdEventMsg.IncludesMeshes, "Expected Includes Meshes from Empty file to be False"); + Assert.IsFalse(importUsdEventMsg.IncludesMaterials, "Expected Includes Materials from Empty file to be False"); + Assert.IsFalse(importUsdEventMsg.IncludesSkel, "Expected Includes Skel from Empty file to be False"); + Assert.IsFalse(importUsdEventMsg.IncludesPointInstancer, "Expected Includes Point Instancers from Empty file to be False"); + } + + [UnityTest] + [Retry(3)] + // Analytics for a failed import have correct status + public IEnumerator OnFailedImportNullFile_AnalyticsAreSent() + { + Assert.Throws(() => SceneImporter.ImportUsd(null, null, null, new SceneImportOptions())); + UsdAnalyticsEventImport importEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Import, waitedEvent => { + importEvent = waitedEvent; + })); + + Assert.IsNotNull(importEvent); + + var importUsdEventMsg = importEvent.msg; + Assert.IsFalse(importUsdEventMsg.Succeeded, "Expected False for import Successful"); + } + + [UnityTest] + [Retry(3)] + // Analytics for failed import contains non-zero timestamp + public IEnumerator OnFailedImportUnsupportedFileContent_AnalyticsAreSent() + { + LogAssert.ignoreFailingMessages = true; // Expecting a bunch of errors on import + + m_scene = OpenUSDGUIDAssetScene(TestDataGuids.Invalid.InvalidContent, out _); + ImportHelpers.ImportSceneAsGameObject(m_scene); + + UsdAnalyticsEventImport importEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Import, waitedEvent => { + importEvent = waitedEvent; + })); + + Assert.IsNotNull(importEvent); + + var importUsdEventMsg = importEvent.msg; + Assert.IsFalse(importUsdEventMsg.Succeeded, "Expected False for import Successful"); + Assert.Greater(importUsdEventMsg.TimeTakenMs, 0, "Expected Time Taken MS should be greater than 0"); + } + + [UnityTest] + [Retry(3)] + // Analytics for a PointInstancer 'contains pointinstancer' + public IEnumerator OnValidImportPointInstancerScene_AnalyticsAreSent() + { + m_scene = OpenUSDGUIDAssetScene(TestDataGuids.Instancer.PointInstancedUsda, out _); + ImportHelpers.ImportSceneAsGameObject(m_scene); + + UsdAnalyticsEventImport importEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Import, waitedEvent => { + importEvent = waitedEvent; + })); + + Assert.IsNotNull(importEvent); + + var importUsdEventMsg = importEvent.msg; + Assert.IsTrue(importUsdEventMsg.Succeeded, "Expected True for import Successful"); + Assert.Greater(importUsdEventMsg.TimeTakenMs, 0, "Expected Time Taken MS should be greater than 0"); + Assert.IsTrue(importUsdEventMsg.IncludesPointInstancer, "Expected Includes Point Instancers to be True"); + } + + [UnityTest] + [Retry(3)] + // Analytics for a skeleton 'contains skeleton' + public IEnumerator OnValidImportSkelScene_AnalyticsAreSent() + { + // TestDataGuids.Mesh.SkinnedMeshUsda contains USDSkel attribute + m_scene = OpenUSDGUIDAssetScene(TestDataGuids.Mesh.SkinnedMeshUsda, out _); + ImportHelpers.ImportSceneAsGameObject(m_scene); + + UsdAnalyticsEventImport importEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Import, waitedEvent => { + importEvent = waitedEvent; + })); + + Assert.IsNotNull(importEvent); + + var importUsdEventMsg = importEvent.msg; + Assert.IsTrue(importUsdEventMsg.Succeeded, "Expected True for import Successful"); + Assert.Greater(importUsdEventMsg.TimeTakenMs, 0, "Expected Time Taken MS should be greater than 0"); + Assert.IsTrue(importUsdEventMsg.IncludesSkel, "Expected Includes Skel to be True"); + } + + protected void ImportAs(Scene scene, ImportMethods importMethod) + { + switch (importMethod) + { + case ImportMethods.AsPrefab: + ImportHelpers.ImportAsPrefab(scene, TestUtility.GetPrefabPath(ArtifactsDirectoryRelativePath, k_TestPrefabName)); + break; + + case ImportMethods.AsTimelineRecording: + ImportHelpers.ImportAsTimelineClip(scene, TestUtility.GetPrefabPath(ArtifactsDirectoryRelativePath, k_TestPrefabName)); + break; + + case ImportMethods.AsGameObject: + ImportHelpers.ImportSceneAsGameObject(scene); + break; + } + } + } +} +#endif diff --git a/package/com.unity.formats.usd/Tests/Editor/EditorImportAnalyticsTests.cs.meta b/package/com.unity.formats.usd/Tests/Editor/EditorImportAnalyticsTests.cs.meta new file mode 100644 index 000000000..3144d2b42 --- /dev/null +++ b/package/com.unity.formats.usd/Tests/Editor/EditorImportAnalyticsTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5ce2beda529e9c1418f41e241dac74f9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package/com.unity.formats.usd/Tests/Editor/EditorReImportAnalyticsTests.cs b/package/com.unity.formats.usd/Tests/Editor/EditorReImportAnalyticsTests.cs new file mode 100644 index 000000000..bb178c1d7 --- /dev/null +++ b/package/com.unity.formats.usd/Tests/Editor/EditorReImportAnalyticsTests.cs @@ -0,0 +1,149 @@ +# if UNITY_2023_3_OR_NEWER + +using System.Collections; +using NUnit.Framework; +using USD.NET; +using UnityEngine.TestTools; + +namespace Unity.Formats.USD.Tests +{ + public class EditorReImportAnalyticsTests : EditorAnalyticsBaseFixture + { + static bool[] forceRebuild = new bool[] { true, false }; + static string[] testFileGUIDs = new string[] { + TestDataGuids.Material.SimpleMaterialUsd, + TestDataGuids.Instancer.PointInstancedUsda, + TestDataGuids.Mesh.SkinnedMeshUsda + }; + + Scene m_scene; + + [UnityTest] + [Retry(3)] + // Analytics have correct file ending for valid files re-imported + // Analytics for valid re-import contains non-zero timestamp + public IEnumerator OnValidReImportForceRebuild_AnalyticsAreSent([ValueSource("forceRebuild")] bool forceRebuild) + { + m_scene = TestUtility.CreateEmptyTestUsdScene(ArtifactsDirectoryFullPath); + var importedObject = ImportHelpers.ImportSceneAsGameObject(m_scene); + importedObject.GetComponent().Reload(forceRebuild); + + UsdAnalyticsEventReImport reImportEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.ReImport, waitedEvent => { + reImportEvent = waitedEvent; + })); + + Assert.IsNotNull(reImportEvent); + var reImportUsdEventMsg = reImportEvent.msg; + + Assert.IsTrue(reImportUsdEventMsg.Succeeded, "Expected True for re-import Successful"); + Assert.AreEqual(reImportUsdEventMsg.ForceRebuild, forceRebuild, "Expected True for re-import Successful"); + Assert.Greater(reImportUsdEventMsg.TimeTakenMs, 0, "Expected Time Taken MS should be greater than 0 for Re-Import"); + } + + [UnityTest] + [Retry(3)] + // Analytics have correct file ending for valid files re-imported + // Analytics for valid re-import contains non-zero timestamp + public IEnumerator OnValidReImportExtensions_AnalyticsAreSent([ValueSource("usdExtensions")] string extension) + { + m_scene = TestUtility.CreateTestUsdScene(ArtifactsDirectoryFullPath, "testFile" + extension); + var importedObject = ImportHelpers.ImportSceneAsGameObject(m_scene); + + UsdAnalyticsEventImport importEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Import, waitedEvent => { + importEvent = waitedEvent; + })); + + Assert.IsNotNull(importEvent); + + var importUsdEventMsg = importEvent.msg; + + importedObject.GetComponent().Reload(false); + + UsdAnalyticsEventReImport reImportEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.ReImport, waitedEvent => { + reImportEvent = waitedEvent; + })); + + Assert.IsNotNull(reImportEvent); + var reImportUsdEventMsg = reImportEvent.msg; + + Assert.IsTrue(reImportUsdEventMsg.Succeeded, "Expected True for re-import Successful"); + Assert.Greater(reImportUsdEventMsg.TimeTakenMs, 0, "Expected Time Taken MS should be greater than 0 for Re-Import"); + Assert.AreEqual(extension, reImportUsdEventMsg.FileExtension, "Expected file extension was incorrect"); + Assert.AreEqual(importUsdEventMsg.FileExtension, reImportUsdEventMsg.FileExtension); + } + + [UnityTest] + [Retry(3)] + // ReImport with ImportPreviewSurface will set IncludesMaterials to be True + public IEnumerator OnValidReImportMaterialsGenerated_AnalyticsAreSent() + { + m_scene = OpenUSDGUIDAssetScene(TestDataGuids.Material.SimpleMaterialUsd, out _); + + var importedObject = ImportHelpers.ImportSceneAsGameObject(m_scene); + UsdAnalyticsEventImport importEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Import, waitedEvent => { + importEvent = waitedEvent; + })); + + Assert.IsNotNull(importEvent); + + var importUsdEventMsg = ((UsdAnalyticsEventImport)importEvent).msg; + Assert.IsTrue(importUsdEventMsg.Succeeded, "Expected True for import Successful"); + Assert.IsFalse(importUsdEventMsg.IncludesMaterials, "Expected Includes Materials to be False initially"); + + importedObject.GetComponent().m_materialImportMode = MaterialImportMode.ImportPreviewSurface; + importedObject.GetComponent().Reload(false); + + UsdAnalyticsEventReImport reImportEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.ReImport, waitedEvent => { + reImportEvent = waitedEvent; + })); + + Assert.IsNotNull(reImportEvent); + var reImportUsdEventMsg = reImportEvent.msg; + + Assert.IsTrue(reImportUsdEventMsg.Succeeded, "Expected True for re-import Successful"); + Assert.Greater(reImportUsdEventMsg.TimeTakenMs, 0, "Expected Time Taken MS should be greater than 0 for Re-Import"); + Assert.IsTrue(reImportUsdEventMsg.IncludesMaterials, "Expected Includes Materials to be True on ReImport with ImportPreviewSurface setting for Material"); + } + + [UnityTest] + [Retry(3)] + // ReImport doesnt have different values for the following Includes: PointInstancer, Meshes, Skel + public IEnumerator OnValidReImportAndImportPropertiesAreEqual_AnalyticsAreSent([ValueSource("testFileGUIDs")] string testFileGUID) + { + m_scene = OpenUSDGUIDAssetScene(testFileGUID, out _); + + var importedObject = ImportHelpers.ImportSceneAsGameObject(m_scene); + UsdAnalyticsEventImport importEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.Import, waitedEvent => { + importEvent = waitedEvent; + })); + + Assert.IsNotNull(importEvent); + + var importUsdEventMsg = importEvent.msg; + + importedObject.GetComponent().m_materialImportMode = MaterialImportMode.ImportPreviewSurface; + importedObject.GetComponent().Reload(false); + + UsdAnalyticsEventReImport reImportEvent = null; + yield return (WaitForUsdAnalytics(UsdAnalyticsTypes.ReImport, waitedEvent => { + reImportEvent = waitedEvent; + })); + + Assert.IsNotNull(reImportEvent); + var reImportUsdEventMsg = reImportEvent.msg; + + Assert.IsTrue(reImportUsdEventMsg.Succeeded, "Expected True for re-import Successful"); + Assert.Greater(reImportUsdEventMsg.TimeTakenMs, 0, "Expected Time Taken MS should be greater than 0 for Re-Import"); + Assert.AreEqual(importUsdEventMsg.IncludesSkel, reImportUsdEventMsg.IncludesSkel); + Assert.AreEqual(importUsdEventMsg.IncludesPointInstancer, reImportUsdEventMsg.IncludesPointInstancer); + Assert.AreEqual(importUsdEventMsg.IncludesMeshes, reImportUsdEventMsg.IncludesMeshes); + } + } +} +#endif diff --git a/package/com.unity.formats.usd/Tests/Editor/EditorReImportAnalyticsTests.cs.meta b/package/com.unity.formats.usd/Tests/Editor/EditorReImportAnalyticsTests.cs.meta new file mode 100644 index 000000000..0d9919002 --- /dev/null +++ b/package/com.unity.formats.usd/Tests/Editor/EditorReImportAnalyticsTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 19891ce1a462f354689db870eaf249a2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package/com.unity.formats.usd/Tests/Editor/Unity.Formats.USD.Tests.Editor.asmdef b/package/com.unity.formats.usd/Tests/Editor/Unity.Formats.USD.Tests.Editor.asmdef index 633f05628..4c8a4d1c4 100644 --- a/package/com.unity.formats.usd/Tests/Editor/Unity.Formats.USD.Tests.Editor.asmdef +++ b/package/com.unity.formats.usd/Tests/Editor/Unity.Formats.USD.Tests.Editor.asmdef @@ -1,5 +1,6 @@ { "name": "Unity.Formats.USD.Tests.Editor", + "rootNamespace": "", "references": [ "USD.NET", "USD.NET.Unity", @@ -8,7 +9,9 @@ "Unity.Formats.USD.Tests.Common", "Unity.Formats.USD.Common", "UnityEngine.TestRunner", - "UnityEditor.TestRunner" + "UnityEditor.TestRunner", + "Unity.Recorder", + "Unity.Recorder.Editor" ], "includePlatforms": [ "Editor"