trackler 2.2.1.77 → 2.2.1.78

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/transpose/canonical-data.json +94 -116
  4. data/tracks/bash/config/maintainers.json +11 -1
  5. data/tracks/clojure/config.json +10 -2
  6. data/tracks/clojure/exercises/reverse-string/README.md +14 -0
  7. data/tracks/clojure/exercises/reverse-string/project.clj +4 -0
  8. data/tracks/clojure/exercises/reverse-string/src/example.clj +5 -0
  9. data/tracks/clojure/exercises/reverse-string/src/reverse_string.clj +5 -0
  10. data/tracks/clojure/exercises/reverse-string/test/reverse_string_test.clj +18 -0
  11. data/tracks/clojure/exercises/say/README.md +70 -0
  12. data/tracks/clojure/exercises/{two-fer → say}/project.clj +3 -3
  13. data/tracks/clojure/exercises/say/src/example.clj +9 -0
  14. data/tracks/clojure/exercises/say/src/say.clj +5 -0
  15. data/tracks/clojure/exercises/say/test/say_test.clj +48 -0
  16. data/tracks/coffeescript/docs/ABOUT.md +4 -9
  17. data/tracks/coffeescript/docs/INSTALLATION.md +2 -2
  18. data/tracks/erlang/exercises/pangram/rebar.config +1 -1
  19. data/tracks/erlang/exercises/pangram/src/example.erl +2 -3
  20. data/tracks/erlang/exercises/pangram/test/pangram_tests.erl +12 -13
  21. data/tracks/fsharp/exercises/grep/Example.fs +16 -20
  22. data/tracks/fsharp/exercises/grep/GrepTest.fs +154 -233
  23. data/tracks/fsharp/generators/Common.fs +7 -2
  24. data/tracks/fsharp/generators/Exercise.fs +51 -16
  25. data/tracks/fsharp/generators/Formatting.fs +13 -6
  26. data/tracks/fsharp/generators/Generators.fs +44 -14
  27. data/tracks/fsharp/generators/Rendering.fs +8 -1
  28. data/tracks/fsharp/generators/Templates/Generators/_GrepSetup.liquid +37 -0
  29. data/tracks/fsharp/generators/Templates/_TestClass.liquid +9 -3
  30. data/tracks/fsharp/generators/Templates/{_TestMethod.liquid → _TestFunction.liquid} +0 -0
  31. data/tracks/fsharp/generators/Templates/{_TestMethodBody.liquid → _TestFunctionBody.liquid} +0 -0
  32. data/tracks/fsharp/generators/Templates/_TestMember.liquid +3 -0
  33. data/tracks/fsharp/generators/Templates/_TestMemberBody.liquid +4 -0
  34. data/tracks/fsharp/generators/Templates/_TestModule.liquid +17 -0
  35. data/tracks/go/config.json +24 -0
  36. data/tracks/go/exercises/acronym/.meta/gen.go +5 -3
  37. data/tracks/go/exercises/acronym/acronym.go +0 -2
  38. data/tracks/go/exercises/acronym/cases_test.go +2 -2
  39. data/tracks/go/exercises/acronym/example.go +2 -3
  40. data/tracks/go/exercises/all-your-base/.meta/gen.go +9 -7
  41. data/tracks/go/exercises/all-your-base/cases_test.go +2 -2
  42. data/tracks/go/exercises/allergies/.meta/gen.go +10 -6
  43. data/tracks/go/exercises/allergies/cases_test.go +2 -2
  44. data/tracks/go/exercises/anagram/.meta/gen.go +7 -5
  45. data/tracks/go/exercises/anagram/cases_test.go +2 -2
  46. data/tracks/go/exercises/armstrong-numbers/.meta/gen.go +54 -0
  47. data/tracks/go/exercises/armstrong-numbers/armstrong_test.go +12 -0
  48. data/tracks/go/exercises/armstrong-numbers/cases_test.go +52 -0
  49. data/tracks/go/exercises/armstrong-numbers/example.go +24 -0
  50. data/tracks/go/exercises/binary-search/.meta/gen.go +7 -5
  51. data/tracks/go/exercises/binary-search/cases_test.go +2 -2
  52. data/tracks/go/exercises/book-store/.meta/gen.go +5 -3
  53. data/tracks/go/exercises/book-store/cases_test.go +2 -2
  54. data/tracks/go/exercises/connect/example.go +4 -5
  55. data/tracks/go/exercises/dominoes/.meta/gen.go +61 -0
  56. data/tracks/go/exercises/dominoes/.meta/hints.md +29 -0
  57. data/tracks/go/exercises/dominoes/README.md +67 -0
  58. data/tracks/go/exercises/dominoes/cases_test.go +72 -0
  59. data/tracks/go/exercises/dominoes/dominoes_test.go +106 -0
  60. data/tracks/go/exercises/dominoes/example.go +146 -0
  61. data/tracks/go/exercises/ledger/example.go +1 -1
  62. data/tracks/groovy/.gitignore +3 -0
  63. data/tracks/groovy/.travis.yml +10 -1
  64. data/tracks/groovy/bin/prepeare_exercise_builds.groovy +77 -0
  65. data/tracks/groovy/build.gradle +25 -0
  66. data/tracks/groovy/exercises/difference-of-squares/Example.groovy +3 -3
  67. data/tracks/groovy/exercises/gigasecond/GigasecondSpec.groovy +3 -3
  68. data/tracks/groovy/exercises/linked-list/{DoubleLinkedList.groovy → LinkedList.groovy} +0 -0
  69. data/tracks/groovy/exercises/linked-list/{DoubleLinkedListSpec.groovy → LinkedListSpec.groovy} +0 -0
  70. data/tracks/groovy/exercises/linked-list/README.md +1 -1
  71. data/tracks/groovy/gradle/wrapper/gradle-wrapper.jar +0 -0
  72. data/tracks/groovy/gradle/wrapper/gradle-wrapper.properties +6 -0
  73. data/tracks/groovy/gradlew +172 -0
  74. data/tracks/groovy/gradlew.bat +84 -0
  75. data/tracks/groovy/settings.gradle +9 -0
  76. data/tracks/ocaml/exercises/acronym/.merlin +1 -1
  77. data/tracks/ocaml/exercises/all-your-base/.merlin +1 -1
  78. data/tracks/ocaml/exercises/anagram/.merlin +1 -1
  79. data/tracks/ocaml/exercises/atbash-cipher/.merlin +1 -1
  80. data/tracks/ocaml/exercises/beer-song/.merlin +1 -1
  81. data/tracks/ocaml/exercises/binary-search/.merlin +1 -1
  82. data/tracks/ocaml/exercises/bob/.merlin +1 -1
  83. data/tracks/ocaml/exercises/bowling/.merlin +1 -1
  84. data/tracks/ocaml/exercises/change/.merlin +1 -1
  85. data/tracks/ocaml/exercises/difference-of-squares/.merlin +1 -1
  86. data/tracks/ocaml/exercises/etl/.merlin +1 -1
  87. data/tracks/ocaml/exercises/forth/.merlin +1 -1
  88. data/tracks/ocaml/exercises/grade-school/.merlin +1 -1
  89. data/tracks/ocaml/exercises/hamming/.merlin +1 -1
  90. data/tracks/ocaml/exercises/hangman/.merlin +1 -1
  91. data/tracks/ocaml/exercises/hello-world/.merlin +1 -1
  92. data/tracks/ocaml/exercises/hexadecimal/.merlin +1 -1
  93. data/tracks/ocaml/exercises/leap/.merlin +1 -1
  94. data/tracks/ocaml/exercises/list-ops/.merlin +1 -1
  95. data/tracks/ocaml/exercises/luhn/.merlin +1 -1
  96. data/tracks/ocaml/exercises/meetup/.merlin +1 -1
  97. data/tracks/ocaml/exercises/minesweeper/.merlin +1 -1
  98. data/tracks/ocaml/exercises/nucleotide-count/.merlin +1 -1
  99. data/tracks/ocaml/exercises/phone-number/.merlin +1 -1
  100. data/tracks/ocaml/exercises/prime-factors/.merlin +1 -1
  101. data/tracks/ocaml/exercises/raindrops/.merlin +1 -1
  102. data/tracks/ocaml/exercises/react/.merlin +1 -1
  103. data/tracks/ocaml/exercises/rectangles/.merlin +1 -1
  104. data/tracks/ocaml/exercises/rna-transcription/.merlin +1 -1
  105. data/tracks/ocaml/exercises/run-length-encoding/.merlin +1 -1
  106. data/tracks/ocaml/exercises/say/.merlin +1 -1
  107. data/tracks/ocaml/exercises/space-age/.merlin +1 -1
  108. data/tracks/ocaml/exercises/triangle/.merlin +1 -1
  109. data/tracks/ocaml/exercises/word-count/.merlin +1 -1
  110. data/tracks/ocaml/exercises/zipper/.merlin +1 -1
  111. data/tracks/typescript/config/maintainers.json +2 -2
  112. metadata +37 -12
  113. data/tracks/clojure/exercises/two-fer/README.md +0 -19
  114. data/tracks/clojure/exercises/two-fer/src/example.clj +0 -5
  115. data/tracks/clojure/exercises/two-fer/src/two_fer.clj +0 -5
  116. data/tracks/clojure/exercises/two-fer/test/two_fer_test.clj +0 -12
  117. data/tracks/erlang/exercises/pangram/include/exercism.hrl +0 -11
