initial commit

This commit is contained in:
Jo 2025-01-07 02:06:59 +01:00
parent 6715289efe
commit 788c3389af
37645 changed files with 2526849 additions and 80 deletions

View file

@ -0,0 +1,141 @@
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using NUnit.Framework;
using UnityEditor.AddressableAssets.Build;
using UnityEditor.AddressableAssets.Build.AnalyzeRules;
using UnityEditor.AddressableAssets.Build.BuildPipelineTasks;
using UnityEditor.AddressableAssets.Build.DataBuilders;
using UnityEditor.AddressableAssets.Settings;
using UnityEditor.AddressableAssets.Settings.GroupSchemas;
using UnityEditor.AddressableAssets.Tests;
using UnityEditor.Build.Pipeline;
using UnityEditor.Build.Pipeline.Injector;
using UnityEngine;
namespace UnityEditor.AddressableAssets.Tests.AnalyzeRules
{
[TestFixture]
public class AnalyzeRuleBaseTests : AddressableAssetTestBase
{
[Test]
public void ConvertBundleNamesToGroupNames()
{
var bundleName = "2398471298347129034_bundlename_1";
var fakeFileName = "archive://3912983hf9sdf902340jidf";
var convertedBundleName = "group1_bundlename_1";
var group = Settings.CreateGroup("group1", false, false, false, null, typeof(BundledAssetGroupSchema));
AddressableAssetsBuildContext context = new AddressableAssetsBuildContext();
context.Settings = Settings;
context.assetGroupToBundles = new Dictionary<AddressableAssetGroup, List<string>>()
{
{group, new List<string>() {bundleName}}
};
BundleRuleBase baseRule = new BundleRuleBase();
baseRule.m_ExtractData = new ExtractDataTask();
var field = typeof(ExtractDataTask).GetField("m_WriteData", BindingFlags.NonPublic | BindingFlags.Instance);
field.SetValue(baseRule.m_ExtractData, new BundleWriteData());
baseRule.m_AllBundleInputDefs.Add(new AssetBundleBuild()
{
assetBundleName = bundleName
});
baseRule.m_ExtractData.WriteData.FileToBundle.Add(fakeFileName, bundleName);
baseRule.ConvertBundleNamesToGroupNames(context);
Assert.AreEqual(convertedBundleName, baseRule.m_ExtractData.WriteData.FileToBundle[fakeFileName]);
Settings.RemoveGroup(group);
}
[Test]
public void BaseAnalyzeRule_DoesNotThrowOnFix()
{
BundleRuleBase baseRule = new BundleRuleBase();
Assert.DoesNotThrow(() => baseRule.FixIssues(Settings));
}
class TestBaseRule : BundleRuleBase
{
public override string ruleName => "TestBaseRule";
}
class TestInheritedRule : TestBaseRule
{
public override string ruleName => "TestInheritedRule";
}
[Test]
public void AnalyzeSystem_CanRegisterInheritedRule()
{
int currentCount = AnalyzeSystem.Rules.Count;
AnalyzeSystem.RegisterNewRule<TestBaseRule>();
AnalyzeSystem.RegisterNewRule<TestInheritedRule>();
Assert.AreEqual(currentCount + 2, AnalyzeSystem.Rules.Count);
Assert.AreEqual(typeof(TestBaseRule), AnalyzeSystem.Rules[currentCount].GetType());
Assert.AreEqual(typeof(TestInheritedRule), AnalyzeSystem.Rules[currentCount + 1].GetType());
AnalyzeSystem.Rules.RemoveAt(currentCount + 1);
AnalyzeSystem.Rules.RemoveAt(currentCount);
}
[Test]
public void AnalyzeSystem_CannotRegisterDuplicateRule()
{
int currentCount = AnalyzeSystem.Rules.Count;
AnalyzeSystem.RegisterNewRule<TestBaseRule>();
AnalyzeSystem.RegisterNewRule<TestBaseRule>();
Assert.AreEqual(currentCount + 1, AnalyzeSystem.Rules.Count);
AnalyzeSystem.Rules.RemoveAt(currentCount);
}
[Test]
public void AnalyzeSystem_CanSaveAndLoad()
{
string path = GetAssetPath("analysis.json");
if (File.Exists(path))
File.Delete(path);
int currentCount = AnalyzeSystem.Rules.Count;
AnalyzeSystem.RegisterNewRule<TestBaseRule>();
AnalyzeSystem.ClearAnalysis<TestBaseRule>();
try
{
AnalyzeSystem.SerializeData(path);
Assert.IsTrue(File.Exists(path));
string json = File.ReadAllText(path);
Assert.IsTrue(json.Contains("\"RuleName\":\"TestBaseRule\",\"Results\":[]"));
json = json.Replace("\"TestBaseRule\",\"Results\":[", "\"TestBaseRule\",\"Results\":[{\"m_ResultName\":\"someFakeResult\",\"m_Severity\":0}");
File.WriteAllText(path, json);
AnalyzeSystem.AnalyzeData.Data.TryGetValue(
"TestBaseRule", out var results);
Assert.IsFalse(results.Any(r => r.resultName == "someFakeResult"));
AnalyzeSystem.DeserializeData(path);
Assert.IsTrue(AnalyzeSystem.AnalyzeData.Data.TryGetValue(
"TestBaseRule", out results));
Assert.IsTrue(results.Count > 0);
Assert.AreEqual("someFakeResult", results[0].resultName);
}
finally
{
//cleanup
AnalyzeSystem.Rules.RemoveAt(currentCount);
if (File.Exists(path))
File.Delete(path);
}
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 774cd729e4d232a45a38ea35fed32c81
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,331 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using NUnit.Framework;
using UnityEditor.AddressableAssets.Build;
using UnityEditor.AddressableAssets.Build.AnalyzeRules;
using UnityEditor.AddressableAssets.Build.DataBuilders;
using UnityEditor.AddressableAssets.GUI;
using UnityEditor.AddressableAssets.Settings;
using UnityEditor.AddressableAssets.Settings.GroupSchemas;
using UnityEditor.Build.Pipeline;
using UnityEngine;
using UnityEngine.AddressableAssets.Initialization;
namespace UnityEditor.AddressableAssets.Tests.AnalyzeRules
{
class CheckBundleDupeDependencyTests : AddressableAssetTestBase
{
string k_CheckDupePrefabA => GetAssetPath("checkDupe_prefabA.prefab");
string k_CheckDupePrefabB => GetAssetPath("checkDupe_prefabB.prefab");
string k_CheckDupeMyMaterial => GetAssetPath("checkDupe_myMaterial.mat");
protected override void OnInit()
{
base.OnInit();
GameObject prefabA = new GameObject("PrefabA");
GameObject prefabB = new GameObject("PrefabB");
var meshA = prefabA.AddComponent<MeshRenderer>();
var meshB = prefabB.AddComponent<MeshRenderer>();
var mat = new Material(Shader.Find("Unlit/Color"));
AssetDatabase.CreateAsset(mat, k_CheckDupeMyMaterial);
meshA.sharedMaterial = mat;
meshB.sharedMaterial = mat;
PrefabUtility.SaveAsPrefabAsset(prefabA, k_CheckDupePrefabA);
PrefabUtility.SaveAsPrefabAsset(prefabB, k_CheckDupePrefabB);
AssetDatabase.Refresh();
}
private AddressableAssetsBuildContext GetAddressableAssetsBuildContext(CheckBundleDupeDependencies rule)
{
ResourceManagerRuntimeData runtimeData = new ResourceManagerRuntimeData();
runtimeData.LogResourceManagerExceptions = Settings.buildSettings.LogResourceManagerExceptions;
var aaContext = new AddressableAssetsBuildContext
{
Settings = Settings,
runtimeData = runtimeData,
bundleToAssetGroup = rule.m_BundleToAssetGroup,
locations = rule.m_Locations,
assetEntries = new List<AddressableAssetEntry>()
};
return aaContext;
}
[Test]
public void CheckDupeCanFixIssues()
{
var duplicateGroups = Settings.groups.Where(group => group.Name.Contains("Duplicate Asset Isolation"));
foreach (AddressableAssetGroup group in duplicateGroups)
Settings.groups.Remove(group);
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
var group2 = Settings.CreateGroup("CheckDupeDepencency2", false, false, false, null, typeof(BundledAssetGroupSchema));
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabB), group2, false, false);
var matGuid = AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial);
Assert.IsNull(group1.GetAssetEntry(matGuid));
Assert.IsNull(group2.GetAssetEntry(matGuid));
var groupCount = Settings.groups.Count;
var rule = new CheckBundleDupeDependencies();
rule.FixIssues(Settings);
Assert.AreEqual(groupCount + 1, Settings.groups.Count);
var dupeGroup = Settings.FindGroup("Duplicate Asset Isolation");
Assert.IsNotNull(dupeGroup);
Assert.IsNotNull(dupeGroup.GetAssetEntry(matGuid));
//Cleanup
Settings.RemoveGroup(group1);
Settings.RemoveGroup(group2);
}
[Test]
public void CheckDupeNoIssuesIfValid()
{
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
var group2 = Settings.CreateGroup("CheckDupeDepencency2", false, false, false, null, typeof(BundledAssetGroupSchema));
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabB), group2, false, false);
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial), group2, false, false);
var groupCount = Settings.groups.Count;
var rule = new CheckBundleDupeDependencies();
rule.FixIssues(Settings);
Assert.AreEqual(groupCount, Settings.groups.Count);
//Cleanup
Settings.RemoveGroup(group1);
Settings.RemoveGroup(group2);
}
[Test]
public void UniqueAssetBundleBuild_IsCreatedWithCorrectData()
{
string bundleName = "myBundleName.bundle";
string assetGroup = "assetGroup";
var rule = new CheckBundleDupeDependencies();
rule.m_BundleToAssetGroup.Add(bundleName, assetGroup);
AssetBundleBuild build = new AssetBundleBuild {assetBundleName = bundleName};
for (int i = 1; i < 500; i++)
{
AssetBundleBuild uniqueBundle = rule.CreateUniqueBundle(build);
Assert.AreEqual(string.Format("myBundleName{0}.bundle", i), uniqueBundle.assetBundleName);
rule.m_BundleToAssetGroup.Add(uniqueBundle.assetBundleName, assetGroup);
}
}
[Test]
public void RefreshBuild_ReturnsSuccess()
{
var rule = new CheckBundleDupeDependencies();
AddressableAssetsBuildContext context = GetAddressableAssetsBuildContext(rule);
Assert.AreEqual(ReturnCode.Success, rule.RefreshBuild(context));
}
[Test]
public void BuildImplicitDuplicatedAssetsSet_BuildCorrectImplicitAssets()
{
//Setup
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
var group2 = Settings.CreateGroup("CheckDupeDepencency2", false, false, false, null, typeof(BundledAssetGroupSchema));
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabB), group2, false, false);
GUID matGuid;
var matGuidString = AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial);
GUID.TryParse(matGuidString, out matGuid);
var rule = new CheckBundleDupeDependencies();
var buildContext = rule.GetBuildContext(Settings);
rule.CalculateInputDefinitions(Settings);
rule.RefreshBuild(buildContext);
var implicitGuids = rule.GetImplicitGuidToFilesMap();
var results = rule.CalculateDuplicates(implicitGuids, buildContext);
//Test
rule.BuildImplicitDuplicatedAssetsSet(results);
//Assert
Assert.AreEqual(1, rule.m_ImplicitAssets.Count);
Assert.IsTrue(rule.m_ImplicitAssets.Contains(matGuid));
//Cleanup
Settings.RemoveGroup(group1);
Settings.RemoveGroup(group2);
}
[Test]
public void CalculateDuplicates_DoesNotIncludeSameBundleReferencedMultipleTimes()
{
//Setup
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
var rule = new CheckBundleDupeDependencies();
var buildContext = rule.GetBuildContext(Settings);
rule.CalculateInputDefinitions(Settings);
rule.RefreshBuild(buildContext);
var implicitGuids = rule.GetImplicitGuidToFilesMap();
var key = implicitGuids.Keys.First();
implicitGuids[key].Add(implicitGuids[key][0]);
//Test
var results = rule.CalculateDuplicates(implicitGuids, buildContext).ToList();
//Assert
Assert.AreEqual(0, results.Count);
//Cleanup
Settings.RemoveGroup(group1);
}
[Test]
public void CalculateInputDefinitions_CalculatesAllInputDefintions()
{
//Setup
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
var group2 = Settings.CreateGroup("CheckDupeDepencency2", false, false, false, null, typeof(BundledAssetGroupSchema));
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabB), group2, false, false);
GUID matGuid;
var matGuidString = AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial);
GUID.TryParse(matGuidString, out matGuid);
var rule = new CheckBundleDupeDependencies();
//Test
rule.CalculateInputDefinitions(Settings);
//Assert
Assert.AreEqual(2, rule.m_AllBundleInputDefs.Count);
//Cleanup
Settings.RemoveGroup(group1);
Settings.RemoveGroup(group2);
}
[Test]
public void CalculateDuplicates_ReturnsCorrectCheckDupeResultList()
{
//Setup
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
var group2 = Settings.CreateGroup("CheckDupeDepencency2", false, false, false, null, typeof(BundledAssetGroupSchema));
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabB), group2, false, false);
GUID matGuid;
var matGuidString = AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial);
GUID.TryParse(matGuidString, out matGuid);
var rule = new CheckBundleDupeDependencies();
var buildContext = rule.GetBuildContext(Settings);
rule.CalculateInputDefinitions(Settings);
rule.RefreshBuild(buildContext);
var implicitGuids = rule.GetImplicitGuidToFilesMap();
//Test
var dupeResults = rule.CalculateDuplicates(implicitGuids, buildContext).ToList();
//Assert
Assert.AreEqual(2, dupeResults.Count);
Assert.AreEqual(group1.Name, dupeResults[0].Group.Name);
Assert.AreEqual(k_CheckDupeMyMaterial, dupeResults[0].AssetPath);
Assert.AreEqual(group2.Name, dupeResults[1].Group.Name);
Assert.AreEqual(k_CheckDupeMyMaterial, dupeResults[1].AssetPath);
//Cleanup
Settings.RemoveGroup(group1);
Settings.RemoveGroup(group2);
}
[Test]
public void DupeGroupHasContentUpdateSchema()
{
//Setup
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
var group2 = Settings.CreateGroup("CheckDupeDepencency2", false, false, false, null, typeof(BundledAssetGroupSchema));
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabB), group2, false, false);
var rule = new CheckBundleDupeDependencies();
//Test
rule.FixIssues(Settings);
AddressableAssetGroup group = Settings.FindGroup("Duplicate Asset Isolation");
//Assert
Assert.IsNotNull(group);
Assert.IsTrue(group.HasSchema<ContentUpdateGroupSchema>());
Assert.IsTrue(group.GetSchema<ContentUpdateGroupSchema>().StaticContent);
//Cleanup
Settings.RemoveGroup(group);
}
[Test]
public void CheckForDuplicateDependencies_WorksWithNoAddressableAssets()
{
//Setup
var settings = AddressableAssetSettings.Create(ConfigFolder, k_TestConfigName + "_NoAssets", false, false);
//Test
var rule = new CheckBundleDupeDependencies();
//Assert
Assert.DoesNotThrow(() => rule.FixIssues(settings));
}
#if CI_TESTRUNNER_PROJECT
[Test]
public void GatherModifiedEntriesOnDupeGroup_DoesNotThrow()
{
//Setup
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
var group2 = Settings.CreateGroup("CheckDupeDepencency2", false, false, false, null, typeof(BundledAssetGroupSchema));
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabB), group2, false, false);
var rule = new CheckBundleDupeDependencies();
//Test
rule.FixIssues(Settings);
var path = "Assets/addressables_content_state.bin";
Assert.DoesNotThrow(() =>
{
ContentUpdateScript.GatherModifiedEntries(Settings, path);
});
}
#endif
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6719223fb1e7d804091db79ce4200b50
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,113 @@
using System.Collections;
using System.Collections.Generic;
using System.IO;
using NUnit.Framework;
using UnityEditor.AddressableAssets.Build.AnalyzeRules;
using UnityEngine;
namespace UnityEditor.AddressableAssets.Tests.AnalyzeRules
{
public class CheckResourcesDupeDependenciesTests : AddressableAssetTestBase
{
string k_CheckDupePrefabA => GetAssetPath("checkDupe_prefabA.prefab");
string k_CheckDupePrefabB => GetAssetPath("checkDupe_prefabB.prefab");
string k_CheckDupeMyMaterial => GetAssetPath("checkDupe_myMaterial.mat");
string k_PrefabWithMaterialPath => GetAssetPath("checkDupe_prefabWithMaterial.prefab");
protected override void OnInit()
{
base.OnInit();
GameObject prefabA = new GameObject("PrefabA");
GameObject prefabB = new GameObject("PrefabB");
GameObject prefabWithMaterial = new GameObject("PrefabWithMaterial");
var meshA = prefabA.AddComponent<MeshRenderer>();
var meshB = prefabB.AddComponent<MeshRenderer>();
var mat = new Material(Shader.Find("Unlit/Color"));
AssetDatabase.CreateAsset(mat, k_CheckDupeMyMaterial);
meshA.sharedMaterial = mat;
meshB.sharedMaterial = mat;
var meshPrefabWithMaterial = prefabWithMaterial.AddComponent<MeshRenderer>();
meshPrefabWithMaterial.material = AssetDatabase.LoadAssetAtPath<Material>(k_CheckDupeMyMaterial);
PrefabUtility.SaveAsPrefabAsset(prefabA, k_CheckDupePrefabA);
PrefabUtility.SaveAsPrefabAsset(prefabB, k_CheckDupePrefabB);
PrefabUtility.SaveAsPrefabAsset(prefabWithMaterial, k_PrefabWithMaterialPath);
AssetDatabase.Refresh();
}
[Test]
public void CheckResourcesDupe_GetsCorrectResourcePaths()
{
string resourcesPath = GetAssetPath("Resources");
if (!Directory.Exists(resourcesPath))
Directory.CreateDirectory(resourcesPath);
string prefabPath = GetAssetPath("Resources/PrefabA.prefab");
GameObject prefabA = new GameObject("PrefabA");
PrefabUtility.SaveAsPrefabAsset(prefabA, prefabPath);
var rule = new CheckResourcesDupeDependencies();
var paths = rule.GetResourcePaths();
bool success = false;
foreach (var p in paths)
{
if (p.EndsWith("PrefabA.prefab"))
{
success = true;
break;
}
}
Assert.IsTrue(success, "CheckResourcesDupeDependencies ResourcePaths did not find the created prefab for test as expect.");
}
[Test]
public void CheckResourcesDupe_ResourcesDependenciesMatchWithExplicitBundleDependencies()
{
var rule = new CheckResourcesDupeDependencies();
rule.BuiltInResourcesToDependenciesMap(new string[] {k_CheckDupePrefabA});
rule.IntersectResourcesDepedenciesWithBundleDependencies(new List<GUID>()
{
new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA))
});
Assert.IsTrue(rule.m_ResourcesToDependencies.ContainsKey(k_CheckDupePrefabA));
Assert.AreEqual(1, rule.m_ResourcesToDependencies[k_CheckDupePrefabA].Count);
Assert.AreEqual(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), rule.m_ResourcesToDependencies[k_CheckDupePrefabA][0].ToString());
}
[Test]
public void CheckResourcesDupe_ResourcesDependenciesMatchWithImplicitBundleDependencies()
{
var rule = new CheckResourcesDupeDependencies();
rule.BuiltInResourcesToDependenciesMap(new string[] {k_PrefabWithMaterialPath});
rule.IntersectResourcesDepedenciesWithBundleDependencies(new List<GUID>()
{
new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial))
});
Assert.IsTrue(rule.m_ResourcesToDependencies.ContainsKey(k_PrefabWithMaterialPath));
Assert.AreEqual(1, rule.m_ResourcesToDependencies[k_PrefabWithMaterialPath].Count);
Assert.AreEqual(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial), rule.m_ResourcesToDependencies[k_PrefabWithMaterialPath][0].ToString());
}
[Test]
public void CheckResourcesDupe_AllResourcesDependenciesAreReturned()
{
var rule = new CheckResourcesDupeDependencies();
rule.BuiltInResourcesToDependenciesMap(new string[] {k_PrefabWithMaterialPath, k_CheckDupePrefabA});
rule.IntersectResourcesDepedenciesWithBundleDependencies(new List<GUID>()
{
new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial)),
new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA))
});
Assert.IsTrue(rule.m_ResourcesToDependencies[k_PrefabWithMaterialPath].Contains(new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial))));
Assert.IsTrue(rule.m_ResourcesToDependencies[k_CheckDupePrefabA].Contains(new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial))));
Assert.IsTrue(rule.m_ResourcesToDependencies[k_CheckDupePrefabA].Contains(new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA))));
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d370242d9a79ba64cb55333c896bfdb0
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,207 @@
using System.Collections.Generic;
using System.IO;
using NUnit.Framework;
using UnityEditor.AddressableAssets.Build.AnalyzeRules;
using UnityEditor.AddressableAssets.Build.DataBuilders;
using UnityEditor.AddressableAssets.Settings.GroupSchemas;
using UnityEditor.SceneManagement;
using UnityEditor.VersionControl;
using UnityEngine;
using UnityEngine.AddressableAssets.Initialization;
using UnityEngine.SceneManagement;
namespace UnityEditor.AddressableAssets.Tests.AnalyzeRules
{
public class CheckSceneDupeDependenciesTests : AddressableAssetTestBase
{
string k_CheckDupePrefabA => GetAssetPath("checkDupe_prefabA.prefab");
string k_CheckDupePrefabB => GetAssetPath("checkDupe_prefabB.prefab");
string k_CheckDupeMyMaterial => GetAssetPath("checkDupe_myMaterial.mat");
string k_ScenePath => GetAssetPath("dupeSceneTest.unity");
string k_PrefabWithMaterialPath => GetAssetPath("checkDupe_prefabWithMaterial.prefab");
protected override void OnInit()
{
base.OnInit();
GameObject prefabA = new GameObject("PrefabA");
GameObject prefabB = new GameObject("PrefabB");
GameObject prefabWithMaterial = new GameObject("PrefabWithMaterial");
var meshA = prefabA.AddComponent<MeshRenderer>();
var meshB = prefabB.AddComponent<MeshRenderer>();
var mat = new Material(Shader.Find("Unlit/Color"));
AssetDatabase.CreateAsset(mat, k_CheckDupeMyMaterial);
meshA.sharedMaterial = mat;
meshB.sharedMaterial = mat;
var meshPrefabWithMaterial = prefabWithMaterial.AddComponent<MeshRenderer>();
meshPrefabWithMaterial.material = AssetDatabase.LoadAssetAtPath<Material>(k_CheckDupeMyMaterial);
prefabA.AddComponent<TestBehaviourWithReference>();
PrefabUtility.SaveAsPrefabAsset(prefabA, k_CheckDupePrefabA);
PrefabUtility.SaveAsPrefabAsset(prefabB, k_CheckDupePrefabB);
PrefabUtility.SaveAsPrefabAsset(prefabWithMaterial, k_PrefabWithMaterialPath);
AssetDatabase.Refresh();
}
[Test]
public void CheckSceneDupe_GetsCorrectResourcePaths()
{
Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
EditorSceneManager.SaveScene(scene, k_ScenePath);
EditorBuildSettingsScene editorScene = new EditorBuildSettingsScene(k_ScenePath, true);
var sceneBU = EditorBuildSettings.scenes;
EditorBuildSettings.scenes = new EditorBuildSettingsScene[1] {editorScene};
try
{
var rule = new CheckSceneDupeDependencies();
var paths = rule.GetResourcePaths();
bool success = false;
foreach (var p in paths)
{
if (p.Contains(editorScene.path))
{
success = true;
break;
}
}
Assert.IsTrue(success, "CheckSceneDupeDependencies ResourcePaths did not find the created Scene for test as expected.");
}
finally
{
//Cleanup
EditorBuildSettings.scenes = sceneBU;
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
AssetDatabase.DeleteAsset(k_ScenePath);
}
}
[Test]
public void CheckSceneDupe_SceneDependenciesMatchWithExplicitBundleDependencies()
{
Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>(k_CheckDupePrefabA);
GameObject n = new GameObject("TestGameObject");
var refer = n.AddComponent<TestBehaviourWithReference>();
refer.Reference = go;
SceneManager.MoveGameObjectToScene(n, scene);
EditorSceneManager.SaveScene(scene, k_ScenePath);
var rule = new CheckSceneDupeDependencies();
EditorBuildSettingsScene editorScene = new EditorBuildSettingsScene(k_ScenePath, true);
rule.BuiltInResourcesToDependenciesMap(new string[] {editorScene.path});
rule.IntersectResourcesDepedenciesWithBundleDependencies(new List<GUID>() {new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA))});
Assert.IsTrue(rule.m_ResourcesToDependencies.ContainsKey(editorScene.path));
Assert.AreEqual(1, rule.m_ResourcesToDependencies[editorScene.path].Count);
Assert.AreEqual(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), rule.m_ResourcesToDependencies[editorScene.path][0].ToString());
//Cleanup
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
}
[Test]
public void CheckSceneDupe_SceneDependenciesMatchWithImplicitBundleDependencies()
{
Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(k_PrefabWithMaterialPath), scene);
EditorSceneManager.SaveScene(scene, k_ScenePath);
var rule = new CheckSceneDupeDependencies();
EditorBuildSettingsScene editorScene = new EditorBuildSettingsScene(k_ScenePath, true);
rule.BuiltInResourcesToDependenciesMap(new string[] {editorScene.path});
rule.IntersectResourcesDepedenciesWithBundleDependencies(new List<GUID>() {new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial))});
Assert.IsTrue(rule.m_ResourcesToDependencies.ContainsKey(editorScene.path));
Assert.AreEqual(1, rule.m_ResourcesToDependencies[editorScene.path].Count);
Assert.AreEqual(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial), rule.m_ResourcesToDependencies[editorScene.path][0].ToString());
//Cleanup
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
}
[Test]
public void CheckSceneDupe_SceneDependenciesDoNotIncludeEditorOnly()
{
Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
GameObject go = PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(k_PrefabWithMaterialPath), scene) as GameObject;
go.tag = "EditorOnly";
EditorSceneManager.SaveScene(scene, k_ScenePath);
var rule = new CheckSceneDupeDependencies();
EditorBuildSettingsScene editorScene = new EditorBuildSettingsScene(k_ScenePath, true);
rule.BuiltInResourcesToDependenciesMap(new string[] {editorScene.path});
rule.IntersectResourcesDepedenciesWithBundleDependencies(new List<GUID>() {new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial))});
Assert.IsTrue(rule.m_ResourcesToDependencies.ContainsKey(editorScene.path));
Assert.AreEqual(0, rule.m_ResourcesToDependencies[editorScene.path].Count);
//Cleanup
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
}
[Test]
public void CheckSceneDupe_AllSceneToBundleDependenciesAreReturned()
{
Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(k_PrefabWithMaterialPath), scene);
EditorSceneManager.SaveScene(scene, k_ScenePath);
var rule = new CheckSceneDupeDependencies();
EditorBuildSettingsScene editorScene = new EditorBuildSettingsScene(k_ScenePath, true);
rule.BuiltInResourcesToDependenciesMap(new string[] {editorScene.path});
rule.IntersectResourcesDepedenciesWithBundleDependencies(new List<GUID>()
{
new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial))
});
Assert.IsTrue(rule.m_ResourcesToDependencies.ContainsKey(editorScene.path));
Assert.AreEqual(1, rule.m_ResourcesToDependencies[editorScene.path].Count);
Assert.IsTrue(rule.m_ResourcesToDependencies[editorScene.path].Contains(new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial))));
//Cleanup
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
}
[Test]
public void CheckSceneDupe_SceneDependenciesDoNotIncludeScripts()
{
Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>(k_CheckDupePrefabA);
GameObject g = PrefabUtility.InstantiatePrefab(go, scene) as GameObject;
g.AddComponent<TestBehaviourWithReference>();
EditorSceneManager.SaveScene(scene, k_ScenePath);
var rule = new CheckSceneDupeDependencies();
EditorBuildSettingsScene editorScene = new EditorBuildSettingsScene(k_ScenePath, true);
rule.BuiltInResourcesToDependenciesMap(new string[] {editorScene.path});
Assert.IsTrue(rule.m_ResourcesToDependencies.ContainsKey(editorScene.path));
bool containsAnyScripts = false;
foreach (GUID guid in rule.m_ResourcesToDependencies[editorScene.path])
{
string path = AssetDatabase.GUIDToAssetPath(guid.ToString());
if (path.EndsWith(".cs") || path.EndsWith(".dll"))
{
containsAnyScripts = true;
break;
}
}
Assert.IsFalse(containsAnyScripts, "Scripts were included as a duplciate dependency");
//Cleanup
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e054c3274b8fb154c876b5be5db09359
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: