public static void GenerateCompatibilityTestLoadReferenceAsset()
 {
     CompatibilityGraphModelBuilder.CreateAsset(k_CurrentVersionAssetName, k_TmpCurrentVersionAssetPath);
     AssetDatabase.SaveAssets();
     AssetDatabase.ForceReserializeAssets(new[] { k_TmpCurrentVersionAssetPath });
     FileUtil.ReplaceFile(k_TmpCurrentVersionAssetPath, k_CurrentVersionAssetPath);
     AssetDatabase.DeleteAsset(k_TmpCurrentVersionAssetPath);
 }
        public void SaveAndLoadGraphAssetGivesSameGraph()
        {
            try
            {
                var expected = CompatibilityGraphModelBuilder.CreateAsset(k_TemporaryAssetName, k_TemporaryAssetPath);

                CompatibilityGraphModelBuilder.CreateAsset(k_TemporaryAssetName2, k_TemporaryAssetPath2);
                AssetDatabase.SaveAssets();
                AssetDatabase.ForceReserializeAssets(new[] { k_TemporaryAssetPath2 });
                AssetDatabase.ImportAsset(k_TemporaryAssetPath2, ImportAssetOptions.ForceUpdate | ImportAssetOptions.ForceSynchronousImport);
                var actual = AssetDatabase.LoadAssetAtPath <GraphAssetModel>(k_TemporaryAssetPath2);

                Assert.AreNotSame(expected, actual);
                GraphChecks.AssertIsGraphAsExpected(expected.GraphModel, actual.GraphModel);
            }
            finally
            {
                AssetDatabase.DeleteAsset(k_TemporaryAssetPath);
                AssetDatabase.DeleteAsset(k_TemporaryAssetPath2);
            }
        }
        public void LoadingAssetMakesSameGraph(string hiddenAssetPath)
        {
            if (!Directory.Exists(k_TemporaryAssetDir))
            {
                Directory.CreateDirectory(k_TemporaryAssetDir);
            }
            var tmpCurrentAssetName = k_TmpCurrentVersionAssetPath;

            FileUtil.ReplaceFile(hiddenAssetPath, tmpCurrentAssetName);
            AssetDatabase.ImportAsset(tmpCurrentAssetName);
            AssetDatabase.ForceReserializeAssets(new[] { tmpCurrentAssetName });
            try
            {
                var expected = CompatibilityGraphModelBuilder.CreateAsset(k_TemporaryAssetName, k_TemporaryAssetPath);

                var actual = AssetDatabase.LoadAssetAtPath <GraphAssetModel>(tmpCurrentAssetName);
                GraphChecks.AssertIsGraphAsExpected(expected.GraphModel, actual.GraphModel);
            }
            finally
            {
                AssetDatabase.DeleteAsset(k_TemporaryAssetPath);
                AssetDatabase.DeleteAsset(tmpCurrentAssetName);
            }
        }
        public void SavingAssetSavesSameFile()
        {
            Assert.IsTrue(File.Exists(k_CurrentVersionAssetPath), "Generate reference asset using menu item 'GTF/Generate Compatibility Test Reference Asset'.");

            var prevText = File.ReadAllText(k_CurrentVersionAssetPath);

#if UNITY_2021_2_OR_NEWER
            prevText = Regex.Replace(prevText,
                                     $"^((\\s|-)+)rid: [0-9]+$",
                                     $"$1rid: 0",
                                     RegexOptions.Multiline);
#endif

            string newText;
            try
            {
                if (!Directory.Exists(k_TemporaryAssetDir))
                {
                    Directory.CreateDirectory(k_TemporaryAssetDir);
                }
                CompatibilityGraphModelBuilder.CreateAsset(k_TemporaryAssetName, k_TemporaryAssetPath);
                AssetDatabase.SaveAssets();
                AssetDatabase.ForceReserializeAssets(new[] { k_TemporaryAssetPath });

                newText = File.ReadAllText(k_TemporaryAssetPath);
            }
            finally
            {
                AssetDatabase.DeleteAsset(k_TemporaryAssetPath);
            }

            newText = Regex.Replace(newText,
                                    $"^(\\s*)m_Name: {k_TemporaryAssetName}(.*)$",
                                    $"$1m_Name: {k_CurrentVersionAssetName}$2",
                                    RegexOptions.Multiline);

#if UNITY_2021_2_OR_NEWER
            newText = Regex.Replace(newText,
                                    $"^((\\s|-)+)rid: [0-9]+$",
                                    $"$1rid: 0",
                                    RegexOptions.Multiline);
#endif

            var prevLen = prevText.Length;
            var newLen  = newText.Length;
            int i       = 0;
            int j       = 0;
            int lineNum = 1;
            int colNum  = 1;

            void IncrementI()
            {
                if (prevText[i] == '\n')
                {
                    lineNum++;
                    colNum = 1;
                }
                else
                {
                    colNum++;
                }

                i++;
            }

            while (true)
            {
                var initialI = i;
                var initialJ = j;

                while (i < prevLen && j < newLen && prevText[i] == newText[j])
                {
                    IncrementI();
                    j++;
                }

                while (i < prevLen && char.IsWhiteSpace(prevText[i]))
                {
                    IncrementI();
                }

                while (j < newLen && char.IsWhiteSpace(newText[j]))
                {
                    j++;
                }

                if (i == prevLen && j == newLen)
                {
                    break;
                }

                if (initialI == i || initialJ == j)
                {
                    var prevDiff = prevText.Substring(Math.Max(0, i - 40), 80);
                    var newDiff  = newText.Substring(Math.Max(0, i - 40), 80);

                    Assert.Fail($"Assets content are not equal." +
                                $"\nPrevious length: {prevLen}." +
                                $"\nNew length: {newLen}." +
                                $"\nThey differ at line {lineNum} column {colNum}" +
                                $"\n{prevDiff}" +
                                $"\n------" +
                                $"\n{newDiff}");
                }
            }
        }