Esempio n. 1
0
        public void TestDistillToWholeWords()
        {
            var testResult =
                NfString.DistillToWholeWords(
                    "FilmMaster-AccountDetail-ClientDetails-LocationDetails-TimeMasters-IsGolfVoucher");

            Assert.IsNotNull(testResult);

            Assert.AreEqual("Film Master Account Detail Client Details Location Time Masters Is Golf Voucher", string.Join(" ", testResult));

            testResult =
                NfString.DistillToWholeWords("Id");

            Assert.IsNotNull(testResult);
            Assert.IsTrue(testResult.Length == 1);
            Assert.AreEqual("Id", testResult[0]);

            testResult = NfString.DistillToWholeWords("RTDC IR Questions");
            Assert.IsNotNull(testResult);
            Assert.AreEqual("RtdcIrQuestions", string.Join("", testResult));

            testResult = NfString.DistillToWholeWords("The-VariousThings\\which,AllowYou ToRead=this");
            Assert.IsNotNull(testResult);
            Assert.AreEqual(9, testResult.Length);
            Assert.AreEqual("TheVariousThingsWhichAllowYouToReadThis", string.Join("", testResult));
        }
Esempio n. 2
0
        public void TestCalcLuhnCheckDigit()
        {
            var testResult = NfString.CalcLuhnCheckDigit("455673758689985");

            Assert.AreEqual(5, testResult);
            testResult = NfString.CalcLuhnCheckDigit("453211001754030");
            Assert.AreEqual(9, testResult);
            testResult = NfString.CalcLuhnCheckDigit("471604448140316");
            Assert.AreEqual(5, testResult);
            testResult = NfString.CalcLuhnCheckDigit("554210251648257");
            Assert.AreEqual(5, testResult);
            testResult = NfString.CalcLuhnCheckDigit("537886423943754");
            Assert.AreEqual(6, testResult);
            testResult = NfString.CalcLuhnCheckDigit("511329925461278");
            Assert.AreEqual(2, testResult);
            testResult = NfString.CalcLuhnCheckDigit("37322049976972");
            Assert.AreEqual(0, testResult);
            testResult = NfString.CalcLuhnCheckDigit("34561114407525");
            Assert.AreEqual(4, testResult);
            testResult = NfString.CalcLuhnCheckDigit("34831152135173");
            Assert.AreEqual(6, testResult);
            testResult = NfString.CalcLuhnCheckDigit("601198900163944");
            Assert.AreEqual(0, testResult);
            testResult = NfString.CalcLuhnCheckDigit("3653092434341");
            Assert.AreEqual(5, testResult);
        }
Esempio n. 3
0
        public void TestSafeDotNetTypeName()
        {
            var testResult = NfString.SafeDotNetTypeName("dbo.123ProcName");

            Assert.IsNotNull(testResult);
            Assert.AreEqual("dbo.123ProcName", testResult);
            Console.WriteLine(testResult);

            testResult = NfString.SafeDotNetTypeName(null);
            Assert.IsNotNull(testResult);

            var testInput = string.Empty;

            testResult = NfString.SafeDotNetTypeName(testInput);
            Assert.IsNotNull(testResult);
            Assert.IsFalse(string.IsNullOrWhiteSpace(testResult));
            Console.WriteLine(testResult);

            testInput  = "     ";
            testResult = NfString.SafeDotNetTypeName(testInput);
            Assert.IsNotNull(testResult);
            Assert.IsFalse(string.IsNullOrWhiteSpace(testResult));
            Console.WriteLine(testResult);

            testResult = NfString.SafeDotNetTypeName("dbo.DELETED_LookupDetails");
            Console.WriteLine(testResult);
            Assert.AreEqual("dbo.DELETED_LookupDetails", testResult);

            testResult = NfString.SafeDotNetTypeName("© The End");

            Console.WriteLine(testResult);
        }
Esempio n. 4
0
        /// <summary>
        /// Returns a node definition with just the type name's header.
        /// This is specific to graph-viz (ver. 2.38+)
        /// </summary>
        /// <param name="typeFullName"></param>
        /// <param name="enumValues">Optional values to be listed as line items with no type specifiers nor .gv port ids.</param>
        /// <returns></returns>
        public static string EmptyGraphVizClassNode(string typeFullName, string[] enumValues)
        {
            var className = NfReflect.GetTypeNameWithoutNamespace(typeFullName);
            var ns        = NfReflect.GetNamespaceWithoutTypeName(typeFullName);
            var fullName  = string.Format("{0}{1}", string.IsNullOrWhiteSpace(ns) ? string.Empty : ns + ".", className);
            var graphViz  = new StringBuilder();

            graphViz.Append(NfString.SafeDotNetIdentifier(fullName));
            graphViz.AppendLine(" [shape=Mrecord, label=<<table bgcolor=\"white\" border=\"0\" >");
            graphViz.AppendLine("<th>");
            graphViz.AppendLine("<td bgcolor=\"grey\" align=\"center\">");
            graphViz.Append("<font color=\"white\">");
            graphViz.AppendFormat("{0} :: {1}", className, string.IsNullOrWhiteSpace(ns) ? "global" : ns);
            graphViz.AppendLine("</font></td></th>");
            if (enumValues != null && enumValues.Length > 0)
            {
                foreach (var enumVal in enumValues)
                {
                    graphViz.Append("<tr><td><font color=\"blue\">");
                    graphViz.Append(enumVal);
                    graphViz.AppendLine("</font></td></tr>");
                }
            }
            else
            {
                graphViz.AppendLine("<tr><td></td></tr>");
                graphViz.AppendLine("<tr><td></td></tr>");
            }
            graphViz.AppendLine("</table>> ];");

            return(graphViz.ToString());
        }
