public void SettingIssuesAreReported() { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); UnityEditor.PlayerSettings.stripEngineCode = false; UnityEngine.Time.fixedDeltaTime = 0.02f; // default value var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.ProjectSettings); var fixedDeltaTimeIssue = issues.FirstOrDefault(i => i.descriptor.method.Equals("fixedDeltaTime")); Assert.NotNull(fixedDeltaTimeIssue); Assert.True(fixedDeltaTimeIssue.location.path.Equals("Project/Time")); UnityEngine.Time.fixedDeltaTime = 0.021f; projectReport = projectAuditor.Audit(); issues = projectReport.GetIssues(IssueCategory.ProjectSettings); Assert.Null(issues.FirstOrDefault(i => i.descriptor.method.Equals("fixedDeltaTime"))); var playerSettingIssue = issues.FirstOrDefault(i => i.descriptor.method.Equals("stripEngineCode")); Assert.NotNull(playerSettingIssue); Assert.True(playerSettingIssue.location.path.Equals("Project/Player")); }
public void SettingIssuesIsNotReportedOnceFixed() { var savedFixedDeltaTime = Time.fixedDeltaTime; // 0.02f is the default Time.fixedDeltaTime value and will be reported as an issue Time.fixedDeltaTime = 0.02f; var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.ProjectSettings); var fixedDeltaTimeIssue = issues.FirstOrDefault(i => i.descriptor.method.Equals("fixedDeltaTime")); Assert.NotNull(fixedDeltaTimeIssue); Assert.True(fixedDeltaTimeIssue.description.Equals("Time: Fixed Timestep")); Assert.True(fixedDeltaTimeIssue.location.Path.Equals("Project/Time")); // "fix" fixedDeltaTime so it's not reported anymore Time.fixedDeltaTime = 0.021f; projectReport = projectAuditor.Audit(); issues = projectReport.GetIssues(IssueCategory.ProjectSettings); Assert.Null(issues.FirstOrDefault(i => i.descriptor.method.Equals("fixedDeltaTime"))); // restore Time.fixedDeltaTime Time.fixedDeltaTime = savedFixedDeltaTime; }
public void ShouldNotReportMutedIssue() { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectAuditorSettings = projectAuditor.config; var issues = ScriptIssueTestHelper.AnalyzeAndFindScriptIssues(m_TempAsset); Assert.AreEqual(1, issues.Count()); var issue = issues.FirstOrDefault(); projectAuditorSettings.ClearAllRules(); var callingMethod = issue.GetCallingMethod(); var action = projectAuditorSettings.GetAction(issue.descriptor, callingMethod); // expect default action specified in descriptor Assert.AreEqual(issue.descriptor.severity, action); // add rule with a filter. projectAuditorSettings.AddRule(new Rule { id = issue.descriptor.id, severity = Rule.Severity.None, filter = callingMethod }); action = projectAuditorSettings.GetAction(issue.descriptor, callingMethod); // issue has been muted so it should not be reported Assert.AreEqual(Rule.Severity.None, action); }
static ProjectIssue[] BuildAndAnalyze() { var buildPath = FileUtil.GetUniqueTempPathInProject(); Directory.CreateDirectory(buildPath); var buildPlayerOptions = new BuildPlayerOptions { scenes = new string[] {}, locationPathName = Path.Combine(buildPath, "test"), target = EditorUserBuildSettings.activeBuildTarget, targetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget), options = BuildOptions.Development }; var buildReport = BuildPipeline.BuildPlayer(buildPlayerOptions); Assert.True(buildReport.summary.result == BuildResult.Succeeded); Directory.Delete(buildPath, true); var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.ShaderVariants); issues = issues.Where(i => i.description.Equals("Custom/MyTestShader")).ToArray(); Assert.Positive(issues.Length); return(issues); }
public void ShouldNotReportMutedIssue() { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectAuditorSettings = projectAuditor.config; var projectReport = projectAuditor.Audit(); var issues = ScriptAuditor.FindScriptIssues(projectReport, m_ScriptResource.relativePath); Assert.AreEqual(1, issues.Count()); var issue = issues.FirstOrDefault(); projectAuditorSettings.ClearAllRules(); var action = projectAuditorSettings.GetAction(issue.descriptor, issue.callingMethod); // expect default action specified in descriptor Assert.AreEqual(issue.descriptor.action, action); // add rule with a filter. projectAuditorSettings.AddRule(new Rule { id = issue.descriptor.id, action = Rule.Action.None, filter = issue.callingMethod }); action = projectAuditorSettings.GetAction(issue.descriptor, issue.callingMethod); // issue has been muted so it should not be reported Assert.AreEqual(Rule.Action.None, action); }
public static ProjectReport AnalyzeBuild() { // We must save the scene or the build will fail https://unity.slack.com/archives/C3F85MBDL/p1615991512002200 EditorSceneManager.SaveScene(EditorSceneManager.GetActiveScene(), "Assets/UntitledScene.unity"); var buildPath = FileUtil.GetUniqueTempPathInProject(); Directory.CreateDirectory(buildPath); var buildPlayerOptions = new BuildPlayerOptions { scenes = new string[] {}, locationPathName = Path.Combine(buildPath, "test"), target = EditorUserBuildSettings.activeBuildTarget, targetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget), options = BuildOptions.Development }; var buildReport = BuildPipeline.BuildPlayer(buildPlayerOptions); Assert.True(buildReport.summary.result == BuildResult.Succeeded); Directory.Delete(buildPath, true); AssetDatabase.DeleteAsset("Assets/UntitledScene.unity"); var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); return(projectReport); }
public void RecursiveSearchMatch() { var config = ScriptableObject.CreateInstance <ProjectAuditorConfig>(); config.AnalyzeEditorCode = false; var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(config); var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.Code); var stringFilter = new TextFilter { matchCase = true, searchDependencies = false, searchText = "WrapperClass" }; var filteredIssues = issues.Where(i => stringFilter.Match(i)); Assert.AreEqual(0, filteredIssues.Count()); // try again looking into dependencies too stringFilter.searchDependencies = true; filteredIssues = issues.Where(i => stringFilter.Match(i)); Assert.AreEqual(1, filteredIssues.Count()); }
public void SettingIssuesAreReported() { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); // disabling stripEngineCode will be reported as an issue PlayerSettings.stripEngineCode = false; // 0.02f is the default Time.fixedDeltaTime value and will be reported as an issue Time.fixedDeltaTime = 0.02f; var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.ProjectSettings); var fixedDeltaTimeIssue = issues.FirstOrDefault(i => i.descriptor.method.Equals("fixedDeltaTime")); Assert.NotNull(fixedDeltaTimeIssue); Assert.True(fixedDeltaTimeIssue.description.Equals("Time: Fixed Timestep")); Assert.True(fixedDeltaTimeIssue.location.Path.Equals("Project/Time")); // "fix" fixedDeltaTime so it's not reported anymore Time.fixedDeltaTime = 0.021f; projectReport = projectAuditor.Audit(); issues = projectReport.GetIssues(IssueCategory.ProjectSettings); Assert.Null(issues.FirstOrDefault(i => i.descriptor.method.Equals("fixedDeltaTime"))); var playerSettingIssue = issues.FirstOrDefault(i => i.descriptor.method.Equals("stripEngineCode")); Assert.NotNull(playerSettingIssue); Assert.True(playerSettingIssue.description.Equals("Player: Engine Code Stripping")); Assert.True(playerSettingIssue.location.Path.Equals("Project/Player")); }
public void CaseSensitiveMatch() { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); // disabling stripEngineCode will be reported as an issue PlayerSettings.stripEngineCode = false; var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.ProjectSettings); var stringFilter = new TextFilter { matchCase = true, searchDependencies = false, searchText = "Engine Code Stripping" }; var filteredIssues = issues.Where(i => stringFilter.Match(i)); Assert.AreEqual(1, filteredIssues.Count()); stringFilter.searchText = "engine code stripping"; filteredIssues = issues.Where(i => stringFilter.Match(i)); Assert.AreEqual(0, filteredIssues.Count()); }
public static IEnumerable <ProjectIssue> AnalyzeAndFindScriptIssues(ScriptResource scriptResource) { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); return(ScriptAuditor.FindScriptIssues(projectReport, scriptResource.relativePath)); }
public void FilteredReportIsExported() { // disabling stripEngineCode will be reported as a ProjectSettings issue PlayerSettings.stripEngineCode = false; var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); const string path = "ProjectAuditor_Report.csv"; // let's assume we are only interested in exporting project settings projectReport.ExportToCSV(path, issue => issue.category == IssueCategory.ProjectSettings); Assert.True(File.Exists(path)); using (var file = new StreamReader(path)) { var line = file.ReadLine(); Assert.True(line.Equals(ProjectReport.HeaderForCSV())); while (file.Peek() >= 0) { line = file.ReadLine(); Assert.True(line.StartsWith(IssueCategory.ProjectSettings.ToString())); } } }
public void EditorDefaultResourcesShaderIsNotReported() { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.Shaders).Where(i => i.relativePath.Contains("Editor Default Resources")).ToArray(); Assert.Zero(issues.Length); }
public void CustomAuditorIssueIsReported() { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var report = projectAuditor.Audit(); var issues = report.GetIssues(IssueCategory.Code); Assert.NotNull(issues.FirstOrDefault(i => i.description.Equals("This is a test issue"))); }
public void PlayerLogDoesNotContainShaderCompilationLog() { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); var shadersAuditor = projectAuditor.GetAuditor <ShadersAuditor>(); var result = shadersAuditor.ParsePlayerLog(m_PlayerLogWithNoCompilationResource.relativePath, new ProjectIssue[0]); Assert.False(result); }
public void BuildIsRequired() { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.Shaders); Assert.Positive(issues.Length); Assert.True(issues.First().description.Equals("Build the project and run Project Auditor analysis")); }
public IssueTable(TreeViewState state, MultiColumnHeader multicolumnHeader, ProjectIssue[] issues, bool groupByDescription, ProjectAuditor projectAuditor, ProjectAuditorWindow window) : base(state, multicolumnHeader) { m_ProjectAuditor = projectAuditor; m_ProjectAuditorWindow = window; m_Issues = issues; m_GroupByDescription = groupByDescription; multicolumnHeader.sortingChanged += OnSortingChanged; Reload(); }
public void EditorShaderIsNotReported() { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.Shaders); issues = issues.Where(i => i.description.Equals("Custom/MyEditorShader")).ToArray(); Assert.Zero(issues.Length); }
public void ShaderVariantsRequireBuild() { ShadersAuditor.CleanupBuildData(); var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.ShaderVariants); Assert.Positive(issues.Length); Assert.True(issues.First().description.Equals("Build the project to view the Shader Variants")); }
public void ShaderVariantsRequireBuild() { ShadersAuditor.CleanupBuildData(); var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.ShaderVariants); Assert.Zero(issues.Length); Assert.False(ShadersAuditor.BuildDataAvailable()); }
public void MetaDataIsReported() { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.MetaData); var matchingIssue = issues.FirstOrDefault(i => i.description.Equals("Unity Version")); Assert.NotNull(matchingIssue); Assert.True(matchingIssue.GetCustomProperty(0).Equals(Application.unityVersion)); }
private void OnEnable() { m_ProjectAuditor = new ProjectAuditor(); var enumAreas = Enum.GetValues(typeof(Area)); foreach (var area in enumAreas) { m_EnableAreas.Add(true); } }
public void ShaderWithErrorIsReported() { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.Shaders); var shadersWithErrors = issues.Where(i => i.severity == Rule.Severity.Error); Assert.Positive(shadersWithErrors.Count()); var shaderIssue = issues.FirstOrDefault(i => i.relativePath.Equals(m_ShaderWithErrorResource.relativePath)); Assert.NotNull(shaderIssue); }
public void CanSaveAndLoadReport() { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); projectReport.Save(k_ReportPath); var loadedReport = ProjectReport.Load(k_ReportPath); Assert.AreEqual(projectReport.NumTotalIssues, loadedReport.NumTotalIssues); }
public void BuildReportIsSupported() { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var auditor = projectAuditor.GetAuditor <BuildAuditor>(); var isSupported = auditor.IsSupported(); #if UNITY_2019_4_OR_NEWER Assert.True(isSupported); #else Assert.False(isSupported); #endif }
public void EditorCodeIssueIsNotReported() { var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); Assert.False(projectAuditor.config.AnalyzeEditorCode); var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.Code); var codeIssue = issues.FirstOrDefault(i => i.relativePath.Equals(m_ScriptResource.relativePath)); Assert.Null(codeIssue); }
private void OnEnable() { m_ProjectAuditor = new ProjectAuditor(); UpdateAssemblySelection(); if (m_AreaSelection == null) { m_AreaSelection = new TreeViewSelection(); if (!string.IsNullOrEmpty(m_AreaSelectionSummary)) { if (m_AreaSelectionSummary == "All") { m_AreaSelection.SetAll(m_AreaNames); } else if (m_AreaSelectionSummary != "None") { var areas = m_AreaSelectionSummary.Split(new[] { ", " }, StringSplitOptions.None); foreach (var area in areas) { m_AreaSelection.selection.Add(area); } } } else { m_AreaSelection.SetAll(m_AreaNames); } } m_ModeNames = m_AnalysisViewDescriptors.Select(m => m.name).ToArray(); m_AnalysisViews.Clear(); foreach (var desc in m_AnalysisViewDescriptors) { var view = new AnalysisView(desc, m_ProjectAuditor.config, this); view.CreateTable(); if (m_AnalysisState == AnalysisState.Valid) { view.AddIssues(m_ProjectReport.GetIssues(view.desc.category)); } m_AnalysisViews.Add(view); } m_CallHierarchyView = new CallHierarchyView(new TreeViewState()); RefreshDisplay(); }
public void ReportIsExportedAndFormatted() { // disabling stripEngineCode will be reported as a ProjectSettings issue PlayerSettings.stripEngineCode = false; var config = ScriptableObject.CreateInstance <ProjectAuditorConfig>(); config.AnalyzeEditorCode = false; var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(config); var projectReport = projectAuditor.Audit(); const string path = "ProjectAuditor_Report.csv"; projectReport.ExportToCSV(path); Assert.True(File.Exists(path)); var settingsIssue = projectReport.GetIssues(IssueCategory.ProjectSettings) .First(i => i.descriptor.method.Equals("stripEngineCode")); var scriptIssue = projectReport.GetIssues(IssueCategory.Code) .First(i => i.relativePath.Equals(m_TempAsset.relativePath)); var settingsIssueFound = false; var scriptIssueFound = false; using (var file = new StreamReader(path)) { var line = file.ReadLine(); Assert.True(line.Equals(ProjectReport.HeaderForCSV())); var expectedSettingsIssueLine = ProjectReport.FormatIssueForCSV(settingsIssue); var expectedScriptIssueLine = ProjectReport.FormatIssueForCSV(scriptIssue); while (file.Peek() >= 0) { line = file.ReadLine(); if (line.Equals(expectedSettingsIssueLine)) { settingsIssueFound = true; } if (line.Equals(expectedScriptIssueLine)) { scriptIssueFound = true; } } } Assert.True(settingsIssueFound); Assert.True(scriptIssueFound); }
public void ReportIsExportedAndFormatted() { // disabling stripEngineCode will be reported as a ProjectSettings issue PlayerSettings.stripEngineCode = false; var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(); var projectReport = projectAuditor.Audit(); const string path = "ProjectAuditor_Report.csv"; projectReport.Export(path); Assert.True(File.Exists(path)); var settingsIssue = projectReport.GetIssues(IssueCategory.ProjectSettings) .First(i => i.descriptor.method.Equals("stripEngineCode")); var scriptIssue = projectReport.GetIssues(IssueCategory.ApiCalls) .First(i => i.relativePath.Equals(m_ScriptResource.relativePath)); var settingsIssueFound = false; var scriptIssueFound = false; using (var file = new StreamReader(path)) { var line = file.ReadLine(); Assert.True(line.Equals("Issue,Message,Area,Path")); var expectedSettingsIssueLine = string.Format("{0},{1},{2},{3}", settingsIssue.descriptor.description, settingsIssue.description, settingsIssue.descriptor.area, settingsIssue.relativePath); var expectedScriptIssueLine = string.Format("{0},{1},{2},{3}:{4}", scriptIssue.descriptor.description, scriptIssue.description, scriptIssue.descriptor.area, scriptIssue.relativePath, scriptIssue.line); while (file.Peek() >= 0) { line = file.ReadLine(); if (line.Equals(expectedSettingsIssueLine)) { settingsIssueFound = true; } if (line.Equals(expectedScriptIssueLine)) { scriptIssueFound = true; } } } Assert.True(settingsIssueFound); Assert.True(scriptIssueFound); }
public void EditorCodeIssueIsReported() { var config = ScriptableObject.CreateInstance <ProjectAuditorConfig>(); config.AnalyzeEditorCode = true; var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(config); var projectReport = projectAuditor.Audit(); var issues = projectReport.GetIssues(IssueCategory.Code); var codeIssue = issues.FirstOrDefault(i => i.relativePath.Equals(m_TempAsset.relativePath)); Assert.NotNull(codeIssue); }
void AnalyzeAndExport(IssueCategory category, string path) { var config = ScriptableObject.CreateInstance <ProjectAuditorConfig>(); config.AnalyzeEditorCode = false; var projectAuditor = new Unity.ProjectAuditor.Editor.ProjectAuditor(config); var projectReport = projectAuditor.Audit(); var layout = projectAuditor.GetLayout(category); projectReport.ExportToCSV(path, layout); Assert.True(File.Exists(path)); }