public void ShaderIsReported()
        {
            ShadersAuditor.ClearBuildData();
            var issues      = Utility.Analyze(IssueCategory.Shaders);
            var shaderIssue = issues.FirstOrDefault(i => i.description.Equals(k_ShaderName));

            Assert.NotNull(shaderIssue);

            // check descriptor
            Assert.True(shaderIssue.descriptor.area.Equals(Area.Info.ToString()));

            // check custom property
            Assert.AreEqual((int)ShaderProperty.Num, shaderIssue.GetNumCustomProperties());
            Assert.True(shaderIssue.GetCustomProperty(ShaderProperty.NumVariants).Equals(ShadersAuditor.k_NotAvailable), "Num Variants: " + shaderIssue.GetCustomProperty(ShaderProperty.NumVariants));

#if UNITY_2019_1_OR_NEWER
            Assert.AreEqual(2, shaderIssue.GetCustomPropertyAsInt(ShaderProperty.NumPasses), "NumPasses was : " + shaderIssue.GetCustomProperty(ShaderProperty.NumPasses));
            Assert.AreEqual(2, shaderIssue.GetCustomPropertyAsInt(ShaderProperty.NumKeywords), "NumKeywords was : " + shaderIssue.GetCustomProperty(ShaderProperty.NumKeywords));
#else
            Assert.AreEqual(0, shaderIssue.GetCustomPropertyAsInt(ShaderProperty.NumPasses), "NumPasses was : " + shaderIssue.GetCustomProperty(ShaderProperty.NumPasses));
            Assert.AreEqual(0, shaderIssue.GetCustomPropertyAsInt(ShaderProperty.NumKeywords), "NumKeywords was : " + shaderIssue.GetCustomProperty(ShaderProperty.NumKeywords));
#endif
            Assert.AreEqual(2000, shaderIssue.GetCustomPropertyAsInt(ShaderProperty.RenderQueue), "RenderQueue was : " + shaderIssue.GetCustomProperty(ShaderProperty.RenderQueue));
            Assert.False(shaderIssue.GetCustomPropertyAsBool(ShaderProperty.Instancing), "Instancing is supported but it should not be.");
            Assert.False(shaderIssue.GetCustomPropertyAsBool(ShaderProperty.SrpBatcher), "SRP Batcher is supported but it should not be.");
        }
        public void ShaderVariantsRequireBuild()
        {
            ShadersAuditor.ClearBuildData();
            var issues = Utility.Analyze(IssueCategory.ShaderVariants);

            Assert.Zero(issues.Length);
            Assert.False(ShadersAuditor.BuildDataAvailable());
        }
        public void UnusedVariantsAreReported()
        {
            EditorSceneManager.SaveScene(SceneManager.GetActiveScene(), "Assets/UntitledScene.unity");

            var buildPath = FileUtil.GetUniqueTempPathInProject();

            Directory.CreateDirectory(buildPath);

            ShadersAuditor.ClearBuildData(); // clear previously built variants, if any
            var buildReport = BuildPipeline.BuildPlayer(new BuildPlayerOptions
            {
                scenes           = new string[] {},
                locationPathName = Path.Combine(buildPath, "test"),
                target           = EditorUserBuildSettings.activeBuildTarget,
                targetGroup      = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget),
                options          = BuildOptions.Development
            });

            Assert.True(buildReport.summary.result == BuildResult.Succeeded);

            Directory.Delete(buildPath, true);

            AssetDatabase.DeleteAsset("Assets/UntitledScene.unity");

            var allVariants = Utility.Analyze(IssueCategory.ShaderVariants);

            ShadersAuditor.ClearBuildData(); // cleanup

            var variants = allVariants.Where(i => i.description.Equals(k_ShaderName) && i.category == IssueCategory.ShaderVariants).ToArray();

            Assert.Positive(variants.Length);

            var result = ShadersAuditor.ParsePlayerLog(m_PlayerLogResource.relativePath, variants);

            Assert.That(result, Is.EqualTo(ParseLogResult.Success), "No compiled shader variants found in player log.");

            var shaderCompilerPlatforms    = variants.Select(v => v.GetCustomProperty(ShaderVariantProperty.Platform)).Distinct().ToArray();
            var numShaderCompilerPlatforms = shaderCompilerPlatforms.Count();

            Assert.AreEqual(5 * numShaderCompilerPlatforms, variants.Length, "Compiler Platforms: " + string.Join(", ", shaderCompilerPlatforms));

            var unusedVariants = variants.Where(i => !i.GetCustomPropertyAsBool(ShaderVariantProperty.Compiled)).ToArray();

            foreach (var plat in shaderCompilerPlatforms)
            {
                var unusedVariantsForPlatform = unusedVariants.Where(v => v.GetCustomProperty(ShaderVariantProperty.Platform).Equals(plat)).ToArray();

                Assert.AreEqual(2, unusedVariantsForPlatform.Length);
                Assert.True(unusedVariantsForPlatform[0].GetCustomProperty(ShaderVariantProperty.PassName).Equals("MyTestShader/Pass"));
                Assert.True(unusedVariantsForPlatform[0].GetCustomProperty(ShaderVariantProperty.Keywords).Equals("KEYWORD_B"));
#if UNITY_2019_1_OR_NEWER
                Assert.True(unusedVariantsForPlatform[1].GetCustomProperty(ShaderVariantProperty.PassName).Equals("Pass 1"));
#else
                Assert.True(unusedVariantsForPlatform[1].GetCustomProperty(ShaderVariantProperty.PassName).Equals(string.Empty));
#endif
                Assert.True(unusedVariantsForPlatform[1].GetCustomProperty(ShaderVariantProperty.Keywords).Equals(ShadersAuditor.k_NoKeywords));
            }
        }