| using System; |
| using System.Collections.Generic; |
| using System.Linq; |
| using System.Text.RegularExpressions; |
| using UnityEditor.TestTools.CodeCoverage.Utils; |
|
|
| namespace UnityEditor.TestTools.CodeCoverage |
| { |
| internal static class JsonUtils |
| { |
| internal readonly static string[] m_validKeys = { "assembliesInclude", "assembliesExclude", "pathsInclude", "pathsExclude" }; |
|
|
| |
| internal static string CleanJsonString(string jsonString) |
| { |
| string result = jsonString; |
|
|
| |
| string regexSpaceBetweenKeyAndColon = @"(?<=\"")\s+(?=:)"; |
| result = Regex.Replace(result, regexSpaceBetweenKeyAndColon, string.Empty, RegexOptions.None, TimeSpan.FromSeconds(5)); |
|
|
| |
| string regexTrailingWhitespace = @"\s+(?=\"")"; |
| result = Regex.Replace(result, regexTrailingWhitespace, string.Empty, RegexOptions.None, TimeSpan.FromSeconds(5)); |
|
|
| |
| string regexPrecedingWhitespace = @"(?<=\"")\s+"; |
| result = Regex.Replace(result, regexPrecedingWhitespace, string.Empty, RegexOptions.None, TimeSpan.FromSeconds(5)); |
|
|
| return result; |
| } |
|
|
| internal static void ValidateJsonKeys(string jsonString) |
| { |
| |
| Regex jsonKeyRegex = new Regex(@"[a-zA-Z0-9\s]+(?=\"":)", RegexOptions.None, TimeSpan.FromSeconds(5)); |
| string[] keys = jsonKeyRegex.Matches(jsonString) |
| .Cast<Match>() |
| .Select(m => m.Value) |
| .ToArray(); |
|
|
| if (!AreAllKeysUnique(keys, out string[] duplicateKeys)) |
| ResultsLogger.Log(ResultID.Warning_FilterFileContainsDuplicateKeys, string.Join(",", duplicateKeys)); |
|
|
| if (!AreAllKeysValid(keys, m_validKeys, out string[] invalidKeys)) |
| ResultsLogger.Log(ResultID.Warning_FilterFileContainsInvalidKey, string.Join(",", invalidKeys)); |
| } |
|
|
| internal static bool AreAllKeysUnique(string[] keys, out string[] duplicateKeys) |
| { |
| duplicateKeys = keys.GroupBy(key => key, StringComparer.InvariantCultureIgnoreCase) |
| .Where(keyGroup => keyGroup.Count() > 1) |
| .Select(keyGroup => keyGroup.Key) |
| .ToArray(); |
|
|
| if (duplicateKeys.Length > 0) return false; |
| return true; |
| } |
|
|
| internal static bool AreAllKeysValid(string[] keys, string[] validKeys, out string[] invalidKeys) |
| { |
| invalidKeys = keys.Where(keyToCheck => !validKeys.Any(validKey => keyToCheck.Equals(validKey, StringComparison.InvariantCultureIgnoreCase))) |
| .Distinct() |
| .ToArray(); |
|
|
| if (invalidKeys.Length > 0) return false; |
| return true; |
| } |
| } |
| } |
|
|