From 4310142117b4561913cfd2dd0a099410ca3e7b72 Mon Sep 17 00:00:00 2001 From: mayanje Date: Wed, 10 Oct 2018 16:03:15 +0200 Subject: [PATCH] WI #1150 Finalize Skeleton file Sax Parser implementation. This finalization includes unit tests that validate an Xml Skeleton file against its Schema. --- .../Properties/AssemblyInfo.cs | 20 +++++ .../TemplateCoreTests.cs | 68 +++++++++++++++++ .../TypeCobol.TemplateCore.Test.csproj | 73 +++++++++++++++++++ TypeCobol.TemplateCore.Test/packages.config | 5 ++ .../Model/AttributeNames.cs | 3 + .../Model/AttributedEntity.cs | 12 ++- TypeCobol.TemplateCore/Model/Conditions.cs | 27 ++++++- TypeCobol.TemplateCore/Model/Patterns.cs | 27 ++++++- TypeCobol.TemplateCore/Model/Skeletons.cs | 23 +++++- TypeCobol.TemplateCore/Resource.Designer.cs | 9 +++ TypeCobol.TemplateCore/Resource.resx | 3 + TypeCobol.TemplateCore/SaxParser/SaxParser.cs | 57 +++++++++++++-- .../SaxParser/SkeletonSaxParser.cs | 66 ++++++++++++++--- .../TypeCobol.TemplateCore.csproj | 11 ++- TypeCobol.TemplateCore/Xml/Skeleton.xsd | 17 ++--- TypeCobol.TemplateCore/Xml/skeletons.xml | 8 +- .../TypeCobol.TemplateTranspiler.sln | 13 +++- 17 files changed, 397 insertions(+), 45 deletions(-) create mode 100644 TypeCobol.TemplateCore.Test/Properties/AssemblyInfo.cs create mode 100644 TypeCobol.TemplateCore.Test/TemplateCoreTests.cs create mode 100644 TypeCobol.TemplateCore.Test/TypeCobol.TemplateCore.Test.csproj create mode 100644 TypeCobol.TemplateCore.Test/packages.config diff --git a/TypeCobol.TemplateCore.Test/Properties/AssemblyInfo.cs b/TypeCobol.TemplateCore.Test/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..516eb9b99 --- /dev/null +++ b/TypeCobol.TemplateCore.Test/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("TypeCobol.TemplateCore.Test")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("TypeCobol.TemplateCore.Test")] +[assembly: AssemblyCopyright("Copyright © 2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("e9386ee6-7b3b-4823-beef-1b6521ce5319")] + +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/TypeCobol.TemplateCore.Test/TemplateCoreTests.cs b/TypeCobol.TemplateCore.Test/TemplateCoreTests.cs new file mode 100644 index 000000000..d769c1341 --- /dev/null +++ b/TypeCobol.TemplateCore.Test/TemplateCoreTests.cs @@ -0,0 +1,68 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using TypeCobol.TemplateCore.SaxParser; + +namespace TypeCobol.TemplateCore.Test +{ + [TestClass] + public class TemplateCoreTests + { + /// + /// Test to only validates the XML Skeleton file against the Schema. + /// + [TestMethod] + public void SkeletonFileXmlSchemaValidationTest() + { + string currentDir = System.IO.Directory.GetCurrentDirectory(); + string xmlFile = System.IO.Path.Combine(System.IO.Path.Combine(currentDir, "Xml"), "Skeletons.xml"); + string xsdFile = System.IO.Path.Combine(System.IO.Path.Combine(currentDir, "Xml"), "Skeleton.xsd"); + + SkeletonSaxParser parser = new SkeletonSaxParser(xmlFile, xsdFile); + bool bValidate = parser.Validate(); + Assert.IsTrue(bValidate, bValidate ? "" : parser.ValidationMessage.ToString()); + } + + /// + /// Test to both parse and validate on the fly the XML Skeleton file against the Schema. + /// + [TestMethod] + public void SkeletonFileXmlSaxParsingWithValidationTest() + { + string currentDir = System.IO.Directory.GetCurrentDirectory(); + string xmlFile = System.IO.Path.Combine(System.IO.Path.Combine(currentDir, "Xml"), "Skeletons.xml"); + string xsdFile = System.IO.Path.Combine(System.IO.Path.Combine(currentDir, "Xml"), "Skeleton.xsd"); + + SkeletonSaxParser parser = new SkeletonSaxParser(xmlFile, xsdFile); + try + { + parser.Parse(); + bool bValidate = parser.ValidationErrorCount == 0 && parser.ValidationWarningCount == 0; + Assert.IsTrue(bValidate, bValidate ? "" : parser.ValidationMessage.ToString()); + } + catch(SaxParser.SaxParser.ParsingException e) + { + throw e; + } + } + + /// + /// Test to only parse the XML Skeleton file without validation. + /// + [TestMethod] + public void SkeletonFileXmlSaxParsingWithoutValidationTest() + { + string currentDir = System.IO.Directory.GetCurrentDirectory(); + string xmlFile = System.IO.Path.Combine(System.IO.Path.Combine(currentDir, "Xml"), "Skeletons.xml"); + + SkeletonSaxParser parser = new SkeletonSaxParser(xmlFile); + try + { + parser.Parse(); + } + catch (SaxParser.SaxParser.ParsingException e) + { + throw e; + } + } + } +} diff --git a/TypeCobol.TemplateCore.Test/TypeCobol.TemplateCore.Test.csproj b/TypeCobol.TemplateCore.Test/TypeCobol.TemplateCore.Test.csproj new file mode 100644 index 000000000..74c03c998 --- /dev/null +++ b/TypeCobol.TemplateCore.Test/TypeCobol.TemplateCore.Test.csproj @@ -0,0 +1,73 @@ + + + + + Debug + AnyCPU + {E9386EE6-7B3B-4823-BEEF-1B6521CE5319} + Library + Properties + TypeCobol.TemplateCore.Test + TypeCobol.TemplateCore.Test + v4.6.1 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\TypeCobol.TemplateTranspiler\packages\MSTest.TestFramework.1.2.1\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll + + + ..\TypeCobol.TemplateTranspiler\packages\MSTest.TestFramework.1.2.1\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll + + + + + + + + + + + + + + {fb927d1e-c8d1-48c6-bf13-25942be5041b} + TypeCobol.TemplateCore + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + \ No newline at end of file diff --git a/TypeCobol.TemplateCore.Test/packages.config b/TypeCobol.TemplateCore.Test/packages.config new file mode 100644 index 000000000..090894380 --- /dev/null +++ b/TypeCobol.TemplateCore.Test/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/TypeCobol.TemplateCore/Model/AttributeNames.cs b/TypeCobol.TemplateCore/Model/AttributeNames.cs index 583e81ff1..4c4302af9 100644 --- a/TypeCobol.TemplateCore/Model/AttributeNames.cs +++ b/TypeCobol.TemplateCore/Model/AttributeNames.cs @@ -11,6 +11,9 @@ namespace TypeCobol.TemplateCore.Model /// public static class AttributeNames { + public static string Version = "version"; + public static string Encoding = "encoding"; + public static string Node = "node"; public static string Name = "name"; public static string Var = "var"; diff --git a/TypeCobol.TemplateCore/Model/AttributedEntity.cs b/TypeCobol.TemplateCore/Model/AttributedEntity.cs index 85520f939..aa501a6c9 100644 --- a/TypeCobol.TemplateCore/Model/AttributedEntity.cs +++ b/TypeCobol.TemplateCore/Model/AttributedEntity.cs @@ -9,14 +9,22 @@ namespace TypeCobol.TemplateCore.Model /// /// The base class of an attributed entity: an entity which have attributes /// - public class AttributedEntity : Dictionary + public class AttributedEntity { + /// + /// Attributes + /// + public Dictionary Attributes + { + get; + set; + } /// /// Empty constructor /// public AttributedEntity() { - + Attributes = new Dictionary(); } } } diff --git a/TypeCobol.TemplateCore/Model/Conditions.cs b/TypeCobol.TemplateCore/Model/Conditions.cs index 3a7dabf73..74206b6b2 100644 --- a/TypeCobol.TemplateCore/Model/Conditions.cs +++ b/TypeCobol.TemplateCore/Model/Conditions.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; @@ -36,7 +37,21 @@ public Conditions() set => throw new NotImplementedException(); } - public bool IsReadOnly => throw new NotImplementedException(); + public bool IsReadOnly + { + get + { + return ConditionList.IsReadOnly; + } + } + + public int Count + { + get + { + return ConditionList.Count; + } + } public void Add(Condition item) { @@ -77,5 +92,15 @@ IEnumerator IEnumerable.GetEnumerator() { return ConditionList.GetEnumerator(); } + + public void Clear() + { + ConditionList.Clear(); + } + + public IEnumerator GetEnumerator() + { + return ConditionList.GetEnumerator(); + } } } diff --git a/TypeCobol.TemplateCore/Model/Patterns.cs b/TypeCobol.TemplateCore/Model/Patterns.cs index 1d1585728..255cc09de 100644 --- a/TypeCobol.TemplateCore/Model/Patterns.cs +++ b/TypeCobol.TemplateCore/Model/Patterns.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; @@ -37,7 +38,21 @@ public Patterns() set => throw new NotImplementedException(); } - public bool IsReadOnly => throw new NotImplementedException(); + public bool IsReadOnly + { + get + { + return PatternList.IsReadOnly; + } + } + + public int Count + { + get + { + return PatternList.Count; + } + } public void Add(Pattern item) { @@ -78,5 +93,15 @@ IEnumerator IEnumerable.GetEnumerator() { return PatternList.GetEnumerator(); } + + public void Clear() + { + PatternList.Clear(); + } + + public IEnumerator GetEnumerator() + { + return PatternList.GetEnumerator(); + } } } diff --git a/TypeCobol.TemplateCore/Model/Skeletons.cs b/TypeCobol.TemplateCore/Model/Skeletons.cs index 495bdc478..d52969947 100644 --- a/TypeCobol.TemplateCore/Model/Skeletons.cs +++ b/TypeCobol.TemplateCore/Model/Skeletons.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; @@ -14,7 +15,7 @@ public class Skeletons : AttributedEntity, IList /// /// The List of all single skeletons. /// - public List SkeletonList + public IList SkeletonList { get; private set; @@ -71,11 +72,29 @@ IEnumerator IEnumerable.GetEnumerator() return SkeletonList.GetEnumerator(); } + public void Clear() + { + SkeletonList.Clear(); + } + + public IEnumerator GetEnumerator() + { + return SkeletonList.GetEnumerator(); + } + public bool IsReadOnly { get { - return false; + return SkeletonList.IsReadOnly; + } + } + + public int Count + { + get + { + return SkeletonList.Count; } } diff --git a/TypeCobol.TemplateCore/Resource.Designer.cs b/TypeCobol.TemplateCore/Resource.Designer.cs index b8379d502..d03ccd8d8 100644 --- a/TypeCobol.TemplateCore/Resource.Designer.cs +++ b/TypeCobol.TemplateCore/Resource.Designer.cs @@ -87,6 +87,15 @@ internal class Resource { } } + /// + /// Looks up a localized string similar to Xml parsing error, missing version and encoding.. + /// + internal static string ParserErrorMissingVersionEncoding { + get { + return ResourceManager.GetString("ParserErrorMissingVersionEncoding", resourceCulture); + } + } + /// /// Looks up a localized string similar to Warning: {0}. /// diff --git a/TypeCobol.TemplateCore/Resource.resx b/TypeCobol.TemplateCore/Resource.resx index 7f3df0fee..d73c4fc70 100644 --- a/TypeCobol.TemplateCore/Resource.resx +++ b/TypeCobol.TemplateCore/Resource.resx @@ -126,6 +126,9 @@ Sax parser error, expecting token : '{0}' + + Xml parsing error, missing version and encoding. + Warning: {0} diff --git a/TypeCobol.TemplateCore/SaxParser/SaxParser.cs b/TypeCobol.TemplateCore/SaxParser/SaxParser.cs index 90e9360a4..a76bc22e5 100644 --- a/TypeCobol.TemplateCore/SaxParser/SaxParser.cs +++ b/TypeCobol.TemplateCore/SaxParser/SaxParser.cs @@ -44,11 +44,15 @@ public SaxParser(String xmlFile) public SaxParser(String xmlFile, String schema) { XmlFile = xmlFile; - XmlReaderSettings testSettings = new XmlReaderSettings(); - testSettings.Schemas.Add(null, schema); - testSettings.ValidationType = ValidationType.Schema; + XmlReaderSettings settings = new XmlReaderSettings(); + settings.Schemas.Add(null, schema); + settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; + settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; + settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; + settings.ValidationType = ValidationType.Schema; + settings.ValidationEventHandler += XMLValidationEventHandler; - Scanner = new SaxScanner(XmlReader.Create(xmlFile, testSettings)); + Scanner = new SaxScanner(XmlReader.Create(xmlFile, settings)); } @@ -137,7 +141,19 @@ public SaxScanner Scanner } /// - /// Test That the gien Xml Node's type and name matches the current Lookahead + /// Test That the given Xml Node's type matches the current Lookahead + /// + /// Xml Node's type + /// Return true if the lookahead matches, false otherwise. + protected bool TestLookahead(XmlNodeType type) + { + if (Lookahead == null) + return false; + return Lookahead.Value.type == type; + } + + /// + /// Test That the given Xml Node's type and name matches the current Lookahead /// /// Xml Node's type /// Xml Node's name @@ -160,7 +176,32 @@ protected void NextToken() /// /// The parsing function /// - protected abstract void Parse(); + public abstract void Parse(); + + /// + /// Validate the XML file by Scanning the entire document. + /// + /// Return true if validation is ok, false otherwise + /// If the Validation was not ok, the Properties ValidationWarningCount and ValidationErrorCount will give the count of warning and errors. + public abstract bool Validate(); + + /// + /// The Count of Schema Validation warnings + /// + public int ValidationWarningCount + { + get; + private set; + } + + /// + /// The Count of Schema Validation errors + /// + public int ValidationErrorCount + { + get; + private set; + } /// /// Validation Error Event Handler @@ -176,19 +217,21 @@ protected virtual void XMLValidationEventHandler(object sender, ValidationEventA var xml_e = e.Exception; String msg = String.Format(Resource.WarningMsg, e.Message, xml_e.LineNumber); ValidationMessage.AppendLine(msg); + ValidationWarningCount++; } else if (e.Severity == XmlSeverityType.Error) { var xml_e = e.Exception; String msg = String.Format(Resource.ErrorMsg, e.Message, xml_e.LineNumber); ValidationMessage.AppendLine(msg); + ValidationErrorCount++; } } /// /// Validation Message. /// - protected StringBuilder ValidationMessage + public StringBuilder ValidationMessage { get; set; diff --git a/TypeCobol.TemplateCore/SaxParser/SkeletonSaxParser.cs b/TypeCobol.TemplateCore/SaxParser/SkeletonSaxParser.cs index 8ae110214..ccc7ccaf3 100644 --- a/TypeCobol.TemplateCore/SaxParser/SkeletonSaxParser.cs +++ b/TypeCobol.TemplateCore/SaxParser/SkeletonSaxParser.cs @@ -19,7 +19,8 @@ namespace TypeCobol.TemplateCore.SaxParser /// ; /// skeleton(name, var) ::= SKELETON_TAG conditions patterns END_SKELETON_TAG /// ; - /// conditions ::= CONDITIONS_TAG condition_list END_CONDITIONS_TAG + /// conditions ::= /*empty*/ + /// | CONDITIONS_TAG condition_list END_CONDITIONS_TAG /// ; /// condition_list ::= condition(node, name, level, type, sender, receiver,unsafe,function,definitions,variables,typecobol,visibility,copyname,Usage,isPointerIncrementation,receiverUsage) /// | condition_list condition(node, name, level, type, sender, receiver,unsafe,function,definitions,variables,typecobol,visibility,copyname,Usage,isPointerIncrementation,receiverUsage) @@ -53,6 +54,15 @@ public Skeletons Skeletons get; private set; } + /// + /// Xml version + /// + public string Version { get; private set; } + /// + /// Xml encoding + /// + public string Encoding { get; private set; } + /// /// Constructor /// @@ -61,7 +71,6 @@ public SkeletonSaxParser(String skeletonFile) : base(skeletonFile) { //Get the First Token. Lookahead = Scanner.NextToken; - Parse(); } /// @@ -71,7 +80,8 @@ public SkeletonSaxParser(String skeletonFile) : base(skeletonFile) /// The Skeleton Schema file public SkeletonSaxParser(String skeletonFile, String skeletonSchemaFile) : base(skeletonFile, skeletonSchemaFile) { - + //Get the First Token. + Lookahead = Scanner.NextToken; } /// @@ -88,22 +98,53 @@ private static void CopyTokenAttributes(SaxToken? token, AttributedEntity entity Model.Attribute attr = new Model.Attribute(); attr.Name = e.Key; attr.Value = e.Value; - entity[e.Key] = attr; + entity.Attributes[e.Key] = attr; } } } + /// + /// Validate the Skeleton File by reading all tokens. + /// + public override bool Validate() + { + while (this.Scanner.NextToken != null) + ; + return ValidationWarningCount == 0 && ValidationErrorCount == 0; + } /// /// Parse Skeleton the file according to the grammar. /// - protected override void Parse() + public override void Parse() { + //Get the First Token. + //Lookahead = Scanner.NextToken; //Version if (Lookahead == null) return; + ParseVersion(); ParseSkeletons(); } + /// + /// Match the Version and the Encoding + /// + protected void ParseVersion() + { + if (Lookahead.Value.type == XmlNodeType.XmlDeclaration) + { + if (Lookahead.Value.attributes.ContainsKey(AttributeNames.Version)) + Version = Lookahead.Value.attributes[AttributeNames.Version]; + if (Lookahead.Value.attributes.ContainsKey(AttributeNames.Encoding)) + Encoding = Lookahead.Value.attributes[AttributeNames.Encoding]; + NextToken(); + } + else + { + throw new ParsingException(Resource.ParserErrorMissingVersionEncoding); + } + } + /// /// Parse a Skeletons tag /// @@ -114,7 +155,6 @@ protected void ParseSkeletons() CopyTokenAttributes(token, Skeletons); while (TestLookahead(XmlNodeType.Element, TagNames.Skeleton)) { //Parse each single Skeleton - token = Match(XmlNodeType.Element, TagNames.Skeleton); Skeleton skeleton = ParseSkeleton(); //Add it to the model Skeletons.Add(skeleton); @@ -132,7 +172,7 @@ protected Skeleton ParseSkeleton() Skeleton skeleton = new Skeleton(); CopyTokenAttributes(token, skeleton); //Parse Conditions - if(TestLookahead(XmlNodeType.Element, TagNames.Condition)) + if(TestLookahead(XmlNodeType.Element, TagNames.Conditions)) { skeleton.Conditions = ParseConditions(); } @@ -172,7 +212,7 @@ protected Condition ParseCondition() SaxToken? token = Match(XmlNodeType.Element, TagNames.Condition); Condition condition = new Condition(); CopyTokenAttributes(token, condition); - OptionalMatch(XmlNodeType.Element, TagNames.Condition); + OptionalMatch(XmlNodeType.EndElement, TagNames.Condition); return condition; } @@ -190,7 +230,7 @@ protected Patterns ParsePatterns() Pattern pattern = ParsePattern(); patterns.Add(pattern); } - token = Match(XmlNodeType.EndElement, TagNames.Conditions); + token = Match(XmlNodeType.EndElement, TagNames.Patterns); return patterns; } @@ -202,9 +242,13 @@ protected Pattern ParsePattern() { SaxToken? token = Match(XmlNodeType.Element, TagNames.Pattern); Pattern pattern = new Pattern(); - pattern.Code = token.Value.text; + if (TestLookahead(XmlNodeType.Text)) + { + SaxToken? textToken = Match(XmlNodeType.Text); + pattern.Code = textToken.Value.value; + } CopyTokenAttributes(token, pattern); - OptionalMatch(XmlNodeType.Element, TagNames.Pattern); + OptionalMatch(XmlNodeType.EndElement, TagNames.Pattern); return pattern; } } diff --git a/TypeCobol.TemplateCore/TypeCobol.TemplateCore.csproj b/TypeCobol.TemplateCore/TypeCobol.TemplateCore.csproj index b060da637..7db9d935c 100644 --- a/TypeCobol.TemplateCore/TypeCobol.TemplateCore.csproj +++ b/TypeCobol.TemplateCore/TypeCobol.TemplateCore.csproj @@ -70,8 +70,17 @@ Resource.Designer.cs + - + + Designer + PreserveNewest + + + + + PreserveNewest + @@ -27,13 +22,13 @@ - + - + - + @@ -63,7 +58,7 @@ - + diff --git a/TypeCobol.TemplateCore/Xml/skeletons.xml b/TypeCobol.TemplateCore/Xml/skeletons.xml index ddaedca43..dcac537c5 100644 --- a/TypeCobol.TemplateCore/Xml/skeletons.xml +++ b/TypeCobol.TemplateCore/Xml/skeletons.xml @@ -1,4 +1,4 @@ - + @@ -441,9 +441,6 @@ - - - @{ var clause = ""; if (%imports.HasPublicProcedures) { @@ -455,9 +452,6 @@ - - - @{ var clause = ""; if (%imports.HasPublicProcedures) { diff --git a/TypeCobol.TemplateTranspiler/TypeCobol.TemplateTranspiler.sln b/TypeCobol.TemplateTranspiler/TypeCobol.TemplateTranspiler.sln index 323a9785c..e8805a475 100644 --- a/TypeCobol.TemplateTranspiler/TypeCobol.TemplateTranspiler.sln +++ b/TypeCobol.TemplateTranspiler/TypeCobol.TemplateTranspiler.sln @@ -1,12 +1,14 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25123.0 +# Visual Studio 15 +VisualStudioVersion = 15.0.27703.2035 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TypeCobol.TemplateTranspiler", "TypeCobol.TemplateTranspiler.csproj", "{AB8D29E1-9511-44C2-B5E3-28965323E87B}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TypeCobol.TemplateCore", "..\TypeCobol.TemplateCore\TypeCobol.TemplateCore.csproj", "{FB927D1E-C8D1-48C6-BF13-25942BE5041B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TypeCobol.TemplateCore.Test", "..\TypeCobol.TemplateCore.Test\TypeCobol.TemplateCore.Test.csproj", "{E9386EE6-7B3B-4823-BEEF-1B6521CE5319}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,8 +23,15 @@ Global {FB927D1E-C8D1-48C6-BF13-25942BE5041B}.Debug|Any CPU.Build.0 = Debug|Any CPU {FB927D1E-C8D1-48C6-BF13-25942BE5041B}.Release|Any CPU.ActiveCfg = Release|Any CPU {FB927D1E-C8D1-48C6-BF13-25942BE5041B}.Release|Any CPU.Build.0 = Release|Any CPU + {E9386EE6-7B3B-4823-BEEF-1B6521CE5319}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E9386EE6-7B3B-4823-BEEF-1B6521CE5319}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9386EE6-7B3B-4823-BEEF-1B6521CE5319}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E9386EE6-7B3B-4823-BEEF-1B6521CE5319}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D95470EF-9364-4E06-8A08-812238002D61} + EndGlobalSection EndGlobal