From b4b32de97578c06697974b3be85ba5dbb46354b0 Mon Sep 17 00:00:00 2001 From: Gary Kenneally Date: Mon, 6 Apr 2015 21:20:37 +0100 Subject: [PATCH 1/6] updating readme --- README.md | 82 ++++++++++--------- .../Generators/AlphaNumericGenerator.cs | 10 ++- src/templates/README.template.md | 18 ++-- 3 files changed, 59 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 67cc9bf..5c64f4a 100644 --- a/README.md +++ b/README.md @@ -24,24 +24,26 @@ A library and command line tool that can be used to generate data for testing, t ### Pattern Composition If you are familiar with Regular Expressions then most of the syntax used will be familiar but there are significant differences in place given that regex is used to match a string against a pattern. The generator instead uses simple patterns of symbols to produce strings, because of the difference in usage the syntaxes cannot match up entirely. Patterns define what the generated values will be and can be composed using text and symbols. Sections of the pattern can be repeated a specific number of times (they can also be repeated a random number of times by providing a min and max). Patterns can also include alternate items that will be randomly selected, helping to produce relatively complicated outputs. -### Symbols -The following symbols are shorthand tokens which you can use in your generation patterns: +### Symbols (Character Classes) +The following symbols are shorthand tokens which you can use in your generation patterns. They follow most of the (Perl/Tcl)[http://en.wikipedia.org/wiki/Regular_expression#Character_classes] shorthand classifications but because our focus is on text production rather than searching/matching we have extended things a little with a few more shorthand items. |Symbol|Description|Represented characters| |------|-----------|-------| |`\.`|A single random character of any type.|abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 .,;:\"'!&?£$€$%^<>{}[]()*\\+-=@#_\|~/ and space| -|`\W`|A single random character from the following list ' .,;:\"'!&?£€$%^<>{}[]()*+-=\@#\|~/'.|? -|`\w`|A single random upper-case or lower-case letter.|g -|`\L`|A single random upper-case Letter.|M -|`\l`|A single random lower-case letter.|u +|`\w`|A single random upper-case character, lower-case character, number or underscore.|abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 or _| +|`\W`|A single random non AlphaNumeric, non Whitespace character|.,;:\"'!&?£$€$%^<>{}[]()*\\+-=@#_\|~/| +|`\a`|A single random upper-case character or lower-case character.|abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ| +|`\s`|A whitespace character|Tab, New Line, Space, Carriage Return or Form Feed| +|`\d`|A single random number|0-9| +|`\D`|A single random non number character.|v +|`\L`|A single random upper-case Letter.|C +|`\l`|A single random lower-case letter.|m +|`\S`|A single random non-whitespace character|$ + |`\V`|A single random upper-case Vowel.|O |`\v`|A single random lower-case vowel.|i |`\C`| - A single random upper-case Consonant.|K |`\c`|A single random lower-case consonant.|y -|`\D`|A single random non number character.|i -|`\d`|A single random number, 1-9.|6 -|`\S`|A single random non-whitespace character|c -|`\s`|A whitespace character (Tab, New Line, Space, Carriage Return or Form Feed)| | |`\n`|A newline character.|[NEWLINE]| |`\t`|A tab character.|[TAB]| @@ -51,9 +53,9 @@ Groups can contain multiple Symbols or characters and allows us to treat them as |Group|Description|Example| |----|------|-----| -|`(\d)`|A number between 0 and 9.|'3'| -|`(ABC\d)`|'ABC' followed by a number between 0 and 9.|ABC9| -|`\L(\d)\L`|A upper-case letter, three digits between 0 and 9 and another upper-case letter.|R6H| +|`(\d)`|A number between 0 and 9.|'1'| +|`(ABC\d)`|'ABC' followed by a number between 0 and 9.|ABC6| +|`\L(\d)\L`|A upper-case letter, three digits between 0 and 9 and another upper-case letter.|A2I| #### Alternations When a group contains alternations the patterns are divided by the | character, during processing one of the alternated patterns is selected at random. @@ -63,8 +65,8 @@ Groups can contain several individual symbols or groups of symbols and randomly |Alternation|Description|Example| |----|------|-----| -|`(\L\L|\d\d)`|Either two upper-case letters OR two numbers.|'77'| -|`(\L\L|\d\d|[AEIOU]|[100-120])`|Either two upper-case letters OR two digits OR an upper-case vowel OR a number between 100 and 120.|'103'| +|`(\L\L|\d\d)`|Either two upper-case letters OR two numbers.|'66'| +|`(\L\L|\d\d|[AEIOU]|[100-120])`|Either two upper-case letters OR two digits OR an upper-case vowel OR a number between 100 and 120.|'67'| |`(\C|)`|Either a upper-case Consonant or nothing.|| ### Ranges @@ -73,24 +75,24 @@ Ranges can contain multiple characters or ranges of characters but no symbols (t |Character Range|Description|Example| |----|------|-----| -|`[abc]`|Either 'a','b' or 'c'.|'b'| -|`[a-z]`|A single lower-case letter between a and z.|'e'| -|`[A-Z]`|A single upper-case letter between A and Z.|'H'| -|`[A-D]`|A single upper-case letter between A and D.|'D'| -|`[A-Da-z]`|A single character between A and D or between a and z.|'s'| +|`[abc]`|Either 'a','b' or 'c'.|'c'| +|`[a-z]`|A single lower-case letter between a and z.|'c'| +|`[A-Z]`|A single upper-case letter between A and Z.|'J'| +|`[A-D]`|A single upper-case letter between A and D.|'A'| +|`[A-Da-z]`|A single character between A and D or between a and z.|'h'| #### Numeric ranges |Numeric Range|Description|Example| |----|------|-----| -|`[1-5]`|A number between 1 and 5.|'1'| -|`[100-500]`|A number between 100 and 500.|'423'| -|`[1.25-5]`|A decimal number between 1.25 and 5. The scope or number of decimal places is taken from the first number defined (1.25 in this case) and the produced value will have the same number of decimal places.|'1.48'| +|`[1-5]`|A number between 1 and 5.|'5'| +|`[100-500]`|A number between 100 and 500.|'387'| +|`[1.25-5]`|A decimal number between 1.25 and 5. The scope or number of decimal places is taken from the first number defined (1.25 in this case) and the produced value will have the same number of decimal places.|'1.3'| ### Named Parameters A named pattern is surrounded with @ characters and links to a predefined pattern loaded from a file. The `default.tdg-patterns` file located in the same directory as the tdg executable file contains a list of named patterns which can be used in other patterns you write. For example to generate you could write something like `([1-9]\d\d-\d\d-\d\d\d\d)` or you can use the named parameter in the file `(@misc_ssn@)` to a similar value. You can add more patterns to the file as you wish. Named patterns can also include other named patterns if you so wish. -Take a look at the `@address_us_type1@` pattern in the file as an example of a compound pattern than uses other patterns to produce an output e.g. '374 Olive Place, Prince William County, Illinois, 35136' +Take a look at the `@address_us_type1@` pattern in the file as an example of a compound pattern than uses other patterns to produce an output e.g. '8537 Glenwood Terrace, Marin County, North Dakota, 42351' ### Repetition Repetition is a powerful feature allowing for complicated data production. A Symbol, Group or Range can be repeated a set or random number of times by using the following syntax. @@ -99,17 +101,17 @@ Repetition is a powerful feature allowing for complicated data production. A Sym |Repitition syntax|Description|Example| |----|------|-----| -|`\d{5}`|Will generate 5 number characters.|'31909'| -|`(\L\d\L){5}`|Will generate 5 upper-case letter, number, upper-case letter items.|'M6BD2CI5HZ8UF1E'| -|`[ABC]{5}`|Will generate 5 items where each item will be either 'A','B' or 'C'.|'BCBCC'| +|`\d{5}`|Will generate 5 number characters.|'36319'| +|`(\L\d\L){5}`|Will generate 5 upper-case letter, number, upper-case letter items.|'C9MQ0DF0IO3ZW7F'| +|`[ABC]{5}`|Will generate 5 items where each item will be either 'A','B' or 'C'.|'AABCB'| #### Random Quantity |Random syntax|Description|Example| |----|------|-----| -|`\d{5,10}`|Will generate between 5 and 10 number characters.|'43043'| -|`(\L\d\L){5,10}`|Will generate between 5 and 10 upper-case letter, number, upper-case letter items.|'J0QV8UC0XF8MH1DJ4JO3B'| -|`[ABC]{5,10}`|Will generate between 5 and 10 items where each item will be either 'A','B' or 'C'.|'ABCAAC'| +|`\d{5,10}`|Will generate between 5 and 10 number characters.|'914304333'| +|`(\L\d\L){5,10}`|Will generate between 5 and 10 upper-case letter, number, upper-case letter items.|'Q8WU0AX2WM3DD3M'| +|`[ABC]{5,10}`|Will generate between 5 and 10 items where each item will be either 'A','B' or 'C'.|'BAAAABC'| ## Template Syntax @@ -119,7 +121,7 @@ You can create template documents that contain multiple pattern syntax placehold ### Placeholders You can place your symbols and patterns within placeholders which will be replaced with the generated values. These placeholders contain 1 or more symbols representing the desired output characters. -Within a template all text not within a placeholder is treated as normal text with no special handling taking place. Patterns that need to be randomly generated should be placed inside '<< >>' tokens e.g. 'This is a template <<\L\L>>' produces 'This is a template ZI'. You can also escape placeholders by placing a '\' before them which will prevent them from being processed. To place a '\' before a placeholder in the generated content you need to place 2 backslashes before the placeholder. +Within a template all text not within a placeholder is treated as normal text with no special handling taking place. Patterns that need to be randomly generated should be placed inside '<< >>' tokens e.g. 'This is a template <<\L\L>>' produces 'This is a template ED'. You can also escape placeholders by placing a '\' before them which will prevent them from being processed. To place a '\' before a placeholder in the generated content you need to place 2 backslashes before the placeholder. ### Configuration You can supply configuration values to the generator either as an additional parameter within the api or you can include it within the template string itself by wrapping it within '<# #>' tokens. Configuration directives must appear as the first item with a template or else they will be ignored and removed. @@ -159,15 +161,15 @@ Pattern files contain Named Patterns which can be used within Templates. TDG com |Command|Description|Example| |--------|--------|-------| -|`tdg -t 'Letters <<\L{20}>> and Numbers <<\d{12}>>'`|Single repeating symbols using the following syntax. |*'Letters ZQWSYOREAADBHFCYMVZD and Numbers 869032710662'*| -|`tdg -t '<<(\L){5}>>'`|Repeating patterns containing multiple letters or numbers of random length.
Will generate 5 random upper-case characters.|*'AOGFQ'*| -|`tdg -t '<<(\L\L\d){4}>>'`|Will generate 4 repeating letter-letter-number values.|*'PE5RI3NE9WB3'*| -|`tdg -t '<<(\L){10,20}>>'`|Will generate a string containing between 10 and 20 random upper-case characters.|*'SIWWMHTUJTUNCIKXBSY'*| -|`tdg -t 'Letters <<\L{2,20}>> and Numbers <<\d{2,12}>>'`|Produces items like|*'Letters HWQKLNIJWIIRVGZIJE and Numbers 948'*| -|`tdg -t 'Hi there <<\L\v{0,2}\l{0,2}\v \L\v{0,2}\l{0,2}\v{0,2}\l{0,2}\l>> how are you doing? Your SSN is <<[1-9]\d\d-\d\d-\d\d\d\d>>.' -c 100`|Input can contain several placeholders. Produces 100 items like|*'Hi there Foe Aaanv how are you doing?
Your SSN is 549-93-9041.'*| -|`tdg -t '<<[1-9]\d\d-\d\d-\d\d\d\d>>' -c 100`|Generate 100 SSN like values and output to console window. Produces 100 items like|*'830-58-6034'*| -|`tdg -t 'Hi there <<\L\v\l\v \L\v\l\l\v\v\l\l\v>> how are you doing?' -c 100 -o C:\test1.txt`|Generate 100 strings with random name like values and output to file. Produces 100 items like|*'Qeqe Hefpeapio'*| -|`tdg -t '<>'`|Produces the following output:|*'Letters P7Tj and Numbers 19 +|`tdg -t 'Letters <<\L{20}>> and Numbers <<\d{12}>>'`|Single repeating symbols using the following syntax. |*'Letters WZIZQWSYOREAADBHFCYM and Numbers 891869032710'*| +|`tdg -t '<<(\L){5}>>'`|Repeating patterns containing multiple letters or numbers of random length.
Will generate 5 random upper-case characters.|*'RQGAO'*| +|`tdg -t '<<(\L\L\d){4}>>'`|Will generate 4 repeating letter-letter-number values.|*'GF6PE5RI3NE9'*| +|`tdg -t '<<(\L){10,20}>>'`|Will generate a string containing between 10 and 20 random upper-case characters.|*'BJVSIWWMHTUJTUNCIKX'*| +|`tdg -t 'Letters <<\L{2,20}>> and Numbers <<\d{2,12}>>'`|Produces items like|*'Letters SY and Numbers 38644533833'*| +|`tdg -t 'Hi there <<\L\v{0,2}\l{0,2}\v \L\v{0,2}\l{0,2}\v{0,2}\l{0,2}\l>> how are you doing? Your SSN is <<[1-9]\d\d-\d\d-\d\d\d\d>>.' -c 100`|Input can contain several placeholders. Produces 100 items like|*'Hi there Reue Emvue how are you doing?
Your SSN is 112-91-0458.'*| +|`tdg -t '<<[1-9]\d\d-\d\d-\d\d\d\d>>' -c 100`|Generate 100 SSN like values and output to console window. Produces 100 items like|*'549-93-9041'*| +|`tdg -t 'Hi there <<\L\v\l\v \L\v\l\l\v\v\l\l\v>> how are you doing?' -c 100 -o C:\test1.txt`|Generate 100 strings with random name like values and output to file. Produces 100 items like|*'Ruja Nuqaeiqfo'*| +|`tdg -t '<>'`|Produces the following output:|*'Letters svoLxlK and Numbers 71697 '*| ## This README was generated using the generator. See the unit tests for other examples. diff --git a/src/DataGenerator/gk.DataGenerator/Generators/AlphaNumericGenerator.cs b/src/DataGenerator/gk.DataGenerator/Generators/AlphaNumericGenerator.cs index b1bdb63..e0cff6a 100644 --- a/src/DataGenerator/gk.DataGenerator/Generators/AlphaNumericGenerator.cs +++ b/src/DataGenerator/gk.DataGenerator/Generators/AlphaNumericGenerator.cs @@ -18,6 +18,7 @@ public static class AlphaNumericGenerator private const string _AllWhitespaceCharacters = " \t\n\r\f"; private const string _AllNonWhitespaceNonAlphaNumericCharacters = ".,;:\"'!&?£$€$%^<>{}[]()*\\+-=@#_|~/"; + private const string _ShortHand_a = _AllLetters; // \a private const string _ShortHand_l = "abcdefghijklmnopqrstuvwxyz"; // \l private const string _ShortHand_L = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // \L private const string _ShortHand_V = "AEIOU"; // \V @@ -28,9 +29,9 @@ public static class AlphaNumericGenerator private const string _ShortHand_d = _AllNumbers; // \d private const string _ShortHand_W = _AllNonWhitespaceNonAlphaNumericCharacters + " "; // \W private const string _ShortHand_w = _AllLetters + _AllNumbers + "_"; // \w - private const string _ShortHand_s = _AllWhitespaceCharacters; // \s - private const string _ShortHand_S = _AllLetters + _AllNumbers + _AllNonWhitespaceNonAlphaNumericCharacters; // \S - + private const string _ShortHand_S = _AllWhitespaceCharacters; // \S + private const string _ShortHand_s = _AllLetters + _AllNumbers + _AllNonWhitespaceNonAlphaNumericCharacters; // \s + private const string _Config_Start = "<#"; private const string _Config_End = "#>"; @@ -766,6 +767,9 @@ private static void AppendCharacterDerivedFromSymbol(StringBuilder sb, char symb case 'w': AppendRandomCharacterFromString(sb, _ShortHand_w, random); break; + case 'a': + AppendRandomCharacterFromString(sb, _ShortHand_a, random); + break; case 'L': AppendRandomCharacterFromString(sb, _ShortHand_L, random); break; diff --git a/src/templates/README.template.md b/src/templates/README.template.md index 4c31c07..0020746 100644 --- a/src/templates/README.template.md +++ b/src/templates/README.template.md @@ -24,24 +24,26 @@ A library and command line tool that can be used to generate data for testing, t ### Pattern Composition If you are familiar with Regular Expressions then most of the syntax used will be familiar but there are significant differences in place given that regex is used to match a string against a pattern. The generator instead uses simple patterns of symbols to produce strings, because of the difference in usage the syntaxes cannot match up entirely. Patterns define what the generated values will be and can be composed using text and symbols. Sections of the pattern can be repeated a specific number of times (they can also be repeated a random number of times by providing a min and max). Patterns can also include alternate items that will be randomly selected, helping to produce relatively complicated outputs. -### Symbols -The following symbols are shorthand tokens which you can use in your generation patterns: +### Symbols (Character Classes) +The following symbols are shorthand tokens which you can use in your generation patterns. They follow most of the (Perl/Tcl)[http://en.wikipedia.org/wiki/Regular_expression#Character_classes] shorthand classifications but because our focus is on text production rather than searching/matching we have extended things a little with a few more shorthand items. |Symbol|Description|Represented characters| |------|-----------|-------| |`\.`|A single random character of any type.|abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 .,;:\"'!&?£$€$%^<>{}[]()*\\+-=@#_\|~/ and space| -|`\W`|A single random character from the following list ' .,;:\"'!&?£€$%^<>{}[]()*+-=\@#\|~/'.|<<\W>> -|`\w`|A single random upper-case or lower-case letter.|<<\w>> +|`\w`|A single random upper-case character, lower-case character, number or underscore.|abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 or _| +|`\W`|A single random non AlphaNumeric, non Whitespace character|.,;:\"'!&?£$€$%^<>{}[]()*\\+-=@#_\|~/| +|`\a`|A single random upper-case character or lower-case character.|abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ| +|`\s`|A whitespace character|Tab, New Line, Space, Carriage Return or Form Feed| +|`\d`|A single random number|0-9| +|`\D`|A single random non number character.|<<\D>> |`\L`|A single random upper-case Letter.|<<\L>> |`\l`|A single random lower-case letter.|<<\l>> +|`\S`|A single random non-whitespace character|<<\S>> + |`\V`|A single random upper-case Vowel.|<<\V>> |`\v`|A single random lower-case vowel.|<<\v>> |`\C`| - A single random upper-case Consonant.|<<\C>> |`\c`|A single random lower-case consonant.|<<\c>> -|`\D`|A single random non number character.|<<\D>> -|`\d`|A single random number, 1-9.|<<\d>> -|`\S`|A single random non-whitespace character|<<\S>> -|`\s`|A whitespace character (Tab, New Line, Space, Carriage Return or Form Feed)|<<\s>>| |`\n`|A newline character.|[NEWLINE]| |`\t`|A tab character.|[TAB]| From f950643ac92091aa0fa8b4fc61efb46074258e3c Mon Sep 17 00:00:00 2001 From: Gary Kenneally Date: Mon, 6 Apr 2015 21:24:07 +0100 Subject: [PATCH 2/6] updating readme --- README.md | 69 ++++++++++++++++---------------- src/templates/README.template.md | 19 +++++---- 2 files changed, 43 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 5c64f4a..80ec898 100644 --- a/README.md +++ b/README.md @@ -33,17 +33,16 @@ The following symbols are shorthand tokens which you can use in your generation |`\w`|A single random upper-case character, lower-case character, number or underscore.|abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 or _| |`\W`|A single random non AlphaNumeric, non Whitespace character|.,;:\"'!&?£$€$%^<>{}[]()*\\+-=@#_\|~/| |`\a`|A single random upper-case character or lower-case character.|abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ| -|`\s`|A whitespace character|Tab, New Line, Space, Carriage Return or Form Feed| +|`\s`|A whitespace character|SPACE TAB NEWLINE CARRAIGERETURN VERTICALTAB LINEFEED| |`\d`|A single random number|0-9| -|`\D`|A single random non number character.|v -|`\L`|A single random upper-case Letter.|C -|`\l`|A single random lower-case letter.|m -|`\S`|A single random non-whitespace character|$ - -|`\V`|A single random upper-case Vowel.|O -|`\v`|A single random lower-case vowel.|i -|`\C`| - A single random upper-case Consonant.|K -|`\c`|A single random lower-case consonant.|y +|`\D`|A single random non number character.|abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ .,;:\"'!&?£$€$%^<>{}[]()*\\+-=@#_\|~/ or [SPACE]| +|`\l`|A single random lower-case letter.|abcdefghijklmnopqrstuvwxyz| +|`\L`|A single random upper-case Letter.|ABCDEFGHIJKLMNOPQRSTUVWXYZ| +|`\S`|A single random non-whitespace character.|abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 .,;:\"'!&?£$€$%^<>{}[]()*\\+-=@#_\|~/| +|`\V`|A single random upper-case Vowel.|AEIOU| +|`\v`|A single random lower-case vowel.|aeiou| +|`\C`|A single random upper-case Consonant.|BCDFGHJKLMNPQRSTVWXYZ| +|`\c`|A single random lower-case consonant.|bcdfghjklmnpqrstvwxyz| |`\n`|A newline character.|[NEWLINE]| |`\t`|A tab character.|[TAB]| @@ -53,9 +52,9 @@ Groups can contain multiple Symbols or characters and allows us to treat them as |Group|Description|Example| |----|------|-----| -|`(\d)`|A number between 0 and 9.|'1'| -|`(ABC\d)`|'ABC' followed by a number between 0 and 9.|ABC6| -|`\L(\d)\L`|A upper-case letter, three digits between 0 and 9 and another upper-case letter.|A2I| +|`(\d)`|A number between 0 and 9.|'2'| +|`(ABC\d)`|'ABC' followed by a number between 0 and 9.|ABC1| +|`\L(\d)\L`|A upper-case letter, three digits between 0 and 9 and another upper-case letter.|M7R| #### Alternations When a group contains alternations the patterns are divided by the | character, during processing one of the alternated patterns is selected at random. @@ -65,8 +64,8 @@ Groups can contain several individual symbols or groups of symbols and randomly |Alternation|Description|Example| |----|------|-----| -|`(\L\L|\d\d)`|Either two upper-case letters OR two numbers.|'66'| -|`(\L\L|\d\d|[AEIOU]|[100-120])`|Either two upper-case letters OR two digits OR an upper-case vowel OR a number between 100 and 120.|'67'| +|`(\L\L|\d\d)`|Either two upper-case letters OR two numbers.|'JY'| +|`(\L\L|\d\d|[AEIOU]|[100-120])`|Either two upper-case letters OR two digits OR an upper-case vowel OR a number between 100 and 120.|'QA'| |`(\C|)`|Either a upper-case Consonant or nothing.|| ### Ranges @@ -75,24 +74,24 @@ Ranges can contain multiple characters or ranges of characters but no symbols (t |Character Range|Description|Example| |----|------|-----| -|`[abc]`|Either 'a','b' or 'c'.|'c'| -|`[a-z]`|A single lower-case letter between a and z.|'c'| -|`[A-Z]`|A single upper-case letter between A and Z.|'J'| -|`[A-D]`|A single upper-case letter between A and D.|'A'| -|`[A-Da-z]`|A single character between A and D or between a and z.|'h'| +|`[abc]`|Either 'a','b' or 'c'.|'a'| +|`[a-z]`|A single lower-case letter between a and z.|'z'| +|`[A-Z]`|A single upper-case letter between A and Z.|'R'| +|`[A-D]`|A single upper-case letter between A and D.|'C'| +|`[A-Da-z]`|A single character between A and D or between a and z.|'s'| #### Numeric ranges |Numeric Range|Description|Example| |----|------|-----| -|`[1-5]`|A number between 1 and 5.|'5'| -|`[100-500]`|A number between 100 and 500.|'387'| -|`[1.25-5]`|A decimal number between 1.25 and 5. The scope or number of decimal places is taken from the first number defined (1.25 in this case) and the produced value will have the same number of decimal places.|'1.3'| +|`[1-5]`|A number between 1 and 5.|'1'| +|`[100-500]`|A number between 100 and 500.|'253'| +|`[1.25-5]`|A decimal number between 1.25 and 5. The scope or number of decimal places is taken from the first number defined (1.25 in this case) and the produced value will have the same number of decimal places.|'1.89'| ### Named Parameters A named pattern is surrounded with @ characters and links to a predefined pattern loaded from a file. The `default.tdg-patterns` file located in the same directory as the tdg executable file contains a list of named patterns which can be used in other patterns you write. For example to generate you could write something like `([1-9]\d\d-\d\d-\d\d\d\d)` or you can use the named parameter in the file `(@misc_ssn@)` to a similar value. You can add more patterns to the file as you wish. Named patterns can also include other named patterns if you so wish. -Take a look at the `@address_us_type1@` pattern in the file as an example of a compound pattern than uses other patterns to produce an output e.g. '8537 Glenwood Terrace, Marin County, North Dakota, 42351' +Take a look at the `@address_us_type1@` pattern in the file as an example of a compound pattern than uses other patterns to produce an output e.g. '8579 Shady Lane, Howard County, Montana, 52963' ### Repetition Repetition is a powerful feature allowing for complicated data production. A Symbol, Group or Range can be repeated a set or random number of times by using the following syntax. @@ -101,17 +100,17 @@ Repetition is a powerful feature allowing for complicated data production. A Sym |Repitition syntax|Description|Example| |----|------|-----| -|`\d{5}`|Will generate 5 number characters.|'36319'| -|`(\L\d\L){5}`|Will generate 5 upper-case letter, number, upper-case letter items.|'C9MQ0DF0IO3ZW7F'| -|`[ABC]{5}`|Will generate 5 items where each item will be either 'A','B' or 'C'.|'AABCB'| +|`\d{5}`|Will generate 5 number characters.|'46642'| +|`(\L\d\L){5}`|Will generate 5 upper-case letter, number, upper-case letter items.|'J5EJ6KE9CZ4QB1F'| +|`[ABC]{5}`|Will generate 5 items where each item will be either 'A','B' or 'C'.|'AABAC'| #### Random Quantity |Random syntax|Description|Example| |----|------|-----| -|`\d{5,10}`|Will generate between 5 and 10 number characters.|'914304333'| -|`(\L\d\L){5,10}`|Will generate between 5 and 10 upper-case letter, number, upper-case letter items.|'Q8WU0AX2WM3DD3M'| -|`[ABC]{5,10}`|Will generate between 5 and 10 items where each item will be either 'A','B' or 'C'.|'BAAAABC'| +|`\d{5,10}`|Will generate between 5 and 10 number characters.|'7211494791'| +|`(\L\d\L){5,10}`|Will generate between 5 and 10 upper-case letter, number, upper-case letter items.|'I0MJ3JA6VW7CA8FW4HD1J'| +|`[ABC]{5,10}`|Will generate between 5 and 10 items where each item will be either 'A','B' or 'C'.|'BBAAAAB'| ## Template Syntax @@ -121,7 +120,7 @@ You can create template documents that contain multiple pattern syntax placehold ### Placeholders You can place your symbols and patterns within placeholders which will be replaced with the generated values. These placeholders contain 1 or more symbols representing the desired output characters. -Within a template all text not within a placeholder is treated as normal text with no special handling taking place. Patterns that need to be randomly generated should be placed inside '<< >>' tokens e.g. 'This is a template <<\L\L>>' produces 'This is a template ED'. You can also escape placeholders by placing a '\' before them which will prevent them from being processed. To place a '\' before a placeholder in the generated content you need to place 2 backslashes before the placeholder. +Within a template all text not within a placeholder is treated as normal text with no special handling taking place. Patterns that need to be randomly generated should be placed inside '<< >>' tokens e.g. 'This is a template <<\L\L>>' produces 'This is a template TE'. You can also escape placeholders by placing a '\' before them which will prevent them from being processed. To place a '\' before a placeholder in the generated content you need to place 2 backslashes before the placeholder. ### Configuration You can supply configuration values to the generator either as an additional parameter within the api or you can include it within the template string itself by wrapping it within '<# #>' tokens. Configuration directives must appear as the first item with a template or else they will be ignored and removed. @@ -161,10 +160,10 @@ Pattern files contain Named Patterns which can be used within Templates. TDG com |Command|Description|Example| |--------|--------|-------| -|`tdg -t 'Letters <<\L{20}>> and Numbers <<\d{12}>>'`|Single repeating symbols using the following syntax. |*'Letters WZIZQWSYOREAADBHFCYM and Numbers 891869032710'*| -|`tdg -t '<<(\L){5}>>'`|Repeating patterns containing multiple letters or numbers of random length.
Will generate 5 random upper-case characters.|*'RQGAO'*| -|`tdg -t '<<(\L\L\d){4}>>'`|Will generate 4 repeating letter-letter-number values.|*'GF6PE5RI3NE9'*| -|`tdg -t '<<(\L){10,20}>>'`|Will generate a string containing between 10 and 20 random upper-case characters.|*'BJVSIWWMHTUJTUNCIKX'*| +|`tdg -t 'Letters <<\L{20}>> and Numbers <<\d{12}>>'`|Single repeating symbols using the following syntax. |*'Letters DWZIZQWSYOREAADBHFCY and Numbers 489186903271'*| +|`tdg -t '<<(\L){5}>>'`|Repeating patterns containing multiple letters or numbers of random length.
Will generate 5 random upper-case characters.|*'CRQGA'*| +|`tdg -t '<<(\L\L\d){4}>>'`|Will generate 4 repeating letter-letter-number values.|*'OG2QP1PR3JN1'*| +|`tdg -t '<<(\L){10,20}>>'`|Will generate a string containing between 10 and 20 random upper-case characters.|*'WBJVSIWWMHTUJTUNCIKX'*| |`tdg -t 'Letters <<\L{2,20}>> and Numbers <<\d{2,12}>>'`|Produces items like|*'Letters SY and Numbers 38644533833'*| |`tdg -t 'Hi there <<\L\v{0,2}\l{0,2}\v \L\v{0,2}\l{0,2}\v{0,2}\l{0,2}\l>> how are you doing? Your SSN is <<[1-9]\d\d-\d\d-\d\d\d\d>>.' -c 100`|Input can contain several placeholders. Produces 100 items like|*'Hi there Reue Emvue how are you doing?
Your SSN is 112-91-0458.'*| |`tdg -t '<<[1-9]\d\d-\d\d-\d\d\d\d>>' -c 100`|Generate 100 SSN like values and output to console window. Produces 100 items like|*'549-93-9041'*| diff --git a/src/templates/README.template.md b/src/templates/README.template.md index 0020746..ef21069 100644 --- a/src/templates/README.template.md +++ b/src/templates/README.template.md @@ -33,17 +33,16 @@ The following symbols are shorthand tokens which you can use in your generation |`\w`|A single random upper-case character, lower-case character, number or underscore.|abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 or _| |`\W`|A single random non AlphaNumeric, non Whitespace character|.,;:\"'!&?£$€$%^<>{}[]()*\\+-=@#_\|~/| |`\a`|A single random upper-case character or lower-case character.|abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ| -|`\s`|A whitespace character|Tab, New Line, Space, Carriage Return or Form Feed| +|`\s`|A whitespace character|SPACE TAB NEWLINE CARRAIGERETURN VERTICALTAB LINEFEED| |`\d`|A single random number|0-9| -|`\D`|A single random non number character.|<<\D>> -|`\L`|A single random upper-case Letter.|<<\L>> -|`\l`|A single random lower-case letter.|<<\l>> -|`\S`|A single random non-whitespace character|<<\S>> - -|`\V`|A single random upper-case Vowel.|<<\V>> -|`\v`|A single random lower-case vowel.|<<\v>> -|`\C`| - A single random upper-case Consonant.|<<\C>> -|`\c`|A single random lower-case consonant.|<<\c>> +|`\D`|A single random non number character.|abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ .,;:\"'!&?£$€$%^<>{}[]()*\\+-=@#_\|~/ or [SPACE]| +|`\l`|A single random lower-case letter.|abcdefghijklmnopqrstuvwxyz| +|`\L`|A single random upper-case Letter.|ABCDEFGHIJKLMNOPQRSTUVWXYZ| +|`\S`|A single random non-whitespace character.|abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 .,;:\"'!&?£$€$%^<>{}[]()*\\+-=@#_\|~/| +|`\V`|A single random upper-case Vowel.|AEIOU| +|`\v`|A single random lower-case vowel.|aeiou| +|`\C`|A single random upper-case Consonant.|BCDFGHJKLMNPQRSTVWXYZ| +|`\c`|A single random lower-case consonant.|bcdfghjklmnpqrstvwxyz| |`\n`|A newline character.|[NEWLINE]| |`\t`|A tab character.|[TAB]| From 3d98bc1638b35e6bd786127e796b9896c7b7f42d Mon Sep 17 00:00:00 2001 From: Gary Kenneally Date: Thu, 9 Apr 2015 15:42:47 +0100 Subject: [PATCH 3/6] updating readme and correcting minor bug --- README.md | 11 +- examples/RandomColouredDivs.html | 2028 +++++++++++++++++ examples/RandomColouredDivs.template | 28 + make.ps1 | 14 +- .../CommandLineArgs.cs | 2 +- .../gk.DataGenerator.CommandLine/Program.cs | 11 +- .../Generators/AlphaNumericGenerator.cs | 6 +- .../gk.DataGeneratorTests/TextTests.cs | 3 +- src/templates/README.template.md | 10 +- 9 files changed, 2090 insertions(+), 23 deletions(-) create mode 100644 examples/RandomColouredDivs.html create mode 100644 examples/RandomColouredDivs.template diff --git a/README.md b/README.md index 80ec898..60e2e8d 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ A library and command line tool that can be used to generate data for testing, t If you are familiar with Regular Expressions then most of the syntax used will be familiar but there are significant differences in place given that regex is used to match a string against a pattern. The generator instead uses simple patterns of symbols to produce strings, because of the difference in usage the syntaxes cannot match up entirely. Patterns define what the generated values will be and can be composed using text and symbols. Sections of the pattern can be repeated a specific number of times (they can also be repeated a random number of times by providing a min and max). Patterns can also include alternate items that will be randomly selected, helping to produce relatively complicated outputs. ### Symbols (Character Classes) -The following symbols are shorthand tokens which you can use in your generation patterns. They follow most of the (Perl/Tcl)[http://en.wikipedia.org/wiki/Regular_expression#Character_classes] shorthand classifications but because our focus is on text production rather than searching/matching we have extended things a little with a few more shorthand items. +The following symbols are shorthand tokens which you can use in your generation patterns. They follow most of the [Perl/Tcl](http://en.wikipedia.org/wiki/Regular_expression#Character_classes) shorthand classifications but because our focus is on text production rather than searching/matching we have extended things a little with a few more shorthand items. |Symbol|Description|Represented characters| |------|-----------|-------| @@ -167,8 +167,9 @@ Pattern files contain Named Patterns which can be used within Templates. TDG com |`tdg -t 'Letters <<\L{2,20}>> and Numbers <<\d{2,12}>>'`|Produces items like|*'Letters SY and Numbers 38644533833'*| |`tdg -t 'Hi there <<\L\v{0,2}\l{0,2}\v \L\v{0,2}\l{0,2}\v{0,2}\l{0,2}\l>> how are you doing? Your SSN is <<[1-9]\d\d-\d\d-\d\d\d\d>>.' -c 100`|Input can contain several placeholders. Produces 100 items like|*'Hi there Reue Emvue how are you doing?
Your SSN is 112-91-0458.'*| |`tdg -t '<<[1-9]\d\d-\d\d-\d\d\d\d>>' -c 100`|Generate 100 SSN like values and output to console window. Produces 100 items like|*'549-93-9041'*| -|`tdg -t 'Hi there <<\L\v\l\v \L\v\l\l\v\v\l\l\v>> how are you doing?' -c 100 -o C:\test1.txt`|Generate 100 strings with random name like values and output to file. Produces 100 items like|*'Ruja Nuqaeiqfo'*| -|`tdg -t '<>'`|Produces the following output:|*'Letters svoLxlK and Numbers 71697 -'*| +|`tdg -t 'Hi there <<\L\v\l\v \L\v\l\l\v\v\l\l\v>> how are you doing?' -c 100 -o C:\test1.txt`|Generate 100 strings with random name like values and output to file. Produces 100 items like|*'Ruja Nuqaeiqfo how are you doing?'*| +|`tdg -t '<>'`|Produces the following output:|*'Letters svoLxlK and Numbers 71697'*| -## This README was generated using the generator. See the unit tests for other examples. +### Checkout the Examples folder for some further items and ideas. + +## This README was generated using the tdg. See the unit tests for other examples. diff --git a/examples/RandomColouredDivs.html b/examples/RandomColouredDivs.html new file mode 100644 index 0000000..9e15cd8 --- /dev/null +++ b/examples/RandomColouredDivs.html @@ -0,0 +1,2028 @@ + + + + + + + + + +

