123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- #if UNITY_EDITOR
-
- using System;
- using System.IO;
- using UnityEditor;
-
- namespace UnityEngine.InputSystem
- {
- /// Provides convenience functions for creating and managing assets for test purposes.
- /// Note that all returned paths are converted to Unix paths when running on Windows
- /// for consistency and to avoid mixed path names.
- public static class AssetDatabaseUtils
- {
- private const string kAssetPath = "Assets";
- private const string kTestPath = "TestFiles";
- private const string kMetaExtension = ".meta";
- private const string kDefaultAssetExtension = "asset";
-
- // Perform an operation equivalent to a file delete operation outside of Unity Editor.
- // Note that meta file is also removed to avoid generating warnings about non-clean delete.
- public static void ExternalDeleteFileOrDirectory(string path)
- {
- FileUtil.DeleteFileOrDirectory(path);
- FileUtil.DeleteFileOrDirectory(path + kMetaExtension);
- }
-
- // Perform an operation equivalent to a file move operation outside of Unity Editor.
- // Note that meta file is also moved to avoid generating warnings about non-clean move.
- public static void ExternalMoveFileOrDirectory(string source, string dest)
- {
- FileUtil.MoveFileOrDirectory(source, dest);
- FileUtil.MoveFileOrDirectory(source + kMetaExtension, dest + kMetaExtension);
- }
-
- // Create an asset at the given path containing the given text content.
- private static T CreateAssetAtPath<T>(string path, string content) where T : UnityEngine.Object
- {
- Debug.Assert(!File.Exists(path));
-
- T obj;
- try
- {
- CreateDirectories(Path.GetDirectoryName(path));
-
- File.WriteAllText(path, content);
- AssetDatabase.ImportAsset(path);
- obj = AssetDatabase.LoadAssetAtPath<T>(path);
- if (obj == null)
- throw new Exception($"Failed to create asset at \"{path}\"");
- }
- catch (Exception)
- {
- AssetDatabase.DeleteAsset(path);
- throw;
- }
-
- return obj;
- }
-
- private static string SanitizePath(string path)
- {
- return path?.Replace("\\", "/");
- }
-
- private static void CreateRootDirectory()
- {
- CreateDirectories(RootPath());
- }
-
- // Creates all directories (including intermediate) defined in path.
- private static string CreateDirectories(string path)
- {
- if (Directory.Exists(path))
- return SanitizePath(path);
-
- var parentFolder = kAssetPath;
- path = path.Replace("\\", "/"); // Make sure we only get '/' separators.
- var directories = path.Split('/');
- if (directories[0] != kAssetPath)
- throw new ArgumentException(path);
- for (var i = 1; i < directories.Length; ++i)
- {
- var guid = AssetDatabase.CreateFolder(parentFolder, directories[i]);
- if (guid == string.Empty)
- throw new Exception("Failed to create path \"" + path + "\"");
- parentFolder = SanitizePath(Path.Combine(parentFolder, directories[i]));
- }
-
- AssetDatabase.Refresh();
-
- return SanitizePath(path);
- }
-
- // Creates a random test directory within asset folder that is automatically removed after test run.
- public static string CreateDirectory()
- {
- return CreateDirectories(RandomDirectoryPath());
- }
-
- // Creates an asset in the given directory path with an explicit or random file name containing the
- // given content or the default content based on type.
- public static T CreateAsset<T>(string directoryPath, string filename = null, string content = null) where T : UnityEngine.Object
- {
- Debug.Assert(directoryPath == null || directoryPath.Contains(RootPath()));
- Debug.Assert(filename == null || !filename.Contains("/"));
-
- if (directoryPath == null)
- directoryPath = RootPath();
- string path;
- if (filename != null)
- {
- path = SanitizePath(Path.Combine(directoryPath, filename));
- if (File.Exists(path))
- throw new Exception($"File already exists: {path}");
- }
- else
- {
- path = RandomAssetFilePath(directoryPath, AssetFileExtensionFromType(typeof(T)));
- }
-
- return CreateAsset<T>(path: path, content: content);
- }
-
- // Creates an asset at the given path containing the specified content.
- // If path is null, a unique random file name is assigned, if content is null the default content based
- // on type (extension) is used.
- public static T CreateAsset<T>(string path = null, string content = null) where T : UnityEngine.Object
- {
- if (path == null)
- path = RandomAssetFilePath(RootPath(), AssetFileExtensionFromType(typeof(T)));
- if (content == null)
- content = DefaultContentFromType(typeof(T));
- return CreateAssetAtPath<T>(path, content);
- }
-
- public static void Restore()
- {
- var root = RootPath();
-
- // Delete all files in test folder
- if (!Directory.Exists(root))
- return;
-
- foreach (var asset in AssetDatabase.FindAssets("", new string[] { root }))
- {
- var path = AssetDatabase.GUIDToAssetPath(asset);
- AssetDatabase.DeleteAsset(path);
- }
-
- AssetDatabase.DeleteAsset(root);
- }
-
- private static string RandomName()
- {
- const double scale = int.MaxValue;
- double r = UnityEngine.Random.value;
- return "Test_" + (int)(Math.Floor(r * scale));
- }
-
- private static string RandomAssetFilePath<T>(string directoryPath = null)
- {
- return RandomAssetFilePath(directoryPath, AssetFileExtensionFromType(typeof(T)));
- }
-
- private static string RandomAssetFilePath(string directoryPath = null, string extension = null)
- {
- // Default to using test files root path
- if (directoryPath == null)
- directoryPath = RootPath();
-
- // Default to default extension
- if (extension == null)
- extension = kDefaultAssetExtension;
-
- string path;
- do
- {
- path = SanitizePath(Path.Combine(directoryPath, RandomName() + "." + extension)); // EDIT
- }
- while (File.Exists(path));
- return path;
- }
-
- private static string RootPath()
- {
- return SanitizePath(Path.Combine(kAssetPath, kTestPath));
- }
-
- public static string RandomDirectoryPath()
- {
- string path;
- do
- {
- path = Path.Combine(RootPath(), RandomName());
- }
- while (File.Exists(path));
- return SanitizePath(path);
- }
-
- private static string AssetFileExtensionFromType(Type type)
- {
- if (type == typeof(InputActionAsset))
- return InputActionAsset.Extension;
- return kDefaultAssetExtension;
- }
-
- private static string DefaultContentFromType(Type type)
- {
- if (type == typeof(InputActionAsset))
- return "{}";
- return string.Empty;
- }
- }
- }
-
- #endif // UNITY_EDITOR
|