using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Seshat; using Seshat.DataDefinitions; using System.CodeDom; using System.Reflection; using System.IO; namespace Seshat.UnitTests { public class CodeGeneratorTests : UnitTestSharp.TestFixture { public class FlatMemberDefinitionTests : UnitTestSharp.EqualityTestFixture { public FlatMemberDefinitionTests() : base(new CodeGenerator.FlatMemberDefinition { fullName = "test", memberDefinition = new MemberDefinition { Name = "test", }, memberTypeDefinition = new ContextTypeDefinition { typeName = "test", } }) {} public void GetHashCodeTest() { var def = new CodeGenerator.FlatMemberDefinition(); CheckThrow(typeof(NotImplementedException)); def.GetHashCode(); } public void ToStringTest() { var def = new CodeGenerator.FlatMemberDefinition { fullName = "full_name", memberDefinition = new MemberDefinition { MemberType = "type", Name = "name", }, memberTypeDefinition = new ContextTypeDefinition { typeName = "type", } }; CheckEqual("type full_name", def.ToString()); } } public class FlattenMemberTests : UnitTestSharp.TestFixture { public void Basic() { const string ExampleSchema = @" schema = { Person = { name = string, age = int, weight = float, } }"; var member = new MemberDefinition { MemberType = "Person", Name = "person", }; var schema = Seshat.LuaDefinitions.LuaExecutor.RunScriptExtractSchema(ExampleSchema); var actual = CodeGenerator.FlattenMember(member, schema).ToList(); var expected = new CodeGenerator.FlatMemberDefinition[] { new CodeGenerator.FlatMemberDefinition { fullName = "person_name", memberTypeDefinition = new ContextTypeDefinition { typeName = "string", }, memberDefinition = new MemberDefinition { MemberType = "string", Name = "name", }, }, new CodeGenerator.FlatMemberDefinition { fullName = "person_age", memberTypeDefinition = new ContextTypeDefinition { typeName = "int", }, memberDefinition = new MemberDefinition { MemberType = "int", Name = "age", }, }, new CodeGenerator.FlatMemberDefinition { fullName = "person_weight", memberTypeDefinition = new ContextTypeDefinition { typeName = "float", }, memberDefinition = new MemberDefinition { MemberType = "float", Name = "weight", }, }, }; CheckEqual(expected, actual); } } public class BuildCSFileTest : UnitTestSharp.TestFixture { public void Basic() { const string ExampleSchema = @" schema = { namespace = some.namespace, Person = { { listType = 'listType', build = 'true' }, name = string, age = int, weight = float, } }"; string expected; var assembly = Assembly.GetExecutingAssembly(); var headerStream = assembly.GetManifestResourceStream("Seshat.UnitTests.ExpectedPersonCode.txt"); using (var reader = new StreamReader(headerStream)) { expected = Seshat.CodeGenerator.AutogenWarning + reader.ReadToEnd(); } var schema = Seshat.LuaDefinitions.LuaExecutor.RunScriptExtractSchema(ExampleSchema); CodeNamespace codeNamespace = new CodeNamespace(schema.Namespace); { codeNamespace.Imports.Add(new CodeNamespaceImport("System.Text")); codeNamespace.Imports.Add(new CodeNamespaceImport("System.Collections.Generic")); codeNamespace.Imports.Add(new CodeNamespaceImport("System")); codeNamespace.Imports.Add(new CodeNamespaceImport("System.Linq")); codeNamespace.Imports.Add(new CodeNamespaceImport("Seshat")); foreach (var ns in schema.UsingDeclarations) { codeNamespace.Imports.Add(new CodeNamespaceImport(ns)); } } foreach (var type in schema.Types) { if (!ContextTypeDefinition.ParseBuild(type.Value)) { continue; } codeNamespace.Types.Add(TableCodeGenerator.GenerateTableType(type.Value, schema)); codeNamespace.Types.Add(InstanceCodeGenerator.GenerateInstanceType(type.Value, schema)); } string output = CodeGenerator.BuildCSFileText(codeNamespace); CheckEqual(expected, output); } public void SampleSchema() { // Just to let the code coverage know that we're building the sample schema. var assembly = Assembly.GetExecutingAssembly(); var headerStream = assembly.GetManifestResourceStream("Seshat.UnitTests.SampleSchema.lua"); Seshat.DataDefinitions.SchemaDefinition schema; using (var reader = new StreamReader(headerStream)) { schema = Seshat.LuaDefinitions.LuaExecutor.RunScriptExtractSchema(reader.ReadToEnd()); } CodeNamespace codeNamespace = CodeGenerator.BuildCodeNamespace(schema); CodeGenerator.BuildCSFileText(codeNamespace); } } } }