Esempio n. 5
0
        /// <summary>
        /// Returns edge definitions specific to graph-viz (ver. 2.38+)
        /// see [http://www.graphviz.org/]
        /// </summary>
        /// <returns></returns>
        public static string ToGraphVizEdge(this CgType cgType)
        {
            var graphViz = new StringBuilder();
            var myName   = NfString.SafeDotNetIdentifier(cgType.FullName);
            var edges    = new List <string>();

            foreach (
                var property in
                cgType.Properties.Where(
                    x => !Etc.ValueTypesList.Contains(NfReflect.GetLastTypeNameFromArrayAndGeneric(x.TypeName, "<")))
                )
            {
                var toName =
                    NfString.SafeDotNetIdentifier(NfReflect.GetLastTypeNameFromArrayAndGeneric(property.TypeName, "<"));
                var edg = new StringBuilder();
                edg.AppendFormat("{0} -> {1}", myName, toName);
                edg.Append(property.IsEnumerableType ? " [arrowhead=odiamond]" : " [arrowhead=vee]");
                edg.Append(";");
                if (!edges.Contains(edg.ToString()))
                {
                    edges.Add(edg.ToString());
                }
            }
            foreach (var edge in edges)
            {
                graphViz.AppendLine(edge);
            }
            return(graphViz.ToString());
        }
Esempio n. 6
0
        /// <summary>
        /// Prints the address-line-1 as it would appear as post marked.
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            var data = GetData();

            return(NfString.DistillSpaces(string.Join(" ", data.ThoroughfareNumber, data.ThoroughfareDirectional, data.ThoroughfareName,
                                                      data.ThoroughfareType).Trim()));
        }
Esempio n. 7
0
        public void TestToCamelCase()
        {
            const string TEST_INPUT = "UserName";
            var          testOutput = NfString.ToCamelCase(TEST_INPUT, true);

            Assert.AreEqual("userName", testOutput);

            testOutput = NfString.ToCamelCase("__" + TEST_INPUT, true);
            Assert.AreEqual("__userName", testOutput);

            testOutput = NfString.ToCamelCase("__" + TEST_INPUT.ToUpper(), true);
            Assert.AreEqual("__username", testOutput);

            testOutput = NfString.ToCamelCase("ID", true);
            Assert.AreNotEqual("iD", testOutput);
            Assert.AreEqual("id", testOutput);

            testOutput = NfString.ToCamelCase("498375938720", true);
            Assert.AreEqual("498375938720", testOutput);

            testOutput = NfString.ToCamelCase("__userNAME_ID", true);
            Assert.AreEqual("__userName_Id", testOutput);

            testOutput = NfString.ToCamelCase("The-VariousThings\\which,AllowYou ToRead=this");
            Assert.AreEqual("theVariousThingsWhichAllowYouToReadThis", testOutput);

            testOutput = NfString.ToCamelCase("Server Purpose(s); Installed Component(s)");
            Assert.AreEqual("serverPurposeSInstalledComponentS", testOutput);
        }
Esempio n. 8
0
        public void TestToWordWrap()
        {
            var sometext = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi hendrerit leo id justo interdum, eu luctus urna tincidunt. Integer eu ex libero. Curabitur quis est volutpat, suscipit massa iaculis, posuere nisl. Vivamus mollis erat sed sem vulputate auctor. Fusce id dictum leo. Donec sed lectus scelerisque turpis sollicitudin vehicula quis non nisi. Sed et imperdiet ex, sed facilisis quam. Morbi scelerisque neque eget massa tincidunt, at finibus mauris gravida. Suspendisse nec luctus justo. Ut porta pretium mi, ac tristique ligula tempor id. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras at velit ac mi congue posuere. Etiam rutrum risus lacus, id luctus diam pretium vulputate. Ut sed neque tortor. Ut tempor augue sem.";
            //var testResult = Etc.ToWordWrap(sometext);
            var expected = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi hendrerit leo id 
justo interdum, eu luctus urna tincidunt. Integer eu ex libero. Curabitur quis 
est volutpat, suscipit massa iaculis, posuere nisl. Vivamus mollis erat sed sem 
vulputate auctor. Fusce id dictum leo. Donec sed lectus scelerisque turpis sollicitudin 
vehicula quis non nisi. Sed et imperdiet ex, sed facilisis quam. Morbi scelerisque 
neque eget massa tincidunt, at finibus mauris gravida. Suspendisse nec luctus justo. 
Ut porta pretium mi, ac tristique ligula tempor id. Cum sociis natoque penatibus 
et magnis dis parturient montes, nascetur ridiculus mus. Cras at velit ac mi congue 
posuere. Etiam rutrum risus lacus, id luctus diam pretium vulputate. Ut sed neque 
tortor. Ut tempor augue sem.".Replace("\n", "\r\n");

            //Assert.AreEqual(expected, testResult);

            sometext = @"Thomas and wife v. Winchester3
Court of Appeals of New York 4
Decided July 1852 5
6 NY 397
RUGGLES, Ch. J.6 delivered the opinion of the court.
This is an action brought to recover damages from the defendant for negligently7 putting up, labeling and selling as and for the extract of dandelion, which is a simple and harmless medicine, a jar of the extract of belladonna8, which is a deadly poison; by means of which the plaintiff Mary Ann Thomas, to whom, being sick, a dose of dandelion was prescribed by a physician, and a portion of the contents of the jar, was administered as and for the extract of dandelion, was greatly injured.";
            var testResult = NfString.ToWordWrap(sometext);

            Console.Write(testResult);
        }
Esempio n. 9
0
        public void TestDistillCrLf()
        {
            var testInput  = @"    He has refused his Assent to Laws, the most wholesome and necessary for the public good.
    He has forbidden his Governors to pass Laws of immediate and pressing importance, ";
            var testResult = NfString.DistillCrLf(testInput);

            Console.WriteLine(testResult);
        }
Esempio n. 10
0
        public void TestTransformCamelCaseToSeparator()
        {
            const string TEST_INPUT = "UserName";
            var          testOutput = NfString.TransformCaseToSeparator(TEST_INPUT, '_');

            Assert.AreEqual("User_Name", testOutput);

            testOutput = NfString.TransformCaseToSeparator("user_Name", '_');
            Assert.AreEqual("user_Name", testOutput);
        }
Esempio n. 11
0
        /// <summary>
        /// Moves the given code-gen source code definition to another file
        /// </summary>
        /// <returns>The full paths to the created source code files </returns>
        public static string[] MoveType(CgType cgType, string outputDirectory = null, CgClassModifier typeModifier = CgClassModifier.AsIs)
        {
            if (cgType == null)
            {
                return(new string[0]);
            }

            outputDirectory = outputDirectory ?? NfSettings.AppData;

            //TODO - this is inconsistent where enclosure is one but src files are many
            var srcCodeFile = cgType.GetMySrcCodeFiles()?.FirstOrDefault() ??
                              Path.Combine(NfSettings.AppData, cgType.Name + Settings.LangStyle.FileExtension);

            var fileName      = cgType.Name;
            var fileExtension = Path.GetExtension(srcCodeFile);
            var outFilePath   = Path.Combine(outputDirectory, fileName + fileExtension);

            //don't overwrite whatever is already there
            if (File.Exists(outFilePath))
            {
                outFilePath = Path.Combine(outputDirectory, fileName + NfString.GetNfRandomName() + fileExtension);
            }

            var newlines = new List <string>();
            var hasNs    = !string.IsNullOrWhiteSpace(cgType.Namespace);

            if (hasNs)
            {
                newlines.AddRange(Settings.LangStyle.ToNamespaceDecl(cgType).ConvertToLf().Split('\n'));
            }

            if (File.Exists(srcCodeFile))
            {
                var start    = cgType.GetMyStartEnclosure().Item1;
                var end      = cgType.GetMyEndEnclosure().Item1;
                var srcLines = File.ReadAllLines(srcCodeFile);
                newlines.AddRange(srcLines.Skip(start - 1).Take(end + 1 - start));
            }
            else
            {
                var genLines = typeModifier == CgClassModifier.AsInterface
                    ? Settings.LangStyle.ToInterface(cgType)
                    : Settings.LangStyle.ToClass(cgType, CgAccessModifier.Public, typeModifier);
                newlines.AddRange(genLines.ConvertToLf().Split('\n'));
            }
            if (hasNs)
            {
                newlines.Add(Settings.LangStyle.GetEnclosureCloseToken(null));
            }

            //write the type def to file
            File.WriteAllLines(outFilePath, newlines, Encoding.UTF8);

            return(new[] { outFilePath });
        }
Esempio n. 12
0
        public void TestBinaryMergeString()
        {
            var firstString  = " a typical string ";
            var secondString = "--+|---------------";

            var testResult = NfString.BinaryMergeString(firstString, secondString);

            Assert.IsNotNull(testResult);

            Console.WriteLine(testResult);
        }
Esempio n. 13
0
        public void TestMergeString()
        {
            var testPrimaryInput   = "   <~~~Some~Name";
            var testSecondaryInput = "                   ";

            var testResult = NfString.MergeString(testPrimaryInput, testSecondaryInput);

            Assert.IsNotNull(testResult);

            Console.WriteLine(testResult);
        }
Esempio n. 14
0
        public void TestPrintInCenter()
        {
            var textInput  = "Judea";
            var printBlock = 26;

            var testResult = NfString.PrintInCenter(textInput, printBlock);

            Assert.IsNotNull(testResult);

            Console.WriteLine(string.Format("|{0}|", testResult));
        }
Esempio n. 15
0
        public void TestDistillTabs()
        {
            var testInput =
                new string(new[]
            {
                (char)0x09, (char)0x09, 'a', (char)0x20, 'b', 'c', 'd', (char)0x09, (char)0x09, (char)0x09,
                (char)0x09, 'e', 'f', (char)0x20
            });

            var testResult = NfString.DistillTabs(testInput);

            Assert.AreEqual(" a bcd ef ", testResult);
        }
Esempio n. 16
0
        public void TestDistillSpaces()
        {
            var testResult = NfString.DistillSpaces("              here             is          to many           spaces");

            Assert.IsNotNull(testResult);
            Assert.AreEqual(" here is to many spaces", testResult);

            testResult =
                NfString.DistillSpaces(
                    "            December 31,      2016    2015   (in millions)Net operating losses         ");
            Assert.IsNotNull(testResult);
            Assert.AreEqual(" December 31, 2016 2015 (in millions)Net operating losses ", testResult);
            Console.WriteLine(testResult);
        }
Esempio n. 17
0
        public void TestToPascelCase()
        {
            var testResult = NfString.ToPascalCase("dbo.DELETED_LookupDetails");

            Assert.IsNotNull(testResult);
            Console.WriteLine(testResult);
            Assert.AreEqual("DboDeletedLookupDetails", testResult);

            testResult = NfString.ToPascalCase("dbo.DELETED_LookupDetails", true);
            Assert.IsNotNull(testResult);
            Console.WriteLine(testResult);
            Assert.AreEqual("Dbo.Deleted_LookupDetails", testResult);

            testResult = NfString.ToPascalCase("Test.dbo.SET_OP_lli", true);
            Assert.AreEqual("Test.dbo.Set_Op_lli", testResult);
        }
Esempio n. 18
0
        public void TestLevenshteinDistance()
        {
            var testResult = NfString.LevenshteinDistance("kitten", "sitting");

            Assert.AreEqual(3D, testResult);
            testResult = NfString.LevenshteinDistance("Saturday", "Sunday");
            Assert.AreEqual(3D, testResult);
            testResult = NfString.LevenshteinDistance("Brian", "Brain");
            Assert.AreEqual(2D, testResult);

            Console.WriteLine(NfString.LevenshteinDistance("kitty", "kitten"));
            Console.WriteLine(NfString.LevenshteinDistance("kitty", "kite"));

            //testResult = Etc.LevenshteinDistance("sword", "swath", true);
            //Console.WriteLine(testResult);
        }
Esempio n. 19
0
        public void TestJaroWinklerDistance()
        {
            var testResult = NfString.JaroWinklerDistance("test", "test");

            Assert.AreEqual(1D, System.Math.Round(testResult));

            testResult = NfString.JaroWinklerDistance("kitty", "kitten");
            Assert.IsTrue(testResult - 0.893 < 0.001);

            testResult = NfString.JaroWinklerDistance("kitty", "kite");
            Assert.IsTrue(testResult - 0.848 < 0.001);
            Console.WriteLine(testResult);

            testResult = NfString.JaroWinklerDistance(null, null);
            Assert.AreEqual(1.0, testResult);
        }
Esempio n. 20
0
        public void TestShortestDistance()
        {
            var testIn      = "kitty";
            var testCompare = new[] { "kitten", "cat", "kite", "can", "kool" };

            var testResult = NfString.ShortestDistance(testIn, testCompare);

            Assert.IsNotNull(testResult);
            Assert.AreEqual(2, testResult.Length);
            Assert.IsTrue(testResult.Contains("kitten"));
            Assert.IsTrue(testResult.Contains("kite"));

            testIn      = "LeRoy";
            testCompare = new[] { "Lee", "Roy", "L.R." };
            testResult  = NfString.ShortestDistance(testIn, testCompare);
            Assert.IsNotNull(testResult);
            Assert.AreEqual(1, testResult.Length);
            Assert.AreEqual("Roy", testResult[0]);
        }
Esempio n. 21
0
        public void TestCapitalizeFirstLetterOfWholeWords()
        {
            const string typicalTypeName = "noFuture.util.etc";
            var          testResult      = NfString.CapWords(typicalTypeName, '.');

            Assert.AreEqual("NoFuture.Util.Etc", testResult);

            const string allCaps = "KEYCODE";

            testResult = NfString.CapWords(allCaps, '.');
            Assert.AreEqual("Keycode", testResult);

            const string capsLockOn = "nOFUTURE.uTIL.eTC";

            testResult = NfString.CapWords(capsLockOn, '.');
            Assert.AreEqual("Nofuture.Util.Etc", testResult);

            testResult = NfString.CapWords("WINSTON SALEM".ToLower(), ' ');
            Console.WriteLine(testResult);
        }
Esempio n. 22
0
        public void TestEscapeString()
        {
            const string DEC_EXPECT = "&#73;&#32;&#97;&#109;&#32;&#100;&#101;&#99;&#105;&#109;&#97;&#108;";
            var          dec        = NfString.EscapeString("I am decimal", EscapeStringType.DECIMAL);

            const string UNI_EXPECT = @"\u00C0\u00C8\u00CC\u00D2\u00D9\u00E0\u00E8\u00EC\u00F2\u00F9\u00C1\u00C9\u00CD\u00D3\u00DA\u00DD\u00E1\u00E9\u00ED\u00F3\u00FA\u00FD\u00C2\u00CA\u00CE\u00D4\u00DB\u00E2\u00EA\u00EE\u00F4\u00FB\u00C3\u00D1\u00D5\u00E3\u00F1\u00F5\u00C4\u00CB\u00CF\u00D6\u00DC\u00E4\u00EB\u00EF\u00F6\u00FC\u00E7\u00C7\u00DF\u00D8\u00F8\u00C5\u00E5\u00C6\u00E6\u00DE\u00FE\u00D0\u00F0\u0152\u0153\u0178\u00FF\u0160\u0161";
            var          uni        = NfString.EscapeString("ÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöüçÇßØøÅåÆæÞþÐðŒœŸÿŠš", EscapeStringType.UNICODE);

            const string REGEX_EXPECT = @"\x5b\x72\x65\x67\x65\x78\x5d";
            var          regex        = NfString.EscapeString("[regex]", EscapeStringType.REGEX);

            const string HTML_EXPECT = "&nbsp;&pound;&iexcl;&yen;&sect;";
            var          html        = NfString.EscapeString(" £¡¥§", EscapeStringType.HTML);

            const string URI_EXPECT = "F%40r0ut%7eDu%2cde%3d";
            var          uri        = NfString.EscapeString("F@r0ut~Du,de=", EscapeStringType.URI);

            Assert.AreEqual(DEC_EXPECT, dec);
            Assert.AreEqual(UNI_EXPECT, uni);
            Assert.AreEqual(REGEX_EXPECT, regex);
            Assert.AreEqual(HTML_EXPECT, html);
            Assert.AreEqual(URI_EXPECT, uri);
        }
Esempio n. 23
0
        public void TestSafeDotNetIdentifier()
        {
            var testResult = NfString.SafeDotNetIdentifier("Personal Ph #", true);

            Assert.IsNotNull(testResult);
            Console.WriteLine(testResult);
            Assert.AreEqual("Personal_u0020Ph_u0020_u0023", testResult);

            testResult = NfString.SafeDotNetIdentifier("Personal Ph #");
            Assert.IsNotNull(testResult);
            Console.WriteLine(testResult);
            Assert.AreEqual("PersonalPh", testResult);

            testResult = NfString.SafeDotNetIdentifier("global::Some_Aspx_Page_With_No_Namespace");
            Console.WriteLine(testResult);

            Assert.AreEqual("globalSome_Aspx_Page_With_No_Namespace", testResult);

            testResult =
                NfString.SafeDotNetIdentifier(
                    "<p><font style='font-size:11px;font-family:calibri;text-align:left'>", true);
            Console.WriteLine(testResult);

            Assert.IsTrue(testResult.StartsWith(NfString.DefaultNamePrefix + "_u003cp_u003e_u003cfont_u0020style"));

            testResult =
                NfString.SafeDotNetIdentifier("© The End ©", false);
            Console.WriteLine(testResult);

            Assert.AreEqual("_u0000TheEnd", testResult);

            testResult =
                NfString.SafeDotNetIdentifier("© The End ©", true);
            Console.WriteLine(testResult);

            Assert.AreEqual("_u0000_u00c2_u00a9_u0020The_u0020End_u0020_u00c2_u00a9", testResult);
        }
Esempio n. 24
0
        /// <summary>
        /// Returns node definition specific to graph-viz (ver. 2.38+)
        /// see [http://www.graphviz.org/]
        /// </summary>
        /// <returns></returns>
        public static string ToGraphVizNode(this CgType cgType)
        {
            var graphViz = new StringBuilder();

            graphViz.Append(NfString.SafeDotNetIdentifier(cgType.FullName));
            graphViz.AppendLine(" [shape=Mrecord, label=<<table bgcolor=\"white\" border=\"0\" >");
            graphViz.AppendLine("<th>");
            graphViz.AppendLine("<td bgcolor=\"grey\" align=\"center\">");
            graphViz.Append("<font color=\"white\">");
            graphViz.AppendFormat("{0} :: {1}", cgType.Name, string.IsNullOrWhiteSpace(cgType.Namespace) ? "global" : cgType.Namespace);
            graphViz.AppendLine("</font></td></th>");

            foreach (var prop in cgType.Properties)
            {
                graphViz.AppendLine(prop.ToGraphVizString());
            }
            foreach (var me in cgType.SortedMethods)
            {
                graphViz.AppendLine(me.ToGraphVizString());
            }
            graphViz.AppendLine("</table>> ];");

            return(graphViz.ToString());
        }
Esempio n. 25
0
        internal static List <Tuple <Action, int, string, string> > GetClosestMatch(PropertyInfo fromPi, object fromObj, PropertyInfo[] toPis, object toObj, string namePrefix = null, int minLen = 2)
        {
            if (fromPi == null || toPis == null || !toPis.Any())
            {
                return(new List <Tuple <Action, int, string, string> >());
            }

            //we want to map a whole assignment expression to a distance on name
            var ops2Score = new List <Tuple <Action, int, string, string> >();

            Func <PropertyInfo, string, bool, string> getMeasureableName = (gmnPi, prefix, inReverse) =>
            {
                if (gmnPi.Name.Length <= minLen)
                {
                    return(inReverse ? String.Join("", gmnPi.Name, prefix) : String.Join("", prefix, gmnPi.Name));
                }
                return(gmnPi.Name);
            };

            foreach (var toPi in toPis)
            {
                if (NfReflect.IsValueTypeProperty(toPi, true))
                {
                    string toFromTns;
                    Action simpleAssignment = GetSimpleAssignment(toPi, toObj, fromPi, fromObj, out toFromTns);
                    if (String.IsNullOrWhiteSpace(namePrefix))
                    {
                        //for simple value types -to- value types where dest has a very short name
                        namePrefix = toObj.GetType().Name;
                    }
                    var fromPiName        = getMeasureableName(fromPi, namePrefix, false);
                    var cpiName           = getMeasureableName(toPi, namePrefix, false);
                    var fromPiReverseName = getMeasureableName(fromPi, namePrefix, true);
                    var cpiReverseName    = getMeasureableName(toPi, namePrefix, true);

                    var score = (int)NfString.LevenshteinDistance(fromPiName, cpiName);

                    //with short property names, prehaps a better score is when prefix is a suffix instead
                    if (fromPiName != fromPiReverseName || cpiName != cpiReverseName)
                    {
                        var revScore = (int)NfString.LevenshteinDistance(fromPiReverseName, cpiReverseName);
                        if (revScore < score)
                        {
                            score = revScore;
                        }
                    }

                    ops2Score.Add(new Tuple <Action, int, string, string>(simpleAssignment, score, toPi.Name, toFromTns));
                }
                else
                {
                    var toInnerPi = toPi.PropertyType.GetProperties(DefaultFlags);
                    if (!toInnerPi.Any())
                    {
                        continue;
                    }

                    var toInnerObj        = toPi.GetValue(toObj) ?? Activator.CreateInstance(toPi.PropertyType);
                    var innerMeasurements = GetClosestMatch(fromPi, fromObj, toInnerPi, toInnerObj, toPi.Name, minLen);

                    if (!innerMeasurements.Any())
                    {
                        continue;
                    }

                    //these will by def, be the shortest distance
                    foreach (var innerM in innerMeasurements)
                    {
                        //we will chain-link these actions
                        Action complexAction = () =>
                        {
                            innerM.Item1();
                            if (toPi.GetValue(toObj) == null)
                            {
                                toPi.SetValue(toObj, toInnerObj);
                            }
                        };
                        var actionId = String.Join(".", toPi.Name, innerM.Item3);

                        ops2Score.Add(new Tuple <Action, int, string, string>(complexAction, innerM.Item2, actionId, String.Join("`", toPi.PropertyType.FullName, innerM.Item4)));
                    }
                }
            }

            var totalMin = ops2Score.Min(x => x.Item2);
            var closest  = ops2Score.Where(x => x.Item2 == totalMin).ToList();

            return(closest);
        }