@@ -1,4 +1,4 @@
1
- (defproject two-fer "0.1.0-SNAPSHOT"
2
- :description "two-fer exercise."
3
- :url "https://github.com/exercism/clojure/tree/master/exercises/two-fer"
1
+ (defproject say "0.1.0-SNAPSHOT"
2
+ :description "say exercise."
3
+ :url "https://github.com/exercism/clojure/tree/master/exercises/say"
4
4
  :dependencies [[org.clojure/clojure "1.8.0"]])
@@ -0,0 +1,9 @@
1
+ (ns say
2
+ (:require [clojure.pprint :as pp]
3
+ [clojure.string :as s]))
4
+
5
+ (defn number [input]
6
+ (if
7
+ (or (< input 0) (> input 999999999999))
8
+ (throw (IllegalArgumentException. "Out of range"))
9
+ (s/replace (pp/cl-format nil "~R" input) #"," "")))
@@ -0,0 +1,5 @@
1
+ (ns say)
2
+
3
+ (defn number [] ;; <- arglist goes here
4
+ ;; your code goes here
5
+ )
@@ -0,0 +1,48 @@
1
+ (ns say-test
2
+ (:require [clojure.test :refer [deftest is]]
3
+ say))
4
+
5
+ (deftest zero-test
6
+ (is (= "zero" (say/number 0))))
7
+
8
+ (deftest one-test
9
+ (is (= "one" (say/number 1))))
10
+
11
+ (deftest fourteen-test
12
+ (is (= "fourteen" (say/number 14))))
13
+
14
+ (deftest twenty-test
15
+ (is (= "twenty" (say/number 20))))
16
+
17
+ (deftest twenty-two-test
18
+ (is (= "twenty-two" (say/number 22))))
19
+
20
+ (deftest one-hundred-test
21
+ (is (= "one hundred" (say/number 100))))
22
+
23
+ (deftest one-hundred-twenty-three-test
24
+ (is (= "one hundred twenty-three" (say/number 123))))
25
+
26
+ (deftest one-thousand-test
27
+ (is (= "one thousand" (say/number 1000))))
28
+
29
+ (deftest one-thousand-two-hundred-thirty-four-test
30
+ (is (= "one thousand two hundred thirty-four" (say/number 1234))))
31
+
32
+ (deftest one-million-test
33
+ (is (= "one million" (say/number 1000000))))
34
+
35
+ (deftest one-million-two-thousand-three-hundred-forty-five-test
36
+ (is (= "one million two thousand three hundred forty-five" (say/number 1002345))))
37
+
38
+ (deftest one-billion-test
39
+ (is (= "one billion" (say/number 1000000000))))
40
+
41
+ (deftest a-big-number-test
42
+ (is (= "nine hundred eighty-seven billion six hundred fifty-four million three hundred twenty-one thousand one hundred twenty-three" (say/number 987654321123))))
43
+
44
+ (deftest below-zero-is-out-of-range-test
45
+ (is (thrown? IllegalArgumentException (say/number -1))))
46
+
47
+ (deftest numbers-above-999999999999-out-of-range-test
48
+ (is (thrown? IllegalArgumentException (say/number 1000000000000))))
@@ -1,14 +1,9 @@
1
1
  JavaScript is a great language, but not everyone likes writing in it. Thus, people and organizations have started to write languages that transpile (transpiling keeps the same level of abstraction, compiling decreases the level of abstraction) into JavaScript, that they feel are nicer to write in than JavaScript. CoffeeScript is one example, another is Microsoft's TypeScript.
2
2
 
3
- What are the specific advantages of CoffeeScript? From [coffeescript.org](http://www.coffeescript.org):
3
+ CoffeeScript is a little language that compiles into JavaScript. Underneath that awkward Java-esque patina, JavaScript has always had a gorgeous heart. CoffeeScript is an attempt to expose the good parts of JavaScript in a simple way.
4
4
 
5
- > CoffeeScript is a little language that compiles into JavaScript. Underneath that awkward Java-esque patina,
6
- > JavaScript has always had a gorgeous heart. CoffeeScript is an attempt to expose the good parts of JavaScript
7
- > in a simple way.
8
- >
9
- > The golden rule of CoffeeScript is: "It's just JavaScript". The code compiles one-to-one into the equivalent JS,
10
- > and there is no interpretation at runtime. You can use any existing JavaScript library seamlessly from CoffeeScript
11
- > (and vice-versa). The compiled output is readable and pretty-printed, will work in every JavaScript runtime, and tends
12
- > to run as fast or faster than the equivalent handwritten JavaScript.
5
+ The golden rule of CoffeeScript is: "It's just JavaScript". The code compiles one-to-one into the equivalent JS, and there is no interpretation at runtime. You can use any existing JavaScript library seamlessly from CoffeeScript (and vice-versa). The compiled output is readable and pretty-printed, will work in every JavaScript runtime, and tends to run as fast or faster than the equivalent handwritten JavaScript.
13
6
 
14
7
  You should learn CoffeeScript if you like programming in JavaScript, and want to experiment with a different way to write it. With transpiled versions of JavaScript (ECMA 2015, TypeScript, etc) becoming more popular, this is a valuable skill for a coder.
8
+
9
+ _(Info taken from [coffeescript.org](http://www.coffeescript.org))_
@@ -7,13 +7,13 @@
7
7
  Install `jasmine-node` and `coffee`:
8
8
 
9
9
  ```bash
10
- $ npm install jasmine-node coffee -g
10
+ $ npm install jasmine-node coffeescript -g
11
11
  ```
12
12
 
13
13
  Depending on your setup, you may need super user privileges to install an `npm` module globally. This is the case if you've used the official installer linked to above. If NPM gives you an error saying you don't have access, add `sudo` to the command above:
14
14
 
15
15
  ```bash
16
- $ sudo npm install jasmine-node coffee -g
16
+ $ sudo npm install jasmine-node coffeescript -g
17
17
  ```
18
18
 
19
19
  If you've used the official installer, your `PATH` should have been automatically configured, but if your shell has trouble locating your globally installed modules--or if you build Node.js from source--update your `PATH` to include the `npm` binaries by adding the following to either `~/.bash_profile` or `~/.zshrc`:
@@ -1,7 +1,7 @@
1
1
  %% Erlang compiler options
2
2
  {erl_opts, [debug_info]}.
3
3
 
4
- {deps, []}.
4
+ {deps, [{erl_exercism, "0.1.1"}]}.
5
5
 
6
6
  {dialyzer, [
7
7
  {warnings, [underspecs, no_return]},
@@ -3,9 +3,8 @@
3
3
  -export([is_pangram/1, test_version/0]).
4
4
 
5
5
  is_pangram(Sentence) ->
6
- Alpha = "abcdefghijklmnopqrstuvwxyz",
7
- Lower = string:to_lower(Sentence),
6
+ Lewand = "zqxjkvbpygfwmucldrhsnioate", % least common letter first, most common last
8
7
 
9
- lists:all(fun (A) -> lists:any(fun (L) -> A == L end, Lower) end, Alpha).
8
+ lists:all(fun (A) -> lists:any(fun (L) -> A == string:to_lower(L) end, Sentence) end, Lewand).
10
9
 
11
10
  test_version() -> 1.
@@ -1,38 +1,37 @@
1
1
  -module(pangram_tests).
2
2
 
3
- -define(TESTED_MODULE, (sut(pangram))).
4
- -define(TEST_VERSION, 1).
5
- -include("exercism.hrl").
3
+ -include_lib("erl_exercism/include/exercism.hrl").
4
+ -include_lib("eunit/include/eunit.hrl").
6
5
 
7
6
 
8
7
  % test cases adapted from `x-common//canonical-data.json` @ version: 1.3.0
9
8
 
10
9
  empty_sentence_test() ->
11
- ?assertNot(?TESTED_MODULE:is_pangram("")).
10
+ ?assertNot(pangram:is_pangram("")).
12
11
 
13
12
  perfect_lower_case_pangram_test() ->
14
- ?assert(?TESTED_MODULE:is_pangram("abcdefghijklmnopqrstuvwxyz")).
13
+ ?assert(pangram:is_pangram("abcdefghijklmnopqrstuvwxyz")).
15
14
 
16
15
  pangram_with_only_lower_case_test() ->
17
- ?assert(?TESTED_MODULE:is_pangram("the quick brown fox jumps over the lazy dog")).
16
+ ?assert(pangram:is_pangram("the quick brown fox jumps over the lazy dog")).
18
17
 
19
18
  missing_character_x_test() ->
20
- ?assertNot(?TESTED_MODULE:is_pangram("a quick movement of the enemy will jeopardize five gunboats")).
19
+ ?assertNot(pangram:is_pangram("a quick movement of the enemy will jeopardize five gunboats")).
21
20
 
22
21
  missing_character_h_test() ->
23
- ?assertNot(?TESTED_MODULE:is_pangram("five boxing wizards jump quickly at it")).
22
+ ?assertNot(pangram:is_pangram("five boxing wizards jump quickly at it")).
24
23
 
25
24
  pangram_with_underscores_test() ->
26
- ?assert(?TESTED_MODULE:is_pangram("the_quick_brown_fox_jumps_over_the_lazy_dog")).
25
+ ?assert(pangram:is_pangram("the_quick_brown_fox_jumps_over_the_lazy_dog")).
27
26
 
28
27
  pangram_with_numbers_test() ->
29
- ?assert(?TESTED_MODULE:is_pangram("the 1 quick brown fox jumps over the 2 lazy dogs")).
28
+ ?assert(pangram:is_pangram("the 1 quick brown fox jumps over the 2 lazy dogs")).
30
29
 
31
30
  missing_letters_replaced_by_numbers_test() ->
32
- ?assertNot(?TESTED_MODULE:is_pangram("7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog")).
31
+ ?assertNot(pangram:is_pangram("7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog")).
33
32
 
34
33
  pangram_with_mixed_case_and_punctuation_test() ->
35
- ?assert(?TESTED_MODULE:is_pangram("\"Five quacking Zephyrs jolt my wax bed.\"")).
34
+ ?assert(pangram:is_pangram("\"Five quacking Zephyrs jolt my wax bed.\"")).
36
35
 
37
36
  upper_and_lower_case_characters_are_not_counted_separately_test() ->
38
- ?assertNot(?TESTED_MODULE:is_pangram("the quick brown fox jumps over with lazy FX")).
37
+ ?assertNot(pangram:is_pangram("the quick brown fox jumps over with lazy FX")).
@@ -15,7 +15,7 @@ type Flags =
15
15
  | Invert = 8
16
16
  | MatchEntireLines = 16
17
17
 
18
- let parseFlag =
18
+ let private parseFlag =
19
19
  function
20
20
  | "-n" -> Flags.PrintLineNumbers
21
21
  | "-l" -> Flags.PrintFileNames
@@ -24,20 +24,19 @@ let parseFlag =
24
24
  | "-x" -> Flags.MatchEntireLines
25
25
  | _ -> Flags.None
26
26
 
27
- let parseFlags (flags: string) =
28
- flags.Split ' '
29
- |> Array.fold (fun acc flag -> acc ||| parseFlag flag) Flags.None
27
+ let private parseFlags (flags: string list) =
28
+ List.fold (fun acc flag -> acc ||| parseFlag flag) Flags.None flags
30
29
 
31
- let isMatch pattern (flags: Flags) =
30
+ let private isMatch pattern (flags: Flags) =
32
31
  let pattern' = if flags.HasFlag Flags.MatchEntireLines then sprintf "^%s$" pattern else pattern
33
32
  let options = if flags.HasFlag Flags.CaseInsensitive then RegexOptions.IgnoreCase else RegexOptions.None
34
33
  let regex = Regex(pattern', options)
35
34
 
36
35
  fun text -> regex.IsMatch text <> flags.HasFlag Flags.Invert
37
36
 
38
- let mkLine file index text = { File = file; Number = index + 1; Text = text }
37
+ let private mkLine file index text = { File = file; Number = index + 1; Text = text }
39
38
 
40
- let findMatchingLines pattern flags file =
39
+ let private findMatchingLines pattern flags file =
41
40
  let lineMatches line = isMatch pattern flags line.Text
42
41
 
43
42
  file
@@ -45,36 +44,33 @@ let findMatchingLines pattern flags file =
45
44
  |> Seq.mapi (mkLine file)
46
45
  |> Seq.filter lineMatches
47
46
 
48
- let formatMatchingFile file = sprintf "%s\n" file
49
-
50
- let formatMatchingFiles pattern (flags: Flags) files =
47
+ let private formatMatchingFiles pattern (flags: Flags) files =
51
48
  let hasMatchingLine file = findMatchingLines pattern flags file |> Seq.isEmpty |> not
52
49
 
53
50
  files
54
51
  |> Seq.filter hasMatchingLine
55
- |> Seq.map formatMatchingFile
56
- |> String.Concat
52
+ |> Seq.toList
57
53
 
58
- let formatMatchingLine (flags: Flags) files line =
54
+ let private formatMatchingLine (flags: Flags) files line =
59
55
  let printLineNumbers = flags.HasFlag Flags.PrintLineNumbers
60
56
  let printFileName = List.length files > 1
61
57
 
62
58
  match printLineNumbers, printFileName with
63
- | true, true -> sprintf "%s:%i:%s\n" line.File line.Number line.Text
64
- | true, false -> sprintf "%i:%s\n" line.Number line.Text
65
- | false, true -> sprintf "%s:%s\n" line.File line.Text
66
- | false, false -> sprintf "%s\n" line.Text
59
+ | true, true -> sprintf "%s:%i:%s" line.File line.Number line.Text
60
+ | true, false -> sprintf "%i:%s" line.Number line.Text
61
+ | false, true -> sprintf "%s:%s" line.File line.Text
62
+ | false, false -> sprintf "%s" line.Text
67
63
 
68
- let formatMatchingLines pattern (flags: Flags) files =
64
+ let private formatMatchingLines pattern (flags: Flags) files =
69
65
  let lineMatches = findMatchingLines pattern flags
70
66
  let formatLine = formatMatchingLine flags files
71
67
 
72
68
  files
73
69
  |> Seq.collect lineMatches
74
70
  |> Seq.map formatLine
75
- |> String.Concat
71
+ |> Seq.toList
76
72
 
77
- let grep pattern flagArguments files =
73
+ let grep files flagArguments pattern =
78
74
  let flags = parseFlags flagArguments
79
75
 
80
76
  match flags.HasFlag Flags.PrintFileNames with
@@ -1,12 +1,13 @@
1
+ // This file was auto-generated based on version 1.0.0 of the canonical data.
2
+
1
3
  module GrepTest
2
4
 
3
- open Xunit
4
5
  open FsUnit.Xunit
6
+ open Xunit
7
+ open System.IO
5
8
 
6
9
  open Grep
7
10
 
8
- open System.IO
9
-
10
11
  let iliadFileName = "iliad.txt"
11
12
  let iliadContents =
12
13
  """Achilles sing, O Goddess! Peleus' son;
@@ -17,8 +18,7 @@ And Heroes gave (so stood the will of Jove)
17
18
  To dogs and to all ravening fowls a prey,
18
19
  When fierce dispute had separated once
19
20
  The noble Chief Achilles from the son
20
- Of Atreus, Agamemnon, King of men.
21
- """
21
+ Of Atreus, Agamemnon, King of men."""
22
22
 
23
23
  let midsummerNightFileName = "midsummer-night.txt"
24
24
  let midsummerNightContents =
@@ -28,8 +28,7 @@ Nor how it may concern my modesty,
28
28
  In such a presence here to plead my thoughts;
29
29
  But I beseech your grace that I may know
30
30
  The worst that may befall me in this case,
31
- If I refuse to wed Demetrius.
32
- """
31
+ If I refuse to wed Demetrius."""
33
32
 
34
33
  let paradiseLostFileName = "paradise-lost.txt"
35
34
  let paradiseLostContents =
@@ -40,335 +39,257 @@ With loss of Eden, till one greater Man
40
39
  Restore us, and regain the blissful Seat,
41
40
  Sing Heav'nly Muse, that on the secret top
42
41
  Of Oreb, or of Sinai, didst inspire
43
- That Shepherd, who first taught the chosen Seed
44
- """
45
-
46
- type GrepFixture() =
47
- do
48
- Directory.SetCurrentDirectory(Path.GetTempPath());
49
- File.WriteAllText(iliadFileName, iliadContents)
50
- File.WriteAllText(midsummerNightFileName, midsummerNightContents)
51
- File.WriteAllText(paradiseLostFileName, paradiseLostContents)
42
+ That Shepherd, who first taught the chosen Seed"""
52
43
 
53
- interface System.IDisposable with
54
- member this.Dispose() =
55
- File.Delete(iliadFileName)
56
- File.Delete(midsummerNightFileName)
57
- File.Delete(paradiseLostFileName)
44
+ let createFiles() =
45
+ File.WriteAllText(iliadFileName, iliadContents)
46
+ File.WriteAllText(midsummerNightFileName, midsummerNightContents)
47
+ File.WriteAllText(paradiseLostFileName, paradiseLostContents)
58
48
 
59
- type GrepTest(fixture: GrepFixture) =
60
- interface IClassFixture<GrepFixture>
49
+ type GrepTest() =
61
50
 
62
51
  [<Fact>]
63
52
  member this.``One file, one match, no flags`` () =
53
+ let files = ["iliad.txt"]
54
+ let flags = []
64
55
  let pattern = "Agamemnon"
65
- let flags = ""
66
- let files = [iliadFileName]
67
-
68
- let expected =
69
- "Of Atreus, Agamemnon, King of men.\n"
56
+ let expected = ["Of Atreus, Agamemnon, King of men."]
70
57
 
71
- grep pattern flags files |> should equal expected
58
+ createFiles() |> ignore
59
+ grep files flags pattern |> should equal expected
72
60
 
73
61
  [<Fact(Skip = "Remove to run test")>]
74
62
  member this.``One file, one match, print line numbers flag`` () =
63
+ let files = ["paradise-lost.txt"]
64
+ let flags = ["-n"]
75
65
  let pattern = "Forbidden"
76
- let flags = "-n"
77
- let files = [paradiseLostFileName]
78
-
79
- let expected =
80
- "2:Of that Forbidden Tree, whose mortal tast\n"
66
+ let expected = ["2:Of that Forbidden Tree, whose mortal tast"]
81
67
 
82
- grep pattern flags files |> should equal expected
68
+ createFiles() |> ignore
69
+ grep files flags pattern |> should equal expected
83
70
 
84
71
  [<Fact(Skip = "Remove to run test")>]
85
72
  member this.``One file, one match, case-insensitive flag`` () =
86
- let pattern = "Forbidden"
87
- let flags = "-i"
88
- let files = [paradiseLostFileName]
89
-
90
- let expected =
91
- "Of that Forbidden Tree, whose mortal tast\n"
73
+ let files = ["paradise-lost.txt"]
74
+ let flags = ["-i"]
75
+ let pattern = "FORBIDDEN"
76
+ let expected = ["Of that Forbidden Tree, whose mortal tast"]
92
77
 
93
- grep pattern flags files |> should equal expected
78
+ createFiles() |> ignore
79
+ grep files flags pattern |> should equal expected
94
80
 
95
81
  [<Fact(Skip = "Remove to run test")>]
96
82
  member this.``One file, one match, print file names flag`` () =
83
+ let files = ["paradise-lost.txt"]
84
+ let flags = ["-l"]
97
85
  let pattern = "Forbidden"
98
- let flags = "-l"
99
- let files = [paradiseLostFileName]
100
-
101
- let expected =
102
- sprintf "%s\n" paradiseLostFileName
86
+ let expected = ["paradise-lost.txt"]
103
87
 
104
- grep pattern flags files |> should equal expected
88
+ createFiles() |> ignore
89
+ grep files flags pattern |> should equal expected
105
90
 
106
91
  [<Fact(Skip = "Remove to run test")>]
107
92
  member this.``One file, one match, match entire lines flag`` () =
93
+ let files = ["paradise-lost.txt"]
94
+ let flags = ["-x"]
108
95
  let pattern = "With loss of Eden, till one greater Man"
109
- let flags = "-x"
110
- let files = [paradiseLostFileName]
111
-
112
- let expected =
113
- "With loss of Eden, till one greater Man\n"
114
-
115
- grep pattern flags files |> should equal expected
96
+ let expected = ["With loss of Eden, till one greater Man"]
116
97
 
98
+ createFiles() |> ignore
99
+ grep files flags pattern |> should equal expected
100
+
117
101
  [<Fact(Skip = "Remove to run test")>]
118
102
  member this.``One file, one match, multiple flags`` () =
103
+ let files = ["iliad.txt"]
104
+ let flags = ["-n"; "-i"; "-x"]
119
105
  let pattern = "OF ATREUS, Agamemnon, KIng of MEN."
120
- let files = [iliadFileName]
121
- let flags = "-n -i -x"
122
- let expected =
123
- "9:Of Atreus, Agamemnon, King of men.\n"
106
+ let expected = ["9:Of Atreus, Agamemnon, King of men."]
124
107
 
125
- grep pattern flags files |> should equal expected
108
+ createFiles() |> ignore
109
+ grep files flags pattern |> should equal expected
126
110
 
127
111
  [<Fact(Skip = "Remove to run test")>]
128
112
  member this.``One file, several matches, no flags`` () =
113
+ let files = ["midsummer-night.txt"]
114
+ let flags = []
129
115
  let pattern = "may"
130
- let flags = ""
131
- let files = [midsummerNightFileName]
132
-
133
116
  let expected =
134
- "Nor how it may concern my modesty,\n" +
135
- "But I beseech your grace that I may know\n" +
136
- "The worst that may befall me in this case,\n"
117
+ [ "Nor how it may concern my modesty,";
118
+ "But I beseech your grace that I may know";
119
+ "The worst that may befall me in this case," ]
137
120
 
138
- grep pattern flags files |> should equal expected
121
+ createFiles() |> ignore
122
+ grep files flags pattern |> should equal expected
139
123
 
140
124
  [<Fact(Skip = "Remove to run test")>]
141
125
  member this.``One file, several matches, print line numbers flag`` () =
126
+ let files = ["midsummer-night.txt"]
127
+ let flags = ["-n"]
142
128
  let pattern = "may"
143
- let flags = "-n"
144
- let files = [midsummerNightFileName]
145
-
146
129
  let expected =
147
- "3:Nor how it may concern my modesty,\n" +
148
- "5:But I beseech your grace that I may know\n" +
149
- "6:The worst that may befall me in this case,\n"
130
+ [ "3:Nor how it may concern my modesty,";
131
+ "5:But I beseech your grace that I may know";
132
+ "6:The worst that may befall me in this case," ]
150
133
 
151
- grep pattern flags files |> should equal expected
134
+ createFiles() |> ignore
135
+ grep files flags pattern |> should equal expected
152
136
 
153
137
  [<Fact(Skip = "Remove to run test")>]
154
138
  member this.``One file, several matches, match entire lines flag`` () =
139
+ let files = ["midsummer-night.txt"]
140
+ let flags = ["-x"]
155
141
  let pattern = "may"
156
- let flags = "-x"
157
- let files = [midsummerNightFileName]
158
-
159
- let expected = ""
142
+ let expected: string list = []
160
143
 
161
- grep pattern flags files |> should equal expected
144
+ createFiles() |> ignore
145
+ grep files flags pattern |> should equal expected
162
146
 
163
147
  [<Fact(Skip = "Remove to run test")>]
164
148
  member this.``One file, several matches, case-insensitive flag`` () =
149
+ let files = ["iliad.txt"]
150
+ let flags = ["-i"]
165
151
  let pattern = "ACHILLES"
166
- let flags = "-i"
167
- let files = [iliadFileName]
168
-
169
152
  let expected =
170
- "Achilles sing, O Goddess! Peleus' son;\n" +
171
- "The noble Chief Achilles from the son\n"
153
+ [ "Achilles sing, O Goddess! Peleus' son;";
154
+ "The noble Chief Achilles from the son" ]
172
155
 
173
- grep pattern flags files |> should equal expected
156
+ createFiles() |> ignore
157
+ grep files flags pattern |> should equal expected
174
158
 
175
159
  [<Fact(Skip = "Remove to run test")>]
176
160
  member this.``One file, several matches, inverted flag`` () =
161
+ let files = ["paradise-lost.txt"]
162
+ let flags = ["-v"]
177
163
  let pattern = "Of"
178
- let flags = "-v"
179
- let files = [paradiseLostFileName]
180
-
181
- let expected =
182
- "Brought Death into the World, and all our woe,\n" +
183
- "With loss of Eden, till one greater Man\n" +
184
- "Restore us, and regain the blissful Seat,\n" +
185
- "Sing Heav'nly Muse, that on the secret top\n" +
186
- "That Shepherd, who first taught the chosen Seed\n"
187
-
188
- grep pattern flags files |> should equal expected
189
-
190
- [<Fact(Skip = "Remove to run test")>]
191
- member this.``One file, case-insensitive and entire line flags`` () =
192
- let pattern = "ATREUS"
193
- let files = [iliadFileName]
194
- let flags = "-i -x"
195
- let expected = ""
196
-
197
- grep pattern flags files |> should equal expected
198
-
199
- [<Fact(Skip = "Remove to run test")>]
200
- member this.``One file, case-insensitive and inverted flags`` () =
201
- let pattern = "THE"
202
- let files = [paradiseLostFileName]
203
- let flags = "-i -v"
204
- let expected =
205
- "Of that Forbidden Tree, whose mortal tast\n" +
206
- "With loss of Eden, till one greater Man\n" +
207
- "Of Oreb, or of Sinai, didst inspire\n"
208
-
209
- grep pattern flags files |> should equal expected
164
+ let expected =
165
+ [ "Brought Death into the World, and all our woe,";
166
+ "With loss of Eden, till one greater Man";
167
+ "Restore us, and regain the blissful Seat,";
168
+ "Sing Heav'nly Muse, that on the secret top";
169
+ "That Shepherd, who first taught the chosen Seed" ]
210
170
 
211
- [<Fact(Skip = "Remove to run test")>]
212
- member this.``One file, inverted and entire line flags`` () =
213
- let pattern = "the"
214
- let files = [paradiseLostFileName]
215
- let flags = "-v -x"
216
- let expected =
217
- "Of Mans First Disobedience, and the Fruit\n" +
218
- "Of that Forbidden Tree, whose mortal tast\n" +
219
- "Brought Death into the World, and all our woe,\n" +
220
- "With loss of Eden, till one greater Man\n" +
221
- "Restore us, and regain the blissful Seat,\n" +
222
- "Sing Heav'nly Muse, that on the secret top\n" +
223
- "Of Oreb, or of Sinai, didst inspire\n" +
224
- "That Shepherd, who first taught the chosen Seed\n"
225
-
226
- grep pattern flags files |> should equal expected
171
+ createFiles() |> ignore
172
+ grep files flags pattern |> should equal expected
227
173
 
228
174
  [<Fact(Skip = "Remove to run test")>]
229
- member this.``One file, case-insensitive, inverted and entire line flags`` () =
230
- let pattern = "if i rEFuse To Wed DeMETrius."
231
- let files = [midsummerNightFileName]
232
- let flags = "-i -v -x"
233
- let expected =
234
- "I do entreat your grace to pardon me.\n" +
235
- "I know not by what power I am made bold,\n" +
236
- "Nor how it may concern my modesty,\n" +
237
- "In such a presence here to plead my thoughts;\n" +
238
- "But I beseech your grace that I may know\n" +
239
- "The worst that may befall me in this case,\n"
240
-
241
- grep pattern flags files |> should equal expected
242
-
243
- [<Theory(Skip = "Remove to run test")>]
244
- [<InlineData("")>]
245
- [<InlineData("-n")>]
246
- [<InlineData("-l")>]
247
- [<InlineData("-x")>]
248
- [<InlineData("-i")>]
249
- [<InlineData("-n -l -x -i")>]
250
- member this.``One file, no matches, various flags`` (flags) =
175
+ member this.``One file, no matches, various flags`` () =
176
+ let files = ["iliad.txt"]
177
+ let flags = ["-n"; "-l"; "-x"; "-i"]
251
178
  let pattern = "Gandalf"
252
- let files = [iliadFileName]
253
- let expected = ""
254
-
255
- grep pattern flags files |> should equal expected
179
+ let expected: string list = []
256
180
 
181
+ createFiles() |> ignore
182
+ grep files flags pattern |> should equal expected
183
+
257
184
  [<Fact(Skip = "Remove to run test")>]
258
185
  member this.``Multiple files, one match, no flags`` () =
186
+ let files = ["iliad.txt"; "midsummer-night.txt"; "paradise-lost.txt"]
187
+ let flags = []
259
188
  let pattern = "Agamemnon"
260
- let flags = ""
261
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
262
-
263
- let expected =
264
- sprintf "%s:Of Atreus, Agamemnon, King of men.\n" iliadFileName
189
+ let expected = ["iliad.txt:Of Atreus, Agamemnon, King of men."]
265
190
 
266
- grep pattern flags files |> should equal expected
191
+ createFiles() |> ignore
192
+ grep files flags pattern |> should equal expected
267
193
 
268
194
  [<Fact(Skip = "Remove to run test")>]
269
195
  member this.``Multiple files, several matches, no flags`` () =
196
+ let files = ["iliad.txt"; "midsummer-night.txt"; "paradise-lost.txt"]
197
+ let flags = []
270
198
  let pattern = "may"
271
- let flags = ""
272
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
273
-
274
199
  let expected =
275
- sprintf "%s:Nor how it may concern my modesty,\n" midsummerNightFileName +
276
- sprintf "%s:But I beseech your grace that I may know\n" midsummerNightFileName +
277
- sprintf "%s:The worst that may befall me in this case,\n" midsummerNightFileName
200
+ [ "midsummer-night.txt:Nor how it may concern my modesty,";
201
+ "midsummer-night.txt:But I beseech your grace that I may know";
202
+ "midsummer-night.txt:The worst that may befall me in this case," ]
278
203
 
279
- grep pattern flags files |> should equal expected
204
+ createFiles() |> ignore
205
+ grep files flags pattern |> should equal expected
280
206
 
281
207
  [<Fact(Skip = "Remove to run test")>]
282
208
  member this.``Multiple files, several matches, print line numbers flag`` () =
209
+ let files = ["iliad.txt"; "midsummer-night.txt"; "paradise-lost.txt"]
210
+ let flags = ["-n"]
283
211
  let pattern = "that"
284
- let flags = "-n"
285
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
286
-
287
212
  let expected =
288
- sprintf "%s:5:But I beseech your grace that I may know\n" midsummerNightFileName +
289
- sprintf "%s:6:The worst that may befall me in this case,\n" midsummerNightFileName +
290
- sprintf "%s:2:Of that Forbidden Tree, whose mortal tast\n" paradiseLostFileName +
291
- sprintf "%s:6:Sing Heav'nly Muse, that on the secret top\n" paradiseLostFileName
213
+ [ "midsummer-night.txt:5:But I beseech your grace that I may know";
214
+ "midsummer-night.txt:6:The worst that may befall me in this case,";
215
+ "paradise-lost.txt:2:Of that Forbidden Tree, whose mortal tast";
216
+ "paradise-lost.txt:6:Sing Heav'nly Muse, that on the secret top" ]
292
217
 
293
- grep pattern flags files |> should equal expected
218
+ createFiles() |> ignore
219
+ grep files flags pattern |> should equal expected
294
220
 
295
221
  [<Fact(Skip = "Remove to run test")>]
296
- member this.``Multiple files, several matches, print file names flag`` () =
222
+ member this.``Multiple files, one match, print file names flag`` () =
223
+ let files = ["iliad.txt"; "midsummer-night.txt"; "paradise-lost.txt"]
224
+ let flags = ["-l"]
297
225
  let pattern = "who"
298
- let flags = "-l"
299
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
300
-
301
226
  let expected =
302
- sprintf "%s\n" iliadFileName +
303
- sprintf "%s\n" paradiseLostFileName
227
+ [ "iliad.txt";
228
+ "paradise-lost.txt" ]
304
229
 
305
- grep pattern flags files |> should equal expected
230
+ createFiles() |> ignore
231
+ grep files flags pattern |> should equal expected
306
232
 
307
233
  [<Fact(Skip = "Remove to run test")>]
308
234
  member this.``Multiple files, several matches, case-insensitive flag`` () =
235
+ let files = ["iliad.txt"; "midsummer-night.txt"; "paradise-lost.txt"]
236
+ let flags = ["-i"]
309
237
  let pattern = "TO"
310
- let flags = "-i"
311
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
312
-
313
238
  let expected =
314
- sprintf "%s:Caused to Achaia's host, sent many a soul\n" iliadFileName +
315
- sprintf "%s:Illustrious into Ades premature,\n" iliadFileName +
316
- sprintf "%s:And Heroes gave (so stood the will of Jove)\n" iliadFileName +
317
- sprintf "%s:To dogs and to all ravening fowls a prey,\n" iliadFileName +
318
- sprintf "%s:I do entreat your grace to pardon me.\n" midsummerNightFileName +
319
- sprintf "%s:In such a presence here to plead my thoughts;\n" midsummerNightFileName +
320
- sprintf "%s:If I refuse to wed Demetrius.\n" midsummerNightFileName +
321
- sprintf "%s:Brought Death into the World, and all our woe,\n" paradiseLostFileName +
322
- sprintf "%s:Restore us, and regain the blissful Seat,\n" paradiseLostFileName +
323
- sprintf "%s:Sing Heav'nly Muse, that on the secret top\n" paradiseLostFileName
324
-
325
- grep pattern flags files |> should equal expected
239
+ [ "iliad.txt:Caused to Achaia's host, sent many a soul";
240
+ "iliad.txt:Illustrious into Ades premature,";
241
+ "iliad.txt:And Heroes gave (so stood the will of Jove)";
242
+ "iliad.txt:To dogs and to all ravening fowls a prey,";
243
+ "midsummer-night.txt:I do entreat your grace to pardon me.";
244
+ "midsummer-night.txt:In such a presence here to plead my thoughts;";
245
+ "midsummer-night.txt:If I refuse to wed Demetrius.";
246
+ "paradise-lost.txt:Brought Death into the World, and all our woe,";
247
+ "paradise-lost.txt:Restore us, and regain the blissful Seat,";
248
+ "paradise-lost.txt:Sing Heav'nly Muse, that on the secret top" ]
249
+
250
+ createFiles() |> ignore
251
+ grep files flags pattern |> should equal expected
326
252
 
327
253
  [<Fact(Skip = "Remove to run test")>]
328
254
  member this.``Multiple files, several matches, inverted flag`` () =
255
+ let files = ["iliad.txt"; "midsummer-night.txt"; "paradise-lost.txt"]
256
+ let flags = ["-v"]
329
257
  let pattern = "a"
330
- let flags = "-v"
331
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
332
-
333
258
  let expected =
334
- sprintf "%s:Achilles sing, O Goddess! Peleus' son;\n" iliadFileName +
335
- sprintf "%s:The noble Chief Achilles from the son\n" iliadFileName +
336
- sprintf "%s:If I refuse to wed Demetrius.\n" midsummerNightFileName
259
+ [ "iliad.txt:Achilles sing, O Goddess! Peleus' son;";
260
+ "iliad.txt:The noble Chief Achilles from the son";
261
+ "midsummer-night.txt:If I refuse to wed Demetrius." ]
337
262
 
338
- grep pattern flags files |> should equal expected
263
+ createFiles() |> ignore
264
+ grep files flags pattern |> should equal expected
339
265
 
340
266
  [<Fact(Skip = "Remove to run test")>]
341
267
  member this.``Multiple files, one match, match entire lines flag`` () =
268
+ let files = ["iliad.txt"; "midsummer-night.txt"; "paradise-lost.txt"]
269
+ let flags = ["-x"]
342
270
  let pattern = "But I beseech your grace that I may know"
343
- let flags = "-x"
344
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
345
-
346
- let expected =
347
- sprintf "%s:But I beseech your grace that I may know\n" midsummerNightFileName
348
-
349
- grep pattern flags files |> should equal expected
271
+ let expected = ["midsummer-night.txt:But I beseech your grace that I may know"]
350
272
 
273
+ createFiles() |> ignore
274
+ grep files flags pattern |> should equal expected
275
+
351
276
  [<Fact(Skip = "Remove to run test")>]
352
277
  member this.``Multiple files, one match, multiple flags`` () =
278
+ let files = ["iliad.txt"; "midsummer-night.txt"; "paradise-lost.txt"]
279
+ let flags = ["-n"; "-i"; "-x"]
353
280
  let pattern = "WITH LOSS OF EDEN, TILL ONE GREATER MAN"
354
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
355
- let flags = "-n -i -x"
356
- let expected =
357
- sprintf "%s:4:With loss of Eden, till one greater Man\n" paradiseLostFileName
281
+ let expected = ["paradise-lost.txt:4:With loss of Eden, till one greater Man"]
358
282
 
359
- grep pattern flags files |> should equal expected
283
+ createFiles() |> ignore
284
+ grep files flags pattern |> should equal expected
360
285
 
361
- [<Theory(Skip = "Remove to run test")>]
362
- [<InlineData("")>]
363
- [<InlineData("-n")>]
364
- [<InlineData("-l")>]
365
- [<InlineData("-x")>]
366
- [<InlineData("-i")>]
367
- [<InlineData("-n -l -x -i")>]
368
- member this.``Multiple files, no matches, various flags`` (flags) =
286
+ [<Fact(Skip = "Remove to run test")>]
287
+ member this.``Multiple files, no matches, various flags`` () =
288
+ let files = ["iliad.txt"; "midsummer-night.txt"; "paradise-lost.txt"]
289
+ let flags = ["-n"; "-l"; "-x"; "-i"]
369
290
  let pattern = "Frodo"
370
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
371
-
372
- let expected = ""
291
+ let expected: string list = []
373
292
 
374
- grep pattern flags files |> should equal expected
293
+ createFiles() |> ignore
294
+ grep files flags pattern |> should equal expected
295
+