Factor out common code in unit tests.

This commit is contained in:
Kuba Ober 2019-08-30 13:54:47 -04:00
parent 024ecbbced
commit 2460467fa4

View File

@ -11,6 +11,7 @@ namespace CapnpC
[TestClass] [TestClass]
public class UnitTests public class UnitTests
{ {
static readonly Dictionary<int, string> GeneratedCode = new Dictionary<int, string>();
[TestMethod] [TestMethod]
public void Test00Enumerant() public void Test00Enumerant()
@ -22,11 +23,9 @@ namespace CapnpC
[TestMethod] [TestMethod]
public void Test01NestedClash() public void Test01NestedClash()
{ {
var model = Load(Resources.UnitTest1_capnp); var run = LoadAndGenerate(Resources.UnitTest1_capnp, 1);
var structFoo = GetTypeDef(0x93db6ba5509bac24, model); var structFoo = GetTypeDef(0x93db6ba5509bac24, run.Model);
var codeGen = NewGeneratorFor(model); var names = run.CodeGen.GetNames();
codeGen.Transform(model.FilesToGenerate.First());
var names = codeGen.GetNames();
var fieldName = names.GetCodeIdentifier(structFoo.Fields[0]).ToString(); var fieldName = names.GetCodeIdentifier(structFoo.Fields[0]).ToString();
Assert.AreEqual("Foo", structFoo.Name); Assert.AreEqual("Foo", structFoo.Name);
Assert.AreNotEqual(structFoo.Name, fieldName); Assert.AreNotEqual(structFoo.Name, fieldName);
@ -35,30 +34,26 @@ namespace CapnpC
[TestMethod] [TestMethod]
public void Test02ForwardInheritance() public void Test02ForwardInheritance()
{ {
var model = Load(Resources.UnitTest2_capnp); LoadAndGenerate(Resources.UnitTest2_capnp, 2);
var codeGen = NewGeneratorFor(model);
codeGen.Transform(model.FilesToGenerate.First());
// Should not throw // Should not throw
} }
[TestMethod] [TestMethod]
public void Test03NonGeneratedNodeSkip() public void Test03NonGeneratedNodeSkip()
{ {
var model = Load(Resources.UnitTest3_capnp); LoadAndGenerate(Resources.UnitTest3_capnp, 3);
// Should not throw // Should not throw
} }
[TestMethod] [TestMethod]
public void Test10ImportedNamespaces() public void Test10ImportedNamespaces()
{ {
var model = Load(Resources.UnitTest10_capnp); var run = LoadAndGenerate(Resources.UnitTest10_capnp, 10);
var codeGen = NewGeneratorFor(model); var outerTypeDef = run.FirstFile.NestedTypes.First();
var genFile = model.FilesToGenerate.First();
var outerTypeDef = genFile.NestedTypes.First();
var outerType = Model.Types.FromDefinition(outerTypeDef); var outerType = Model.Types.FromDefinition(outerTypeDef);
var innerType = outerTypeDef.Fields[0].Type; var innerType = outerTypeDef.Fields[0].Type;
var innerTypeDef = innerType.Definition; var innerTypeDef = innerType.Definition;
var names = codeGen.GetNames(); var names = run.CodeGen.GetNames();
var outerNameSyntax = names.GetQName(outerType, outerTypeDef); var outerNameSyntax = names.GetQName(outerType, outerTypeDef);
var innerNameSyntax = names.GetQName(innerType, outerTypeDef); var innerNameSyntax = names.GetQName(innerType, outerTypeDef);
string[] outerNamespace = { "Foo", "Bar", "Baz" }; string[] outerNamespace = { "Foo", "Bar", "Baz" };
@ -74,31 +69,47 @@ namespace CapnpC
[TestMethod] [TestMethod]
public void Test11ImportedConst() public void Test11ImportedConst()
{ {
var model = Load(Resources.UnitTest11_capnp); LoadAndGenerate(Resources.UnitTest11_capnp, 11);
// Should not throw // Should not throw
} }
[TestMethod] [TestMethod]
public void Test20AnnotationAndConst() public void Test20AnnotationAndConst()
{ {
var model = Load(Resources.UnitTest20_capnp); LoadAndGenerate(Resources.UnitTest20_capnp, 20);
var codeGen = NewGeneratorFor(model);
codeGen.Transform(model.FilesToGenerate.First());
// Should not throw // Should not throw
} }
[TestMethod] [TestMethod]
public void Test30SchemaCapnp() public void Test30SchemaCapnp()
{ {
var model = Load(Resources.schema_with_offsets_capnp); LoadAndGenerate(Resources.schema_with_offsets_capnp);
var codeGen = NewGeneratorFor(model);
codeGen.Transform(model.FilesToGenerate.First());
// Should not throw // Should not throw
} }
struct Run
{
public Model.SchemaModel Model;
public Generator.CodeGenerator CodeGen;
public Model.GenFile FirstFile;
public string Code;
}
static Generator.CodeGenerator NewGeneratorFor(Model.SchemaModel model) static Generator.CodeGenerator NewGeneratorFor(Model.SchemaModel model)
=> new Generator.CodeGenerator(model, new Generator.GeneratorOptions()); => new Generator.CodeGenerator(model, new Generator.GeneratorOptions());
Run LoadAndGenerate(byte[] input, int? testNum = null)
{
var run = new Run();
run.Model = Load(input);
run.CodeGen = NewGeneratorFor(run.Model);
run.FirstFile = run.Model.FilesToGenerate.First();
run.Code = run.CodeGen.Transform(run.FirstFile);
if (testNum is int num)
GeneratedCode[num] = run.Code;
return run;
}
static Model.TypeDefinition GetTypeDef(ulong id, Model.SchemaModel model) static Model.TypeDefinition GetTypeDef(ulong id, Model.SchemaModel model)
{ {
foreach (var defs in model.FilesToGenerate.Select(f => f.NestedTypes)) foreach (var defs in model.FilesToGenerate.Select(f => f.NestedTypes))