Esempio n. 26
0
        /// <summary>
        /// Specific to Graph-Viz (ver 2.38+) - produces the .gv file
        /// to be compiled by dot.exe resulting in a class diagram of
        /// the <see cref="assembly"/>
        /// </summary>
        /// <param name="assembly"></param>
        /// <param name="typeFullName"></param>
        /// <returns></returns>
        public static string GetClassDiagram(Assembly assembly, string typeFullName)
        {
            if (assembly == null)
            {
                throw new ArgumentNullException(nameof(assembly));
            }
            if (string.IsNullOrWhiteSpace(typeFullName))
            {
                throw new ArgumentNullException(nameof(typeFullName));
            }
            var asmType = assembly.NfGetType(typeFullName);

            if (asmType == null)
            {
                throw new RahRowRagee(
                          $"This type '{typeFullName}' could not be found in the assembly '{assembly.GetName().Name}'");
            }

            var gv        = new StringBuilder();
            var graphName = NfString.SafeDotNetIdentifier(assembly.GetName().Name);

            var topClass       = GetCgOfType(assembly, typeFullName, false);
            var allCgTypeNames =
                topClass.AllPropertyTypes.Where(
                    x =>
                    !string.Equals(x, typeFullName, StringComparison.OrdinalIgnoreCase) &&
                    assembly.GetType(x) != null).ToList();

            var allCgTypes =
                allCgTypeNames.Where(x => !string.Equals(x, typeFullName, StringComparison.OrdinalIgnoreCase))
                .Select(x => GetCgOfType(assembly, x, false))
                .ToList();

            foreach (var aCgType in allCgTypes)
            {
                aCgType.IsEnum = topClass.Properties.FirstOrDefault(x => x.TypeName == aCgType.FullName && x.IsEnum) !=
                                 null;
            }

            //keep the diagram from exploding by multiples.
            var propertyManifold =
                allCgTypes.SelectMany(x => x.AllPropertyTypes)
                .Where(
                    x =>
                    !string.Equals(x, typeFullName, StringComparison.OrdinalIgnoreCase) &&
                    !allCgTypeNames.Contains(x))
                .Distinct()
                .ToList();

            //determine which types require an empty class node
            var missingTypes =
                allCgTypes.SelectMany(x => x.AllPropertyTypes).Where(x => assembly.NfGetType(x) == null).Distinct().ToList();

            missingTypes.AddRange(
                topClass.AllPropertyTypes.Where(x => assembly.NfGetType(x) == null && !missingTypes.Contains(x)));

            gv.Append($"digraph {graphName}Assembly");
            gv.AppendLine("{");
            gv.AppendLine("graph [rankdir=\"LR\"];");
            gv.AppendLine("node [fontname=\"Consolas\"];");

            gv.AppendLine(topClass.ToGraphVizNode());

            foreach (var missing in missingTypes)
            {
                gv.AppendLine(GraphVizExtensions.EmptyGraphVizClassNode(missing, topClass.EnumsValues(missing)));
            }

            foreach (var far in propertyManifold)
            {
                gv.AppendLine(GraphVizExtensions.EmptyGraphVizClassNode(far, topClass.EnumsValues(far)));
            }

            foreach (var cg in allCgTypes.Where(x => !x.IsEnum))
            {
                gv.AppendLine(cg.ToGraphVizNode());
            }

            foreach (
                var cg in
                allCgTypes.Where(
                    x => x.IsEnum && !missingTypes.Contains(x.FullName) && !propertyManifold.Contains(x.FullName)))
            {
                gv.AppendLine(GraphVizExtensions.EmptyGraphVizClassNode(cg.FullName, topClass.EnumsValues(cg.FullName)));
            }

            gv.AppendLine();
            gv.AppendLine();

            gv.AppendLine(topClass.ToGraphVizEdge());

            foreach (var cg in allCgTypes)
            {
                gv.AppendLine(cg.ToGraphVizEdge());
            }

            gv.AppendLine("}");
            return(gv.ToString());
        }
Esempio n. 27
0
        /// <summary>
        /// Performs dual operation of, one, moving <see cref="MoveMethodsArgs.MoveMembers"/>
        /// out of <see cref="MoveMethodsArgs.SrcFile"/> and into the new
        /// <see cref="MoveMethodsArgs.OutFilePath"/> (adjusting their signatures as needed to
        /// accommodate dependencies), and, two, modifying the <see cref="MoveMethodsArgs.SrcFile"/>
        /// file to call the new.
        /// </summary>
        /// <param name="cgType"></param>
        /// <param name="args"></param>
        public static void MoveMembers(this CgType cgType, MoveMethodsArgs args)
        {
            var srcFile                     = args.SrcFile;
            var moveMembers                 = args.MoveMembers;
            var newVariableName             = args.NewVariableName;
            var outFilePath                 = args.OutFilePath;
            var outFileNamespaceAndTypeName = args.OutFileNamespaceAndType;
            var includeUsingStmts           = args.IncludeUsingStmts;
            var excludeUsingStmts           = args.ExcludedUsingStmts;

            if (moveMembers == null || moveMembers.Count < 0)
            {
                return;
            }

            if (string.IsNullOrWhiteSpace(srcFile) || !File.Exists(srcFile))
            {
                return;
            }

            var srcLines = File.ReadAllLines(srcFile);

            //need this to be the same for the whole batch of refactored lines
            if (string.IsNullOrWhiteSpace(newVariableName))
            {
                newVariableName = Util.Core.NfString.GetNfRandomName();
            }

            if (string.IsNullOrWhiteSpace(outFilePath))
            {
                outFilePath = Path.Combine(Shared.Core.NfSettings.AppData, Util.Core.NfString.GetNfRandomName());
            }


            //need to move the existing code to the new file
            var newNs = NfString.SafeDotNetTypeName(outFileNamespaceAndTypeName.Item1);

            var newTn = NfString.SafeDotNetIdentifier(outFileNamespaceAndTypeName.Item2);

            var idxRefactor = new Dictionary <Tuple <int, int>, string[]>();
            var newCgType   = new CgType {
                Namespace = newNs, Name = newTn
            };

            foreach (var cgm in moveMembers)
            {
                //the signature must be changed to handle instance-level dependencies
                cgm.Args.AddRange(cgm.GetAllRefactorDependencies());
                var refactorLines = cgm.MyRefactoredLines(newVariableName, outFileNamespaceAndTypeName, false);
                foreach (var key in refactorLines.Keys)
                {
                    if (idxRefactor.Keys.Any(x => x.Equals(key)))
                    {
                        continue;
                    }
                    idxRefactor.Add(key, refactorLines[key]);
                }
                newCgType.Methods.Add(cgm);
            }

            //clear file content
            File.WriteAllText(outFilePath, string.Empty, Encoding.UTF8);
            var nsImports = Settings.LangStyle.ExtractNamespaceImportStatements(srcLines);

            if (nsImports != null)
            {
                nsImports = FilterNamespaceImportStmts(nsImports, includeUsingStmts,
                                                       excludeUsingStmts);
            }

            File.AppendAllLines(outFilePath, new [] { Settings.LangStyle.ToNamespaceDecl(newCgType) });

            File.AppendAllText(outFilePath,
                               Settings.LangStyle.ToClass(newCgType, CgAccessModifier.Public, CgClassModifier.AsIs, nsImports), Encoding.UTF8);

            File.AppendAllLines(outFilePath, new[] { Settings.LangStyle.GetEnclosureCloseToken(null) });

            //now must modify existing file
            var k = 0;

            //get fresh copy from disk.
            srcLines = File.ReadAllLines(srcFile);

            foreach (var idx in idxRefactor)
            {
                var s = idx.Key.Item1 + k;
                var l = idx.Key.Item2;

                //get everything up to start of member
                var left = srcLines.Take(s - 1).ToList();

                //add in the new refactored code
                left.AddRange(idx.Value);

                //add in all the remainder less the removed member
                left.AddRange(srcLines.Skip(s + l).Take(srcLines.Length).ToList());

                //keep a running total of the number of lines removed
                var len = srcLines.Length;
                srcLines = left.ToArray();
                k        = srcLines.Length - len;//this will typically be a negative int
            }

            //need to add the new variable decl
            int lnNumOut;

            Settings.LangStyle.TryFindFirstLineInClass(cgType.FullName, srcLines.ToArray(),
                                                       out lnNumOut);

            var oldFilesInstanceToNew = Settings.LangStyle.ToDecl(newCgType, newVariableName,
                                                                  CgAccessModifier.Private);

            var g = srcLines.Take(lnNumOut).ToList();

            g.Add(oldFilesInstanceToNew);
            g.AddRange(srcLines.Skip(lnNumOut).Take(srcLines.Length));
            srcLines = g.ToArray();

            //write the new content out to the file
            File.WriteAllLines(srcFile, srcLines, Encoding.UTF8);
        }
