Last active
October 1, 2024 10:03
-
-
Save BlythMeister/a5512567c1899d83a2697260a9cfcf0b to your computer and use it in GitHub Desktop.
NUnit 4 Breaking Change Migration
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void Main() | |
{ | |
var rootDir = @"F:\GIT\Repo"; | |
var classicAssert = true; | |
foreach (var projFile in Directory.GetFiles(rootDir, "*.*proj", SearchOption.AllDirectories)) | |
{ | |
var projContent = File.ReadAllLines(projFile); | |
if (projContent.Any(line => line.Contains("NUnit", StringComparison.InvariantCultureIgnoreCase))) | |
{ | |
var dirPath = Path.GetDirectoryName(projFile); | |
var extension = Path.GetExtension(projFile); | |
if (classicAssert) | |
{ | |
switch (extension) | |
{ | |
case ".csproj": | |
ClassicAssert(dirPath, "*.cs", content => content.Contains("using NUnit.Framework;") && !content.Contains("using NUnit.Framework.Legacy;") ? content.Replace("using NUnit.Framework;", "using NUnit.Framework;\r\nusing NUnit.Framework.Legacy;") : content); | |
break; | |
case ".vbproj": | |
ClassicAssert(dirPath, "*.vb", content => content.Contains("Imports NUnit.Framework") && !content.Contains("Imports NUnit.Framework.Legacy") ? content.Replace("Imports NUnit.Framework", "Imports NUnit.Framework\r\nImports NUnit.Framework.Legacy") : content); | |
break; | |
case ".fsproj": | |
ClassicAssert(dirPath, "*.fs", content => content.Contains("open NUnit.Framework") && !content.Contains("open NUnit.Framework.Legacy") ? content.Replace("open NUnit.Framework", "open NUnit.Framework\r\nopen NUnit.Framework.Legacy") : content); | |
break; | |
default: | |
throw new Exception($"Unknown project file type: {extension}"); | |
} | |
} | |
else | |
{ | |
switch (extension) | |
{ | |
case ".csproj": | |
RegExReplaceDirectoryCSharp(dirPath); | |
break; | |
default: | |
throw new Exception($"Unknown project file type: {extension}"); | |
} | |
} | |
} | |
} | |
} | |
void ClassicAssert(string directory, string extension, Func<string, string> updateUsing) | |
{ | |
foreach (var file in Directory.GetFiles(directory, extension, SearchOption.AllDirectories)) | |
{ | |
var encoding = GetEncoding(file); | |
var content = File.ReadAllText(file, encoding); | |
var updateMade = false; | |
if (content.Contains("Assert.Pass")) { content = content.Replace("Assert.Pass", "ClassicAssert.Pass"); updateMade = true; } | |
if (content.Contains("Assert.Fail")) { content = content.Replace("Assert.Fail", "ClassicAssert.Fail"); updateMade = true; } | |
if (content.Contains("Assert.True")) { content = content.Replace("Assert.True", "ClassicAssert.True"); updateMade = true; } | |
if (content.Contains("Assert.False")) { content = content.Replace("Assert.False", "ClassicAssert.False"); updateMade = true; } | |
if (content.Contains("Assert.IsTrue")) { content = content.Replace("Assert.IsTrue", "ClassicAssert.True"); updateMade = true; } | |
if (content.Contains("Assert.IsFalse")) { content = content.Replace("Assert.IsFalse", "ClassicAssert.False"); updateMade = true; } | |
if (content.Contains("Assert.Null")) { content = content.Replace("Assert.Null", "ClassicAssert.Null"); updateMade = true; } | |
if (content.Contains("Assert.NotNull")) { content = content.Replace("Assert.NotNull", "ClassicAssert.NotNull"); updateMade = true; } | |
if (content.Contains("Assert.IsNull")) { content = content.Replace("Assert.IsNull", "ClassicAssert.Null"); updateMade = true; } | |
if (content.Contains("Assert.IsNotNull")) { content = content.Replace("Assert.IsNotNull", "ClassicAssert.NotNull"); updateMade = true; } | |
if (content.Contains("Assert.Zero")) { content = content.Replace("Assert.Zero", "ClassicAssert.Zero"); updateMade = true; } | |
if (content.Contains("Assert.NotZero")) { content = content.Replace("Assert.NotZero", "ClassicAssert.NotZero"); updateMade = true; } | |
if (content.Contains("Assert.IsNaN")) { content = content.Replace("Assert.IsNaN", "ClassicAssert.IsNaN"); updateMade = true; } | |
if (content.Contains("Assert.IsEmpty")) { content = content.Replace("Assert.IsEmpty", "ClassicAssert.IsEmpty"); updateMade = true; } | |
if (content.Contains("Assert.IsNotEmpty")) { content = content.Replace("Assert.IsNotEmpty", "ClassicAssert.IsNotEmpty"); updateMade = true; } | |
if (content.Contains("Assert.AreEqual")) { content = content.Replace("Assert.AreEqual", "ClassicAssert.AreEqual"); updateMade = true; } | |
if (content.Contains("Assert.AreNotEqual")) { content = content.Replace("Assert.AreNotEqual", "ClassicAssert.AreNotEqual"); updateMade = true; } | |
if (content.Contains("Assert.AreSame")) { content = content.Replace("Assert.AreSame", "ClassicAssert.AreSame"); updateMade = true; } | |
if (content.Contains("Assert.AreNotSame")) { content = content.Replace("Assert.AreNotSame", "ClassicAssert.AreNotSame"); updateMade = true; } | |
if (content.Contains("Assert.Contains")) { content = content.Replace("Assert.Contains", "ClassicAssert.Contains"); updateMade = true; } | |
if (content.Contains("Assert.Greater")) { content = content.Replace("Assert.Greater", "ClassicAssert.Greater"); updateMade = true; } | |
if (content.Contains("Assert.GreaterOrEqual")) { content = content.Replace("Assert.GreaterOrEqual", "ClassicAssert.GreaterOrEqual"); updateMade = true; } | |
if (content.Contains("Assert.Less")) { content = content.Replace("Assert.Less", "ClassicAssert.Less"); updateMade = true; } | |
if (content.Contains("Assert.LessOrEqual")) { content = content.Replace("Assert.LessOrEqual", "ClassicAssert.LessOrEqual"); updateMade = true; } | |
if (content.Contains("Assert.Positive")) { content = content.Replace("Assert.Positive", "ClassicAssert.Positive"); updateMade = true; } | |
if (content.Contains("Assert.Negative")) { content = content.Replace("Assert.Negative", "ClassicAssert.Negative"); updateMade = true; } | |
if (content.Contains("Assert.IsInstanceOf")) { content = content.Replace("Assert.IsInstanceOf", "ClassicAssert.IsInstanceOf"); updateMade = true; } | |
if (content.Contains("Assert.IsNotInstanceOf")) { content = content.Replace("Assert.IsNotInstanceOf", "ClassicAssert.IsNotInstanceOf"); updateMade = true; } | |
if (content.Contains("Assert.IsAssignableFrom")) { content = content.Replace("Assert.IsAssignableFrom", "ClassicAssert.IsAssignableFrom"); updateMade = true; } | |
if (content.Contains("Assert.IsNotAssignableFrom")) { content = content.Replace("Assert.IsNotAssignableFrom", "ClassicAssert.IsNotAssignableFrom"); updateMade = true; } | |
if (content.Contains("StringClassicAssert")) { content = content.Replace("StringClassicAssert", "StringAssert"); updateMade = true; } | |
if (content.Contains("CollectionClassicAssert")) { content = content.Replace("CollectionClassicAssert", "CollectionAssert"); updateMade = true; } | |
if (content.Contains("FileClassicAssert")) { content = content.Replace("FileClassicAssert", "FileAssert"); updateMade = true; } | |
if (content.Contains("ClassicClassicAssert")) { content = content.Replace("ClassicClassicAssert", "ClassicAssert"); updateMade = true; } | |
if (content.Contains("StringAssert") || | |
content.Contains("CollectionAssert") || | |
content.Contains("FileAssert")) | |
{ | |
updateMade = true; | |
} | |
if (updateMade) | |
{ | |
content = updateUsing(content); | |
Console.WriteLine($"Update File: {file}"); | |
File.WriteAllText(file, content, encoding); | |
} | |
} | |
} | |
void RegExReplaceDirectoryCSharp(string rootDir) | |
{ | |
Console.WriteLine($"Checking files in: {rootDir}"); | |
// With Message | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.AreEqual\(null\s?,\s?(.*)\s?,\s?(\"".*\"")\);", @"Assert.That($1, Is.Null, $2);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.AreEqual\((.*).GetType\(\)\s?,\s?typeof\((.*)\)\s?,\s?(\"".*\"")\);", @"Assert.That($1, Is.TypeOf<$2>(), $3);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.AreEqual\((.*)\s?,\s?(.*)\s?,\s?(\"".*\"")\);", @"Assert.That($1, Is.EqualTo($2), $3);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.AreNotEqual\((.*)\s?,\s?(.*)\s?,\s?(\"".*\"")\);", @"Assert.That($1, Is.Not.EqualTo($2), $3);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsGreater\((.*)\s?,\s?(.*)\s?,\s?(\"".*\"")\);", @"Assert.That($1, Is.GreaterThan($2), $3);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.Greater\((.*)\s?,\s?(.*)\s?,\s?(\"".*\"")\);", @"Assert.That($1, Is.GreaterThan($2), $3);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsLess\((.*)\s?,\s?(.*)\s?,\s?(\"".*\"")\);", @"Assert.That($1, Is.LessThan($2), $3);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.Less\((.*)\s?,\s?(.*)\s?,\s?(\"".*\"")\);", @"Assert.That($1, Is.LessThan($2), $3);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsNotNull\((.*)\s?,\s?(\"".*\"")\);", "Assert.That($1, Is.Not.Null, $2);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.NotNull\((.*)\s?,\s?(\"".*\"")\);", "Assert.That($1, Is.Not.Null, $2);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsNull\((.*)\s?,\s?(\"".*\"")\);", "Assert.That($1, Is.Null, $2);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.Null\((.*)\s?,\s?(\"".*\"")\);", "Assert.That($1, Is.Null, $2);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsTrue\((.*)\s?,\s?(\"".*\"")\);", "Assert.That($1, Is.True, $2);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.True\((.*)\s?,\s?(\"".*\"")\);", "Assert.That($1, Is.True, $2);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsFalse\((.*)\s?,\s?(\"".*\"")\);", "Assert.That($1, Is.False, $2);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.False\((.*)\s?,\s?(\"".*\"")\);", "Assert.That($1, Is.False, $2);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsEmpty\((.*)\s?,\s?(\"".*\"")\);", "Assert.That($1, Is.Empty, $2);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.Empty\((.*)\s?,\s?(\"".*\"")\);", "Assert.That($1, Is.Empty, $2);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsNotEmpty\((.*)\s?,\s?(\"".*\"")\);", "Assert.That($1, Is.Not.Empty, $2);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.NotEmpty\((.*)\s?,\s?(\"".*\"")\);", "Assert.That($1, Is.Not.Empty, $2);"); | |
// Without Message | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.AreEqual\(null\s?,\s?(.*)\);", @"Assert.That($1, Is.Null);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.AreEqual\((.*).GetType\(\)\s?,\s?typeof\((.*)\)\);", @"Assert.That($1, Is.TypeOf<$2>());"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.AreEqual\((.*)\s?,\s?(.*)\);", @"Assert.That($1, Is.EqualTo($2));"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.AreNotEqual\((.*)\s?,\s?(.*)\);", @"Assert.That($1, Is.Not.EqualTo($2));"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsGreater\((.*)\s?,\s?(.*)\);", @"Assert.That($1, Is.GreaterThan($2));"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.Greater\((.*)\s?,\s?(.*)\);", @"Assert.That($1, Is.GreaterThan($2));"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsLess\((.*)\s?,\s?(.*)\);", @"Assert.That($1, Is.LessThan($2));"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.Less\((.*)\s?,\s?(.*)\);", @"Assert.That($1, Is.LessThan($2));"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsNotNull\((.*)\);", "Assert.That($1, Is.Not.Null);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.NotNull\((.*)\);", "Assert.That($1, Is.Not.Null);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsNull\((.*)\);", "Assert.That($1, Is.Null);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.Null\((.*)\);", "Assert.That($1, Is.Null);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsTrue\((.*)\);", "Assert.That($1, Is.True);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.True\((.*)\);", "Assert.That($1, Is.True);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsFalse\((.*)\);", "Assert.That($1, Is.False);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.False\((.*)\);", "Assert.That($1, Is.False);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsEmpty\((.*)\);", "Assert.That($1, Is.Empty);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.Empty\((.*)\);", "Assert.That($1, Is.Empty);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsNotEmpty\((.*)\);", "Assert.That($1, Is.Not.Empty);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.NotEmpty\((.*)\);", "Assert.That($1, Is.Not.Empty);"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsAssignableFrom\<(.*?)\>\((.*?)\);", "Assert.That($2, Is.AssignableFrom<$1>());"); | |
RegExReplaceFiles(rootDir, "*.cs", @"Assert\.IsNotAssignableFrom\<(.*?)\>\((.*?)\);", "Assert.That($2, Is.Not.AssignableFrom<$1>());"); | |
} | |
void RegExReplaceFiles(string rootDir, string extension, string regexSearch, string regexReplace) | |
{ | |
foreach (var file in Directory.GetFiles(rootDir, extension, SearchOption.AllDirectories)) | |
{ | |
var encoding = GetEncoding(file); | |
var content = File.ReadAllText(file, encoding); | |
if(Regex.Match(content, regexSearch).Success) | |
{ | |
Console.WriteLine($"{file} :- Match for '{regexSearch}'"); | |
content = Regex.Replace(content, regexSearch, regexReplace, RegexOptions.Multiline); | |
File.WriteAllText(file, content, encoding); | |
} | |
} | |
} | |
Encoding GetEncoding(string filename) | |
{ | |
var bom = new byte[4]; | |
using (var file = new FileStream(filename, FileMode.Open, FileAccess.Read)) | |
{ | |
file.Read(bom, 0, 4); | |
} | |
if (bom[0] == 0x2b && bom[1] == 0x2f && bom[2] == 0x76) return Encoding.UTF7; | |
if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf) return Encoding.UTF8; | |
if (bom[0] == 0xff && bom[1] == 0xfe && bom[2] == 0 && bom[3] == 0) return Encoding.UTF32; //UTF-32LE | |
if (bom[0] == 0xff && bom[1] == 0xfe) return Encoding.Unicode; //UTF-16LE | |
if (bom[0] == 0xfe && bom[1] == 0xff) return Encoding.BigEndianUnicode; //UTF-16BE | |
if (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff) return new UTF32Encoding(true, true); //UTF-32BE | |
return Encoding.ASCII; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment