diff --git a/README.md b/README.md index b97500b..db6030c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -# capnproto-dotnetcore +# capnproto-dotnetcore [![Build status](https://ci.appveyor.com/api/projects/status/tx4jjl2etiqve2xg/branch/master?svg=true)](https://ci.appveyor.com/project/c80k/capnproto-dotnetcore/branch/master) + A Cap'n Proto implementation for .NET Standard 2.0 (credits to [lostinplace](https://github.com/lostinplace)) and .NET Core 2.1. ["Cap'n Proto is an insanely fast data interchange format and capability-based RPC system."](https://capnproto.org/) Whilst the original implementation is written in C++ there are several ports to other languages. This is a C# implementation for .NET Core. @@ -13,9 +14,7 @@ The overall deployment consists of two components: ### Code generator back end: Windows -Disclaimer: The mid-term goal is to provide the C# code generator backend as Chocolatey package. It turns out that setting up a correct package verification process (which is a requirement for package approval) requires more effort than expected. See [Issue: Not on Chocolatey](https://github.com/c80k/capnproto-dotnetcore/issues/6) for instructions on how to create and install the package locally. Read on to get an impression on how it's supposed to work in the future. - -The C# code generator back end will be available as [Chocolatey](https://chocolatey.org/) package. You may choose between two flavors: The portable version requires a .NET Core 2.1 (or higher) runtime or SDK (type `dotnet` at command line prompt to check whether you already have one). This is the recommended variant. To install, type +The C# code generator back end is available as [Chocolatey](https://chocolatey.org/) package. You may choose between two flavors: The portable version requires a .NET Core 2.1 (or higher) runtime or SDK (type `dotnet` at command line prompt to check whether you already have one). This is the recommended variant. To install, type ``` choco install capnpc-csharp @@ -50,10 +49,11 @@ vcpkg install capnproto ``` Solution/project structure is as follows: -- Capnp.Net.sln contains three projects: +- Capnp.Net.sln contains these projects: * Capnp.Net.Runtime is the runtime implementation, a .NET assembly. - * capnpc-csharp is the compiler backend for C# language - * Capnp.Net.Runtime.Tests is an MS Unit Testing assembly, containing - you guessed it - the test suite + * capnpc-csharp is the generator backend for C# language. + * Capnp.Net.Runtime.Tests is an MS Unit Testing assembly, containing - you guessed it - the test suite. + * capnpc-csharp.tests contains the generator backend test suite. - CapnpCompatTest.sln compiles to a native x86 executable which depends on the original Cap'n Proto C++ implementation. It is (partially) required by the test suite for interoperability testing. ## Features diff --git a/capnpc-csharp.tests/Resources/UnitTest1.capnp.bin b/capnpc-csharp.tests/Embedded Resources/UnitTest1.capnp.bin similarity index 100% rename from capnpc-csharp.tests/Resources/UnitTest1.capnp.bin rename to capnpc-csharp.tests/Embedded Resources/UnitTest1.capnp.bin diff --git a/capnpc-csharp.tests/Resources/UnitTest10.capnp.bin b/capnpc-csharp.tests/Embedded Resources/UnitTest10.capnp.bin similarity index 100% rename from capnpc-csharp.tests/Resources/UnitTest10.capnp.bin rename to capnpc-csharp.tests/Embedded Resources/UnitTest10.capnp.bin diff --git a/capnpc-csharp.tests/Resources/UnitTest11.capnp.bin b/capnpc-csharp.tests/Embedded Resources/UnitTest11.capnp.bin similarity index 100% rename from capnpc-csharp.tests/Resources/UnitTest11.capnp.bin rename to capnpc-csharp.tests/Embedded Resources/UnitTest11.capnp.bin diff --git a/capnpc-csharp.tests/Resources/UnitTest2.capnp.bin b/capnpc-csharp.tests/Embedded Resources/UnitTest2.capnp.bin similarity index 100% rename from capnpc-csharp.tests/Resources/UnitTest2.capnp.bin rename to capnpc-csharp.tests/Embedded Resources/UnitTest2.capnp.bin diff --git a/capnpc-csharp.tests/Resources/UnitTest20.capnp.bin b/capnpc-csharp.tests/Embedded Resources/UnitTest20.capnp.bin similarity index 100% rename from capnpc-csharp.tests/Resources/UnitTest20.capnp.bin rename to capnpc-csharp.tests/Embedded Resources/UnitTest20.capnp.bin diff --git a/capnpc-csharp.tests/Resources/UnitTest3.capnp.bin b/capnpc-csharp.tests/Embedded Resources/UnitTest3.capnp.bin similarity index 100% rename from capnpc-csharp.tests/Resources/UnitTest3.capnp.bin rename to capnpc-csharp.tests/Embedded Resources/UnitTest3.capnp.bin diff --git a/capnpc-csharp.tests/Resources/UnitTest4.capnp.bin b/capnpc-csharp.tests/Embedded Resources/UnitTest4.capnp.bin similarity index 100% rename from capnpc-csharp.tests/Resources/UnitTest4.capnp.bin rename to capnpc-csharp.tests/Embedded Resources/UnitTest4.capnp.bin diff --git a/capnpc-csharp.tests/Resources/schema-with-offsets.capnp.bin b/capnpc-csharp.tests/Embedded Resources/schema-with-offsets.capnp.bin similarity index 100% rename from capnpc-csharp.tests/Resources/schema-with-offsets.capnp.bin rename to capnpc-csharp.tests/Embedded Resources/schema-with-offsets.capnp.bin diff --git a/capnpc-csharp.tests/FeatureSteps/CodeGeneratorSteps.cs b/capnpc-csharp.tests/FeatureSteps/CodeGeneratorSteps.cs index 366c0e3..4d3a893 100644 --- a/capnpc-csharp.tests/FeatureSteps/CodeGeneratorSteps.cs +++ b/capnpc-csharp.tests/FeatureSteps/CodeGeneratorSteps.cs @@ -1,5 +1,4 @@ -using capnpc_csharp.Tests.Properties; -using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.IO; using System.Reflection; @@ -17,7 +16,7 @@ namespace capnpc_csharp.Tests bool _success; Exception _generateException; - Stream LoadResource(string name) + internal static Stream LoadResource(string name) { var assembly = Assembly.GetExecutingAssembly(); string[] names = assembly.GetManifestResourceNames(); diff --git a/capnpc-csharp.tests/Properties/Resources.Designer.cs b/capnpc-csharp.tests/Properties/Resources.Designer.cs deleted file mode 100644 index 336b474..0000000 --- a/capnpc-csharp.tests/Properties/Resources.Designer.cs +++ /dev/null @@ -1,143 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.42000 -// -// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -// der Code erneut generiert wird. -// -//------------------------------------------------------------------------------ - -namespace capnpc_csharp.Tests.Properties { - using System; - - - /// - /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - /// - // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert - // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. - // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("capnpc_csharp.Tests.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] schema_with_offsets_capnp { - get { - object obj = ResourceManager.GetObject("schema_with_offsets_capnp", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] UnitTest1_capnp { - get { - object obj = ResourceManager.GetObject("UnitTest1_capnp", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] UnitTest10_capnp { - get { - object obj = ResourceManager.GetObject("UnitTest10_capnp", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] UnitTest11_capnp { - get { - object obj = ResourceManager.GetObject("UnitTest11_capnp", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] UnitTest2_capnp { - get { - object obj = ResourceManager.GetObject("UnitTest2_capnp", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] UnitTest20_capnp { - get { - object obj = ResourceManager.GetObject("UnitTest20_capnp", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] UnitTest3_capnp { - get { - object obj = ResourceManager.GetObject("UnitTest3_capnp", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] UnitTest4_capnp { - get { - object obj = ResourceManager.GetObject("UnitTest4_capnp", resourceCulture); - return ((byte[])(obj)); - } - } - } -} diff --git a/capnpc-csharp.tests/Properties/Resources.resx b/capnpc-csharp.tests/Properties/Resources.resx deleted file mode 100644 index b4ecfef..0000000 --- a/capnpc-csharp.tests/Properties/Resources.resx +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\UnitTest10.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\UnitTest20.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\UnitTest3.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\UnitTest2.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\UnitTest1.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\schema-with-offsets.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\UnitTest11.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\UnitTest4.capnp.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/capnpc-csharp.tests/Resources/test.capnp.bin b/capnpc-csharp.tests/Resources/test.capnp.bin deleted file mode 100644 index 66c8d13..0000000 Binary files a/capnpc-csharp.tests/Resources/test.capnp.bin and /dev/null differ diff --git a/capnpc-csharp.tests/UnitTests.cs b/capnpc-csharp.tests/UnitTests.cs index f7d59fd..e2b80d5 100644 --- a/capnpc-csharp.tests/UnitTests.cs +++ b/capnpc-csharp.tests/UnitTests.cs @@ -1,29 +1,30 @@ -using capnpc_csharp.Tests.Properties; using Capnp; +using Model = CapnpC.Model; +using Generator = CapnpC.Generator; +using CodeGeneratorRequest = CapnpC.Schema.CodeGeneratorRequest; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Collections.Generic; -using System.IO; using System.Linq; -namespace CapnpC +namespace capnpc_csharp.Tests { [TestClass] - public class UnitTests + public class CodeGeneratorUnitTests { static readonly Dictionary GeneratedCode = new Dictionary(); [TestMethod] public void Test00Enumerant() { - var model = Load(Resources.UnitTest1_capnp); + var model = Load("UnitTest1.capnp.bin"); Assert.AreEqual("@byte", GetTypeDef(0xc8461867c409f5d4, model).Enumerants[0].Literal); } [TestMethod] public void Test01NestedClash() { - var run = LoadAndGenerate(Resources.UnitTest1_capnp, 1); + var run = LoadAndGenerate("UnitTest1.capnp.bin", 1); var structFoo = GetTypeDef(0x93db6ba5509bac24, run.Model); var names = run.CodeGen.GetNames(); var fieldName = names.GetCodeIdentifier(structFoo.Fields[0]).ToString(); @@ -34,28 +35,28 @@ namespace CapnpC [TestMethod] public void Test02ForwardInheritance() { - LoadAndGenerate(Resources.UnitTest2_capnp, 2); + LoadAndGenerate("UnitTest2.capnp.bin", 2); // Should not throw } [TestMethod] public void Test03NonGeneratedNodeSkip() { - LoadAndGenerate(Resources.UnitTest3_capnp, 3); + LoadAndGenerate("UnitTest3.capnp.bin", 3); // Should not throw } [TestMethod] public void Test04MutualDependencies() { - LoadAndGenerate(Resources.UnitTest4_capnp, 4); + LoadAndGenerate("UnitTest4.capnp.bin", 4); // Should not throw } [TestMethod] public void Test10ImportedNamespaces() { - var run = LoadAndGenerate(Resources.UnitTest10_capnp, 10); + var run = LoadAndGenerate("UnitTest10.capnp.bin", 10); var outerTypeDef = run.FirstFile.NestedTypes.First(); var outerType = Model.Types.FromDefinition(outerTypeDef); var innerType = outerTypeDef.Fields[0].Type; @@ -76,21 +77,21 @@ namespace CapnpC [TestMethod] public void Test11ImportedConst() { - LoadAndGenerate(Resources.UnitTest11_capnp, 11); + LoadAndGenerate("UnitTest11.capnp.bin", 11); // Should not throw } [TestMethod] public void Test20AnnotationAndConst() { - LoadAndGenerate(Resources.UnitTest20_capnp, 20); + LoadAndGenerate("UnitTest20.capnp.bin", 20); // Should not throw } [TestMethod] public void Test30SchemaCapnp() { - LoadAndGenerate(Resources.schema_with_offsets_capnp); + LoadAndGenerate("schema-with-offsets.capnp.bin"); // Should not throw } @@ -105,10 +106,10 @@ namespace CapnpC static Generator.CodeGenerator NewGeneratorFor(Model.SchemaModel model) => new Generator.CodeGenerator(model, new Generator.GeneratorOptions()); - Run LoadAndGenerate(byte[] input, int? testNum = null) + Run LoadAndGenerate(string inputName, int? testNum = null) { var run = new Run(); - run.Model = Load(input); + run.Model = Load(inputName); run.CodeGen = NewGeneratorFor(run.Model); run.FirstFile = run.Model.FilesToGenerate.First(); run.Code = run.CodeGen.Transform(run.FirstFile); @@ -137,16 +138,16 @@ namespace CapnpC return null; } - static Model.SchemaModel Load(byte[] data) + static Model.SchemaModel Load(string inputName) { WireFrame segments; - var input = new MemoryStream(data); + var input = CodeGeneratorSteps.LoadResource(inputName); using (input) { segments = Framing.ReadSegments(input); } var dec = DeserializerState.CreateRoot(segments); - var reader = Schema.CodeGeneratorRequest.Reader.Create(dec); + var reader = CodeGeneratorRequest.Reader.Create(dec); var model = Model.SchemaModel.Create(reader); return model; } diff --git a/capnpc-csharp.tests/capnpc-csharp.tests.csproj b/capnpc-csharp.tests/capnpc-csharp.tests.csproj index ebe9366..ce9a24e 100644 --- a/capnpc-csharp.tests/capnpc-csharp.tests.csproj +++ b/capnpc-csharp.tests/capnpc-csharp.tests.csproj @@ -23,7 +23,6 @@ - @@ -38,21 +37,14 @@ - - - - - True - True - Resources.resx - - - - - - ResXFileCodeGenerator - Resources.Designer.cs - + + + + + + + +