+Generated with the following command 'tdg -i .\RandomColouredDivs.template -o RandomColouredDivs.html' +

+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+ + diff --git a/examples/RandomColouredDivs.template b/examples/RandomColouredDivs.template new file mode 100644 index 0000000..e596c8c --- /dev/null +++ b/examples/RandomColouredDivs.template @@ -0,0 +1,28 @@ +<#{"seed":100}#> + + + + + + + + +

+Generated with the following command 'tdg -i .\RandomColouredDivs.template -o RandomColouredDivs.html' +

+
+ + <<(
\n){2000}>> + +
+ + \ No newline at end of file diff --git a/make.ps1 b/make.ps1 index 792b926..110bb8b 100644 --- a/make.ps1 +++ b/make.ps1 @@ -79,7 +79,7 @@ function test{ Write-host "TESTING FAILED!" -foregroundcolor:red $lastResult = $false } - $failedContent = ($content -match "^Failed") + $failedContent = ($content -match "Failed") $failedCount = $failedContent.Count if($failedCount -gt 0) { @@ -90,6 +90,18 @@ function test{ { write-host $line -foregroundcolor:red } + $failedContent = ($content -match "Not Runnable") + $failedCount = $failedContent.Count + if($failedCount -gt 0) + { + Write-host "TESTING FAILED!" -foregroundcolor:red + $lastResult = $false + } + Foreach ($line in $failedContent) + { + write-host $line -foregroundcolor:red + } + if($lastResult -eq $False){ exit } diff --git a/src/DataGenerator/gk.DataGenerator.CommandLine/CommandLineArgs.cs b/src/DataGenerator/gk.DataGenerator.CommandLine/CommandLineArgs.cs index ca284f9..8103697 100644 --- a/src/DataGenerator/gk.DataGenerator.CommandLine/CommandLineArgs.cs +++ b/src/DataGenerator/gk.DataGenerator.CommandLine/CommandLineArgs.cs @@ -35,7 +35,7 @@ internal class CommandLineArgs [Option('v', "verbose", DefaultValue = false, HelpText = "Verbose output including debug and performance information.", Required = false)] public bool Verbose { get; set; } - + [Option('n', "namedpatterns", DefaultValue = "", HelpText = "A list of ';' seperated file paths containing named patterns to be used in addition to default.tdg-patterns.", Required = false)] public string NamedPatterns { get; set; } diff --git a/src/DataGenerator/gk.DataGenerator.CommandLine/Program.cs b/src/DataGenerator/gk.DataGenerator.CommandLine/Program.cs index e200b43..3ee75ac 100644 --- a/src/DataGenerator/gk.DataGenerator.CommandLine/Program.cs +++ b/src/DataGenerator/gk.DataGenerator.CommandLine/Program.cs @@ -14,7 +14,8 @@ internal class Program private static void Main(string[] args) { var cla = new CommandLineArgs(); - Stopwatch sw = null; + Stopwatch sw = sw = new Stopwatch(); + sw.Start(); #if DEBUG Debugger.Launch(); @@ -33,12 +34,8 @@ private static void Main(string[] args) Console.Write(cla.GetPatternUsage()); return; } - - if (cla.Verbose) - { - sw = new Stopwatch(); - sw.Start(); - } + + if(cla.Verbose)Console.WriteLine("{0} - "); if (cla.ListNamedPatterns) { diff --git a/src/DataGenerator/gk.DataGenerator/Generators/AlphaNumericGenerator.cs b/src/DataGenerator/gk.DataGenerator/Generators/AlphaNumericGenerator.cs index e0cff6a..2466b64 100644 --- a/src/DataGenerator/gk.DataGenerator/Generators/AlphaNumericGenerator.cs +++ b/src/DataGenerator/gk.DataGenerator/Generators/AlphaNumericGenerator.cs @@ -29,9 +29,9 @@ public static class AlphaNumericGenerator private const string _ShortHand_d = _AllNumbers; // \d private const string _ShortHand_W = _AllNonWhitespaceNonAlphaNumericCharacters + " "; // \W private const string _ShortHand_w = _AllLetters + _AllNumbers + "_"; // \w - private const string _ShortHand_S = _AllWhitespaceCharacters; // \S - private const string _ShortHand_s = _AllLetters + _AllNumbers + _AllNonWhitespaceNonAlphaNumericCharacters; // \s - + private const string _ShortHand_s = _AllWhitespaceCharacters; // \s + private const string _ShortHand_S = _AllLetters + _AllNumbers + _AllNonWhitespaceNonAlphaNumericCharacters; // \S + private const string _Config_Start = "<#"; private const string _Config_End = "#>"; diff --git a/src/DataGenerator/gk.DataGeneratorTests/TextTests.cs b/src/DataGenerator/gk.DataGeneratorTests/TextTests.cs index 30b1ddc..aa78edb 100644 --- a/src/DataGenerator/gk.DataGeneratorTests/TextTests.cs +++ b/src/DataGenerator/gk.DataGeneratorTests/TextTests.cs @@ -14,7 +14,7 @@ namespace gk.DataGeneratorTests [TestClass] [ExcludeFromCodeCoverage] [DeploymentItem(@"..\templates\README.template.md")] - [DeploymentItem(@"tdg-patterns\default.tdg-pattern")] + //[DeploymentItem(@".\src\DataGenerator\gk.DataGenerator.CommandLine\tdg-patterns\default.tdg-pattern", "tdg-test")] public class TextTests { [TestMethod] @@ -26,7 +26,6 @@ public void Documentation_Builder() var text = AlphaNumericGenerator.GenerateFromTemplate(template); Console.WriteLine(text); - } #region Template diff --git a/src/templates/README.template.md b/src/templates/README.template.md index ef21069..7faa673 100644 --- a/src/templates/README.template.md +++ b/src/templates/README.template.md @@ -25,7 +25,7 @@ A library and command line tool that can be used to generate data for testing, t If you are familiar with Regular Expressions then most of the syntax used will be familiar but there are significant differences in place given that regex is used to match a string against a pattern. The generator instead uses simple patterns of symbols to produce strings, because of the difference in usage the syntaxes cannot match up entirely. Patterns define what the generated values will be and can be composed using text and symbols. Sections of the pattern can be repeated a specific number of times (they can also be repeated a random number of times by providing a min and max). Patterns can also include alternate items that will be randomly selected, helping to produce relatively complicated outputs. ### Symbols (Character Classes) -The following symbols are shorthand tokens which you can use in your generation patterns. They follow most of the (Perl/Tcl)[http://en.wikipedia.org/wiki/Regular_expression#Character_classes] shorthand classifications but because our focus is on text production rather than searching/matching we have extended things a little with a few more shorthand items. +The following symbols are shorthand tokens which you can use in your generation patterns. They follow most of the [Perl/Tcl](http://en.wikipedia.org/wiki/Regular_expression#Character_classes) shorthand classifications but because our focus is on text production rather than searching/matching we have extended things a little with a few more shorthand items. |Symbol|Description|Represented characters| |------|-----------|-------| @@ -167,7 +167,9 @@ Pattern files contain Named Patterns which can be used within Templates. TDG com |`tdg -t 'Letters \<<\L{2,20}>> and Numbers \<<\d{2,12}>>'`|Produces items like|*'Letters <<\L{2,20}>> and Numbers <<\d{2,12}>>'*| |`tdg -t 'Hi there \<<\L\v{0,2}\l{0,2}\v \L\v{0,2}\l{0,2}\v{0,2}\l{0,2}\l>> how are you doing? Your SSN is \<<[1-9]\d\d-\d\d-\d\d\d\d>>.' -c 100`|Input can contain several placeholders. Produces 100 items like|*'Hi there <<\L\v{0,2}\l{0,2}\v \L\v{0,2}\l{0,2}\v{0,2}\l{0,2}\l>> how are you doing?
Your SSN is <<[1-9]\d\d-\d\d-\d\d\d\d>>.'*| |`tdg -t '\<<[1-9]\d\d-\d\d-\d\d\d\d>>' -c 100`|Generate 100 SSN like values and output to console window. Produces 100 items like|*'<<[1-9]\d\d-\d\d-\d\d\d\d>>'*| -|`tdg -t 'Hi there \<<\L\v\l\v \L\v\l\l\v\v\l\l\v>> how are you doing?' -c 100 -o C:\test1.txt`|Generate 100 strings with random name like values and output to file. Produces 100 items like|*'<<\L\v\l\v \L\v\l\l\v\v\l\l\v>>'*| -|`tdg -t '\<>'`|Produces the following output:|*'<>'*| +|`tdg -t 'Hi there \<<\L\v\l\v \L\v\l\l\v\v\l\l\v>> how are you doing?' -c 100 -o C:\test1.txt`|Generate 100 strings with random name like values and output to file. Produces 100 items like|*'<<\L\v\l\v \L\v\l\l\v\v\l\l\v>> how are you doing?'*| +|`tdg -t '\<>'`|Produces the following output:|*'<>'*| -## This README was generated using the generator. See the unit tests for other examples. \ No newline at end of file +### Checkout the Examples folder for some further items and ideas. + +## This README was generated using the tdg. See the unit tests for other examples. \ No newline at end of file From 216b6ab923c3df92808c75f84f97c670d297499f Mon Sep 17 00:00:00 2001 From: Gary Kenneally Date: Thu, 9 Apr 2015 15:59:13 +0100 Subject: [PATCH 4/6] 100% unit test coverage, again --- src/DataGenerator/gk.DataGeneratorTests/TextTests.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/DataGenerator/gk.DataGeneratorTests/TextTests.cs b/src/DataGenerator/gk.DataGeneratorTests/TextTests.cs index aa78edb..f23f9d5 100644 --- a/src/DataGenerator/gk.DataGeneratorTests/TextTests.cs +++ b/src/DataGenerator/gk.DataGeneratorTests/TextTests.cs @@ -14,7 +14,7 @@ namespace gk.DataGeneratorTests [TestClass] [ExcludeFromCodeCoverage] [DeploymentItem(@"..\templates\README.template.md")] - //[DeploymentItem(@".\src\DataGenerator\gk.DataGenerator.CommandLine\tdg-patterns\default.tdg-pattern", "tdg-test")] + [DeploymentItem(@".\default.tdg-pattern")] public class TextTests { [TestMethod] @@ -1052,6 +1052,11 @@ public void Can_Generate_All_Symbols() Console.WriteLine(@"'{0}' produced '{1}'", pattern, text); StringAssert.Matches(text, new Regex(@"^.$")); + pattern = @"\a"; + text = AlphaNumericGenerator.GenerateFromPattern(pattern); + Console.WriteLine(@"'{0}' produced '{1}'", pattern, text); + StringAssert.Matches(text, new Regex(@"^[A-Za-z]$")); + pattern = @"\W"; text = AlphaNumericGenerator.GenerateFromPattern(pattern); Console.WriteLine(@"'{0}' produced '{1}'", pattern, text); @@ -1112,6 +1117,11 @@ public void Can_Generate_All_Symbols() Console.WriteLine(@"'{0}' produced '{1}'", pattern, text.ToLiteral()); StringAssert.Matches(text, new Regex(@"^\t$")); + pattern = @"\n"; + text = AlphaNumericGenerator.GenerateFromPattern(pattern); + Console.WriteLine(@"'{0}' produced '{1}'", pattern, text.ToLiteral()); + StringAssert.Matches(text, new Regex(@"^\n$")); + pattern = @"\\"; text = AlphaNumericGenerator.GenerateFromPattern(pattern); Console.WriteLine(@"'{0}' produced '{1}'", pattern, text.ToLiteral()); From 805cb0a0d7b0fe6ba5ae3ef24902aab10f0394f2 Mon Sep 17 00:00:00 2001 From: Gary Kenneally Date: Thu, 9 Apr 2015 16:55:45 +0100 Subject: [PATCH 5/6] Version 3.5 --- VERSION | Bin 16 -> 16 bytes releases/tdg.3.4.2.0.nupkg | Bin 92195 -> 92554 bytes .../Generators/AlphaNumericGenerator.cs | 5 ++++- .../gk.DataGeneratorTests/TextTests.cs | 7 ++++++- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 6ccfdb88ee3961984d8d7a9df6ec2597e32854cf..fe9a89e263c3e94311d619feca7fbb0f74ff821d 100644 GIT binary patch literal 16 ScmezW&zM1v!4!xMz!(52jss8t literal 16 UcmezW&zM1v!32nnfY^Wm04b0IQ2+n{ diff --git a/releases/tdg.3.4.2.0.nupkg b/releases/tdg.3.4.2.0.nupkg index 7a7c13adc8bfaf2c736172fd588f4742a9dfe81c..329015c5eb08b9b7e3412822cef74d5e48ecb823 100644 GIT binary patch delta 29593 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 delta 29276 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 Date: Thu, 9 Apr 2015 17:21:08 +0100 Subject: [PATCH 6/6] Text changes --- releases/tdg.3.4.2.0.nupkg | Bin 92554 -> 92637 bytes .../CommandLineArgs.cs | 30 +++++++----------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/releases/tdg.3.4.2.0.nupkg b/releases/tdg.3.4.2.0.nupkg index 329015c5eb08b9b7e3412822cef74d5e48ecb823..5c449f270c9fe6e6c4fbce9b311d299caa575217 100644 GIT binary patch delta 24448 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 delta 24356 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 kbi74AGchoLurP|r9}^j;Cnhn9Oh2B>'"); - help.AddPostOptionsLine("\t tdg -t '<>' -c 10"); - help.AddPostOptionsLine("\t tdg -t '<>' -o 'c:\\test.txt' -c 10"); + help.AddPostOptionsLine("\t tdg -t '<<\\L\\L>>'"); + help.AddPostOptionsLine("\t tdg -t '<<\\L\\L>>' -c 10"); + help.AddPostOptionsLine("\t tdg -t '<<\\L\\L>>' -o 'c:\\test.txt' -c 10"); help.AddPostOptionsLine("\t tdg -i 'c:\\input.txt' -o 'c:\\test.txt' -c 10"); - help.AddPostOptionsLine("Either a Template (-t), Pattern (-p) or input File (-i) value must be provided as input."); + help.AddPostOptionsLine("Either a template (-t), pattern (-p) or input file (-i) value must be provided as input."); help.AddOptions(this); return help; @@ -84,13 +77,14 @@ public string GetPatternUsage() sb.AppendLine("The following symbols can be used within a pattern to produce the desired output."); sb.AppendLine("\t\\. - A single random character of any type."); + sb.AppendLine("\t\\a - A single random upper-case or lower-case letter."); sb.AppendLine("\t\\W - A single random character from the following list ' .,;:'\"!&?£€$%^<>{}*+-=\\@#|~/'."); - sb.AppendLine("\t\\w - A single random upper-case or lower-case letter."); - sb.AppendLine("\t\\L - A single random upper-case Letter."); + sb.AppendLine("\t\\w - A single random upper-case, lower-case letter or number."); + sb.AppendLine("\t\\L - A single random upper-case letter."); sb.AppendLine("\t\\l - A single random lower-case letter."); sb.AppendLine("\t\\V - A single random upper-case Vowel."); sb.AppendLine("\t\\v - A single random lower-case vowel."); - sb.AppendLine("\t\\C - A single random upper-case Consonant."); + sb.AppendLine("\t\\C - A single random upper-case consonant."); sb.AppendLine("\t\\c - A single random lower-case consonant."); sb.AppendLine("\t\\D - A single random non number character."); sb.AppendLine("\t\\d - A single random number, 1-9."); @@ -106,9 +100,9 @@ public string GetPatternUsage() sb.AppendLine("Patterns and normal text can be combined in templates"); sb.AppendLine("Template usage"); - sb.AppendLine("\ttdg -t '<>'"); - sb.AppendLine("\ttdg -t '<>'"); - sb.AppendLine("\ttdg -t '<>'"); + sb.AppendLine("\ttdg -t 'Text containing a <<(\\L)>> pattern'"); + sb.AppendLine("\ttdg -t 'Text containing a <<(\\L){5}>> repeating pattern'"); + sb.AppendLine("\ttdg -t 'Text containing a <<(\\L){10,20}>> repeating pattern between 10 and 20 upper-case characters'"); sb.AppendLine("View the Readme document for further examples"); return sb.ToString();