Esempio n. 28
0
        /// <summary>
        /// Decrypts a file which was encrypted by its sister method <see cref="EncryptFile"/>
        /// </summary>
        /// <param name="path"></param>
        /// <param name="certCerPath"></param>
        /// <param name="certPassword"></param>
        public static void DecryptFile(string path, string certCerPath, string certPassword)
        {
            //test inputs
            TestEnDeCryptInputs(path, certCerPath, certPassword);

            //import the cert
            var cert = new X509Certificate2();

            cert.Import(certCerPath, certPassword, X509KeyStorageFlags.Exportable);
            var privKey = cert.PrivateKey as RSACryptoServiceProvider;

            if (privKey == null)
            {
                throw new ItsDeadJim("The private could not be resolved.");
            }

            var plainTextFile = Path.Combine(Path.GetDirectoryName(path) ?? Environment.CurrentDirectory,
                                             Path.GetFileNameWithoutExtension(path) ?? NfString.GetNfRandomName());

            using (var aes = new AesManaged())
            {
                aes.KeySize   = 256;
                aes.BlockSize = 128;
                aes.Mode      = CipherMode.CBC;

                var bufferK  = new byte[4];
                var bufferIv = new byte[4];

                using (var inFs = new FileStream(path, FileMode.Open))
                {
                    inFs.Seek(0, SeekOrigin.Begin);
                    inFs.Read(bufferK, 0, 3);
                    inFs.Seek(4, SeekOrigin.Begin);
                    inFs.Read(bufferIv, 0, 3);

                    var lenK  = BitConverter.ToInt32(bufferK, 0);
                    var lenIv = BitConverter.ToInt32(bufferIv, 0);

                    var startC = lenK + lenIv + 8;
                    var enKey  = new byte[lenK];
                    var iv     = new byte[lenIv];

                    inFs.Seek(8, SeekOrigin.Begin);
                    inFs.Read(enKey, 0, lenK);
                    inFs.Seek(8 + lenK, SeekOrigin.Begin);
                    inFs.Read(iv, 0, lenIv);

                    var decKey = privKey.Decrypt(enKey, false);
                    using (var trans = aes.CreateDecryptor(decKey, iv))
                    {
                        using (var outFs = new FileStream(plainTextFile, FileMode.Create))
                        {
                            var blockSz = aes.BlockSize / 8;
                            var data    = new byte[blockSz];
                            inFs.Seek(startC, SeekOrigin.Begin);
                            using (var outCrypto = new CryptoStream(outFs, trans, CryptoStreamMode.Write))
                            {
                                var count = 0;
                                do
                                {
                                    count = inFs.Read(data, 0, blockSz);
                                    outCrypto.Write(data, 0, count);
                                } while (count > 0);

                                outCrypto.FlushFinalBlock();
                                outCrypto.Close();
                            }
                            outFs.Close();
                        }
                        inFs.Close();
                    } // end decryptor
                }     // end fs in
            }         //end aes managed
        }