You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
3.1 KiB
C#
71 lines
3.1 KiB
C#
1 year ago
|
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" };
|
||
|
|
||
|
// removes whitespace from places it would be problematic
|
||
|
internal static string CleanJsonString(string jsonString)
|
||
|
{
|
||
|
string result = jsonString;
|
||
|
|
||
|
// removes whitespace before the json key's colons
|
||
|
string regexSpaceBetweenKeyAndColon = @"(?<=\"")\s+(?=:)";
|
||
|
result = Regex.Replace(result, regexSpaceBetweenKeyAndColon, string.Empty, RegexOptions.None, TimeSpan.FromSeconds(5));
|
||
|
|
||
|
// trims whitespace from end of keys + values
|
||
|
string regexTrailingWhitespace = @"\s+(?=\"")";
|
||
|
result = Regex.Replace(result, regexTrailingWhitespace, string.Empty, RegexOptions.None, TimeSpan.FromSeconds(5));
|
||
|
|
||
|
// trims whitespace from beginning of keys + values
|
||
|
string regexPrecedingWhitespace = @"(?<=\"")\s+";
|
||
|
result = Regex.Replace(result, regexPrecedingWhitespace, string.Empty, RegexOptions.None, TimeSpan.FromSeconds(5));
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
internal static void ValidateJsonKeys(string jsonString)
|
||
|
{
|
||
|
// grabs all json keys by looking before the colons
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|