Test namespace generation in imported types.

This commit is contained in:
Kuba Ober 2019-08-29 12:01:08 -04:00
parent 4f431856ba
commit 881a59b2c9
7 changed files with 54 additions and 1 deletions

View File

@ -70,6 +70,16 @@ namespace capnpc_csharp.Tests.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] UnitTest10_capnp {
get {
object obj = ResourceManager.GetObject("UnitTest10_capnp", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>

View File

@ -118,6 +118,9 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="UnitTest10_capnp" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\UnitTest10.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="UnitTest3_capnp" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\UnitTest3.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>

Binary file not shown.

View File

@ -0,0 +1,9 @@
@0xbbfd48ae4b99d012;
using Cxx = import "/capnp/c++.capnp";
$Cxx.namespace("Foo::Bar::Baz");
struct Outer {
inner @0: import "UnitTest10b.capnp".Inner ;
}

View File

@ -0,0 +1,7 @@
@0xaf95c1c78b01be97;
using Cxx = import "/capnp/c++.capnp";
$Cxx.namespace("Foo::Garf::Snarf");
struct Inner {}

View File

@ -1,6 +1,7 @@
using capnpc_csharp.Tests.Properties;
using Capnp;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@ -47,6 +48,29 @@ namespace CapnpC
// Should not throw
}
[TestMethod]
public void Test10ImportedNamespaces()
{
var model = Load(Resources.UnitTest10_capnp);
var codeGen = NewGeneratorFor(model);
var genFile = model.FilesToGenerate.First();
var outerTypeDef = genFile.NestedTypes.First();
var outerType = Model.Types.FromDefinition(outerTypeDef);
var innerType = outerTypeDef.Fields[0].Type;
var innerTypeDef = innerType.Definition;
var names = codeGen.GetNames();
var outerNameSyntax = names.GetQName(outerType, outerTypeDef);
var innerNameSyntax = names.GetQName(innerType, outerTypeDef);
string[] outerNamespace = { "Foo", "Bar", "Baz" };
string[] innerNamespace = { "Foo", "Garf", "Snarf" };
CollectionAssert.AreEqual(outerNamespace, (outerTypeDef.DeclaringElement as Model.GenFile).Namespace);
CollectionAssert.AreEqual(innerNamespace, (innerType.Definition.DeclaringElement as Model.GenFile).Namespace);
string outerNSStr = String.Join('.', outerNamespace);
string innerNSStr = String.Join('.', innerNamespace);
Assert.AreEqual($"{outerNSStr}.Outer", outerNameSyntax.ToString());
Assert.AreEqual($"{innerNSStr}.Inner", innerNameSyntax.ToString());
}
static Generator.CodeGenerator NewGeneratorFor(Model.SchemaModel model)
=> new Generator.CodeGenerator(model, new Generator.GeneratorOptions());

View File

@ -235,7 +235,7 @@ namespace CapnpC.Generator
return qtype;
}
NameSyntax GetQName(Model.Type type, TypeDefinition scope)
internal NameSyntax GetQName(Model.Type type, TypeDefinition scope)
{
// FIXME: With the help of the 'scope' parameter we will be able to generate abbreviated
// qualified names. Unfortunately the commented approach is too naive. It will fail if