diff --git a/SQLCC.Core/Interfaces/IDbProvider.cs b/SQLCC.Core/Interfaces/IDbProvider.cs index 463f034..6636940 100644 --- a/SQLCC.Core/Interfaces/IDbProvider.cs +++ b/SQLCC.Core/Interfaces/IDbProvider.cs @@ -3,16 +3,18 @@ namespace SQLCC.Core.Interfaces { - internal interface IDbProvider : IExtension - { - void StartTrace(string traceName); + public interface IDbProvider : IExtension + { + void StartTrace(string traceName); - void StopTrace(string traceName); + void StopTrace(string traceName); - bool IsTraceRunning(string traceName); + string GetLastTraceName(); - List GetTraceCodeSegments(string traceName); + bool IsTraceRunning(string traceName); - List GetAllObjects(); - } + List GetTraceCodeSegments(string traceName); + + List GetAllObjects(); + } } diff --git a/SQLCC.Tests/Properties/AssemblyInfo.cs b/SQLCC.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..89aa53d --- /dev/null +++ b/SQLCC.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SQLCC.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SQLCC.Tests")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("d065a58d-768c-41ea-a665-dfeffded09c7")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SQLCC.Tests/SQLCC.Tests.csproj b/SQLCC.Tests/SQLCC.Tests.csproj new file mode 100644 index 0000000..7f1b6de --- /dev/null +++ b/SQLCC.Tests/SQLCC.Tests.csproj @@ -0,0 +1,99 @@ + + + + Debug + AnyCPU + {80887635-8FAC-40F4-BAC4-058B0958E27F} + Library + Properties + SQLCC.Tests + SQLCC.Tests + v4.5 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 10.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 + + + + ..\packages\NSubstitute.1.6.1.0\lib\NET40\NSubstitute.dll + + + + + + + + + + + + + + + + + + + + + + {8D51B0CA-E25C-430F-A3CD-4A4AFEB433E4} + SQLCC.Core + + + {65d62576-596b-4982-aa92-250df043b1ee} + SQLCC + + + + + + + + + + False + + + False + + + False + + + False + + + + + + + + \ No newline at end of file diff --git a/SQLCC.Tests/TestArgumentProvider.cs b/SQLCC.Tests/TestArgumentProvider.cs new file mode 100644 index 0000000..e954b00 --- /dev/null +++ b/SQLCC.Tests/TestArgumentProvider.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NSubstitute; +using SQLCC.Core.Interfaces; +using SQLCC.Core.Objects; + +namespace SQLCC.Tests +{ + [TestClass] + public class TestArgumentProvider + { + [TestMethod] + public void GetTraceName_GivenEmptyTraceNameArgAndStartCommand_ShouldReturnDateTimetracename() + { + var startTime = DateTime.Now.ToString("yyyyMMddHHmmss"); + + var traceName = ArgumentProvider.GetTraceName(new Dictionary(), "start", null); + + var endTime = DateTime.Now.ToString("yyyyMMddHHmmss"); + + Assert.IsTrue(String.CompareOrdinal(startTime, traceName) <= 0); + Assert.IsTrue(String.CompareOrdinal(endTime, traceName) >= 0); + } + + [TestMethod] + public void GetTraceName_GivenTraceNameArg_ShouldReturnTracename() + { + const string expectedTraceName = "TestTrace1"; + var arguments = new Dictionary { { "app.traceName", expectedTraceName } }; + + var traceName = ArgumentProvider.GetTraceName(arguments, "start", null); + + Assert.AreEqual(expectedTraceName, traceName); + } + + [TestMethod] + public void GetTraceName_GivenEmptyTraceNameArgAndNotStartCommand_WithSQLCCPrefix_ShouldStripPrefixFromLastTraceName() + { + const string lastTraceName = "SQLCC_TestTrace1"; + const string expectedTraceName = "TestTrace1"; + var dbProvider = Substitute.For(); + dbProvider.GetLastTraceName().Returns(lastTraceName); + var arguments = new Dictionary(); + + var traceName = ArgumentProvider.GetTraceName(arguments, "notStart", dbProvider); + + Assert.AreEqual(expectedTraceName, traceName); + } + } + +} diff --git a/SQLCC.Tests/packages.config b/SQLCC.Tests/packages.config new file mode 100644 index 0000000..1d23459 --- /dev/null +++ b/SQLCC.Tests/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/SQLCC.sln b/SQLCC.sln index 9085c80..1cb45c7 100644 --- a/SQLCC.sln +++ b/SQLCC.sln @@ -16,6 +16,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution TraceAndTestImpact.testsettings = TraceAndTestImpact.testsettings EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SQLCC.Tests", "SQLCC.Tests\SQLCC.Tests.csproj", "{80887635-8FAC-40F4-BAC4-058B0958E27F}" +EndProject Global GlobalSection(TestCaseManagementSettings) = postSolution CategoryFile = SQLCC.vsmdi @@ -69,6 +71,16 @@ Global {B07A4B41-E8EB-41CC-98E6-2A8D042EEB5D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {B07A4B41-E8EB-41CC-98E6-2A8D042EEB5D}.Release|Mixed Platforms.Build.0 = Release|Any CPU {B07A4B41-E8EB-41CC-98E6-2A8D042EEB5D}.Release|x86.ActiveCfg = Release|Any CPU + {80887635-8FAC-40F4-BAC4-058B0958E27F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {80887635-8FAC-40F4-BAC4-058B0958E27F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80887635-8FAC-40F4-BAC4-058B0958E27F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {80887635-8FAC-40F4-BAC4-058B0958E27F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {80887635-8FAC-40F4-BAC4-058B0958E27F}.Debug|x86.ActiveCfg = Debug|Any CPU + {80887635-8FAC-40F4-BAC4-058B0958E27F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {80887635-8FAC-40F4-BAC4-058B0958E27F}.Release|Any CPU.Build.0 = Release|Any CPU + {80887635-8FAC-40F4-BAC4-058B0958E27F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {80887635-8FAC-40F4-BAC4-058B0958E27F}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {80887635-8FAC-40F4-BAC4-058B0958E27F}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/SQLCC/ArgumentProvider.cs b/SQLCC/ArgumentProvider.cs new file mode 100644 index 0000000..78d0c55 --- /dev/null +++ b/SQLCC/ArgumentProvider.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using SQLCC.Core.Interfaces; + +static public class ArgumentProvider +{ + public static string GetTraceName(IDictionary arguments, string command, IDbProvider dbProvider) + { + // Get trace name from provided, last trace, or generate one. + string traceName; + arguments.TryGetValue("app.traceName", out traceName); + if (traceName == null && command != "start") + { + traceName = dbProvider.GetLastTraceName().Substring(6); + } + else if (traceName == null && command == "start") + { + traceName = DateTime.Now.ToString("yyyyMMddHHmmss"); + } + return traceName; + } +} \ No newline at end of file diff --git a/SQLCC/Program.cs b/SQLCC/Program.cs index b4c8fcb..d1857d8 100644 --- a/SQLCC/Program.cs +++ b/SQLCC/Program.cs @@ -3,6 +3,7 @@ using System.Configuration; using NDesk.Options; using SQLCC.Core; +using SQLCC.Core.Interfaces; using SQLCC.Core.Helpers; using SQLCC.Core.Objects; using SQLCC.Commands; @@ -21,20 +22,20 @@ static void Main(string[] args) var codeHighlighter = loader.CreateTypeFromAssembly(arguments["hcp.provider"], arguments); var outputProvider = loader.CreateTypeFromAssembly(arguments["out.provider"], arguments); - var command = arguments["app.command"].ToLower().Trim(); + string command; + arguments.TryGetValue("app.command", out command); + if (string.IsNullOrEmpty(command)) + { + Console.Out.WriteLine("Invalid app.command. Valid commands are generate, start, stop and finish.\n" + + "Usage: sqlcc --app.command=[start|stop|generate|finish] [commands]"); + return; + } + command = command.ToLower().Trim(); - // Get trace name from provided, last trace, or generate one. - var traceName = arguments["app.traceName"]; - if (traceName == null && command != "start") - { - traceName = dbProvider.GetLastTraceName(); - } - else if (traceName == null && command == "start") - { - traceName = DateTime.Now.ToString("yyyyMMddHHmmss"); - } - - switch (command) + var traceName = ArgumentProvider.GetTraceName(arguments, command, dbProvider); + Console.Out.WriteLine("Trace name: " + traceName); + + switch (command) { case "generate": var generateCommand = new GenerateOutputCommand(dbProvider, dbCodeFormatter, codeHighlighter, outputProvider, traceName); @@ -60,7 +61,7 @@ static void Main(string[] args) } - public static Dictionary ParseCommandLine(string[] args) + public static Dictionary ParseCommandLine(string[] args) { var arguments = new Dictionary(); diff --git a/SQLCC/SQLCC.csproj b/SQLCC/SQLCC.csproj index 6630615..ddfec5c 100644 --- a/SQLCC/SQLCC.csproj +++ b/SQLCC/SQLCC.csproj @@ -43,6 +43,7 @@ + diff --git a/packages/repositories.config b/packages/repositories.config new file mode 100644 index 0000000..cd7cae6 --- /dev/null +++ b/packages/repositories.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file