Browse Source

Move GeneratorTestFixture type to its own file.

pull/1535/head
josetr 5 years ago
parent
commit
9b69f14705
  1. 82
      src/Generator.Tests/GeneratorTest.cs
  2. 89
      src/Generator.Tests/GeneratorTestFixture.cs

82
src/Generator.Tests/GeneratorTest.cs

@ -1,10 +1,8 @@ @@ -1,10 +1,8 @@
using System;
using System.IO;
using System.Reflection;
using System.Text.RegularExpressions;
using CppSharp.AST;
using CppSharp.Generators;
using NUnit.Framework;
namespace CppSharp.Utils
{
@ -107,84 +105,4 @@ namespace CppSharp.Utils @@ -107,84 +105,4 @@ namespace CppSharp.Utils
}
#endregion
}
/// <summary>
/// The main NUnit fixture base class for a generator-based tests project.
/// Provides support for a text-based test system that looks for lines
/// in the native test declarations that match a certain pattern, which
/// are used for certain kinds of tests that cannot be done with just
/// C# code and using the generated wrappers.
/// </summary>
[TestFixture]
public abstract class GeneratorTestFixture
{
readonly string assemblyName;
protected GeneratorTestFixture()
{
var location = Assembly.GetCallingAssembly().Location;
assemblyName = Path.GetFileNameWithoutExtension(location);
}
static bool GetGeneratorKindFromLang(string lang, out GeneratorKind kind)
{
kind = GeneratorKind.CSharp;
switch(lang)
{
case "CSharp":
case "C#":
kind = GeneratorKind.CSharp;
return true;
case "CLI":
kind = GeneratorKind.CLI;
return true;
}
return false;
}
[Test]
public void CheckDirectives()
{
var name = assemblyName.Substring(0, assemblyName.IndexOf('.'));
var kind = assemblyName.Substring(assemblyName.LastIndexOf('.') + 1);
GeneratorKind testKind;
if (!GetGeneratorKindFromLang(kind, out testKind))
throw new NotSupportedException("Unknown language generator");
var path = Path.GetFullPath(GeneratorTest.GetTestsDirectory(name));
foreach (var header in Directory.EnumerateFiles(path, "*.h"))
{
var headerText = File.ReadAllText(header);
// Parse the header looking for suitable lines to test.
foreach (var line in File.ReadAllLines(header))
{
var match = Regex.Match(line, @"^\s*///*\s*(\S+)\s*:\s*(.*)");
if (!match.Success)
continue;
var matchLang = match.Groups[1].Value;
GeneratorKind matchKind;
if (!GetGeneratorKindFromLang(matchLang.ToUpper(), out matchKind))
continue;
if (matchKind != testKind)
continue;
var matchText = match.Groups[2].Value;
if (string.IsNullOrWhiteSpace(matchText))
continue;
var matchIndex = headerText.IndexOf(matchText, StringComparison.Ordinal);
Assert.IsTrue(matchIndex != -1,
string.Format("Could not match '{0}' in file '{1}'",
matchText, header));
}
}
}
}
}

89
src/Generator.Tests/GeneratorTestFixture.cs

@ -0,0 +1,89 @@ @@ -0,0 +1,89 @@
using System;
using System.IO;
using System.Reflection;
using System.Text.RegularExpressions;
using CppSharp.Generators;
using NUnit.Framework;
namespace CppSharp.Utils
{
/// <summary>
/// The main NUnit fixture base class for a generator-based tests project.
/// Provides support for a text-based test system that looks for lines
/// in the native test declarations that match a certain pattern, which
/// are used for certain kinds of tests that cannot be done with just
/// C# code and using the generated wrappers.
/// </summary>
[TestFixture]
public abstract class GeneratorTestFixture
{
readonly string assemblyName;
protected GeneratorTestFixture()
{
var location = Assembly.GetCallingAssembly().Location;
assemblyName = Path.GetFileNameWithoutExtension(location);
}
static bool GetGeneratorKindFromLang(string lang, out GeneratorKind kind)
{
kind = GeneratorKind.CSharp;
switch(lang)
{
case "CSharp":
case "C#":
kind = GeneratorKind.CSharp;
return true;
case "CLI":
kind = GeneratorKind.CLI;
return true;
}
return false;
}
[Test]
public void CheckDirectives()
{
var name = assemblyName.Substring(0, assemblyName.IndexOf('.'));
var kind = assemblyName.Substring(assemblyName.LastIndexOf('.') + 1);
GeneratorKind testKind;
if (!GetGeneratorKindFromLang(kind, out testKind))
throw new NotSupportedException("Unknown language generator");
var path = Path.GetFullPath(GeneratorTest.GetTestsDirectory(name));
foreach (var header in Directory.EnumerateFiles(path, "*.h"))
{
var headerText = File.ReadAllText(header);
// Parse the header looking for suitable lines to test.
foreach (var line in File.ReadAllLines(header))
{
var match = Regex.Match(line, @"^\s*///*\s*(\S+)\s*:\s*(.*)");
if (!match.Success)
continue;
var matchLang = match.Groups[1].Value;
GeneratorKind matchKind;
if (!GetGeneratorKindFromLang(matchLang.ToUpper(), out matchKind))
continue;
if (matchKind != testKind)
continue;
var matchText = match.Groups[2].Value;
if (string.IsNullOrWhiteSpace(matchText))
continue;
var matchIndex = headerText.IndexOf(matchText, StringComparison.Ordinal);
Assert.IsTrue(matchIndex != -1,
string.Format("Could not match '{0}' in file '{1}'",
matchText, header));
}
}
}
}
}
Loading…
Cancel
Save