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.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/transpose/canonical-data.json +94 -116
- data/tracks/bash/config/maintainers.json +11 -1
- data/tracks/clojure/config.json +10 -2
- data/tracks/clojure/exercises/reverse-string/README.md +14 -0
- data/tracks/clojure/exercises/reverse-string/project.clj +4 -0
- data/tracks/clojure/exercises/reverse-string/src/example.clj +5 -0
- data/tracks/clojure/exercises/reverse-string/src/reverse_string.clj +5 -0
- data/tracks/clojure/exercises/reverse-string/test/reverse_string_test.clj +18 -0
- data/tracks/clojure/exercises/say/README.md +70 -0
- data/tracks/clojure/exercises/{two-fer → say}/project.clj +3 -3
- data/tracks/clojure/exercises/say/src/example.clj +9 -0
- data/tracks/clojure/exercises/say/src/say.clj +5 -0
- data/tracks/clojure/exercises/say/test/say_test.clj +48 -0
- data/tracks/coffeescript/docs/ABOUT.md +4 -9
- data/tracks/coffeescript/docs/INSTALLATION.md +2 -2
- data/tracks/erlang/exercises/pangram/rebar.config +1 -1
- data/tracks/erlang/exercises/pangram/src/example.erl +2 -3
- data/tracks/erlang/exercises/pangram/test/pangram_tests.erl +12 -13
- data/tracks/fsharp/exercises/grep/Example.fs +16 -20
- data/tracks/fsharp/exercises/grep/GrepTest.fs +154 -233
- data/tracks/fsharp/generators/Common.fs +7 -2
- data/tracks/fsharp/generators/Exercise.fs +51 -16
- data/tracks/fsharp/generators/Formatting.fs +13 -6
- data/tracks/fsharp/generators/Generators.fs +44 -14
- data/tracks/fsharp/generators/Rendering.fs +8 -1
- data/tracks/fsharp/generators/Templates/Generators/_GrepSetup.liquid +37 -0
- data/tracks/fsharp/generators/Templates/_TestClass.liquid +9 -3
- data/tracks/fsharp/generators/Templates/{_TestMethod.liquid → _TestFunction.liquid} +0 -0
- data/tracks/fsharp/generators/Templates/{_TestMethodBody.liquid → _TestFunctionBody.liquid} +0 -0
- data/tracks/fsharp/generators/Templates/_TestMember.liquid +3 -0
- data/tracks/fsharp/generators/Templates/_TestMemberBody.liquid +4 -0
- data/tracks/fsharp/generators/Templates/_TestModule.liquid +17 -0
- data/tracks/go/config.json +24 -0
- data/tracks/go/exercises/acronym/.meta/gen.go +5 -3
- data/tracks/go/exercises/acronym/acronym.go +0 -2
- data/tracks/go/exercises/acronym/cases_test.go +2 -2
- data/tracks/go/exercises/acronym/example.go +2 -3
- data/tracks/go/exercises/all-your-base/.meta/gen.go +9 -7
- data/tracks/go/exercises/all-your-base/cases_test.go +2 -2
- data/tracks/go/exercises/allergies/.meta/gen.go +10 -6
- data/tracks/go/exercises/allergies/cases_test.go +2 -2
- data/tracks/go/exercises/anagram/.meta/gen.go +7 -5
- data/tracks/go/exercises/anagram/cases_test.go +2 -2
- data/tracks/go/exercises/armstrong-numbers/.meta/gen.go +54 -0
- data/tracks/go/exercises/armstrong-numbers/armstrong_test.go +12 -0
- data/tracks/go/exercises/armstrong-numbers/cases_test.go +52 -0
- data/tracks/go/exercises/armstrong-numbers/example.go +24 -0
- data/tracks/go/exercises/binary-search/.meta/gen.go +7 -5
- data/tracks/go/exercises/binary-search/cases_test.go +2 -2
- data/tracks/go/exercises/book-store/.meta/gen.go +5 -3
- data/tracks/go/exercises/book-store/cases_test.go +2 -2
- data/tracks/go/exercises/connect/example.go +4 -5
- data/tracks/go/exercises/dominoes/.meta/gen.go +61 -0
- data/tracks/go/exercises/dominoes/.meta/hints.md +29 -0
- data/tracks/go/exercises/dominoes/README.md +67 -0
- data/tracks/go/exercises/dominoes/cases_test.go +72 -0
- data/tracks/go/exercises/dominoes/dominoes_test.go +106 -0
- data/tracks/go/exercises/dominoes/example.go +146 -0
- data/tracks/go/exercises/ledger/example.go +1 -1
- data/tracks/groovy/.gitignore +3 -0
- data/tracks/groovy/.travis.yml +10 -1
- data/tracks/groovy/bin/prepeare_exercise_builds.groovy +77 -0
- data/tracks/groovy/build.gradle +25 -0
- data/tracks/groovy/exercises/difference-of-squares/Example.groovy +3 -3
- data/tracks/groovy/exercises/gigasecond/GigasecondSpec.groovy +3 -3
- data/tracks/groovy/exercises/linked-list/{DoubleLinkedList.groovy → LinkedList.groovy} +0 -0
- data/tracks/groovy/exercises/linked-list/{DoubleLinkedListSpec.groovy → LinkedListSpec.groovy} +0 -0
- data/tracks/groovy/exercises/linked-list/README.md +1 -1
- data/tracks/groovy/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/tracks/groovy/gradle/wrapper/gradle-wrapper.properties +6 -0
- data/tracks/groovy/gradlew +172 -0
- data/tracks/groovy/gradlew.bat +84 -0
- data/tracks/groovy/settings.gradle +9 -0
- data/tracks/ocaml/exercises/acronym/.merlin +1 -1
- data/tracks/ocaml/exercises/all-your-base/.merlin +1 -1
- data/tracks/ocaml/exercises/anagram/.merlin +1 -1
- data/tracks/ocaml/exercises/atbash-cipher/.merlin +1 -1
- data/tracks/ocaml/exercises/beer-song/.merlin +1 -1
- data/tracks/ocaml/exercises/binary-search/.merlin +1 -1
- data/tracks/ocaml/exercises/bob/.merlin +1 -1
- data/tracks/ocaml/exercises/bowling/.merlin +1 -1
- data/tracks/ocaml/exercises/change/.merlin +1 -1
- data/tracks/ocaml/exercises/difference-of-squares/.merlin +1 -1
- data/tracks/ocaml/exercises/etl/.merlin +1 -1
- data/tracks/ocaml/exercises/forth/.merlin +1 -1
- data/tracks/ocaml/exercises/grade-school/.merlin +1 -1
- data/tracks/ocaml/exercises/hamming/.merlin +1 -1
- data/tracks/ocaml/exercises/hangman/.merlin +1 -1
- data/tracks/ocaml/exercises/hello-world/.merlin +1 -1
- data/tracks/ocaml/exercises/hexadecimal/.merlin +1 -1
- data/tracks/ocaml/exercises/leap/.merlin +1 -1
- data/tracks/ocaml/exercises/list-ops/.merlin +1 -1
- data/tracks/ocaml/exercises/luhn/.merlin +1 -1
- data/tracks/ocaml/exercises/meetup/.merlin +1 -1
- data/tracks/ocaml/exercises/minesweeper/.merlin +1 -1
- data/tracks/ocaml/exercises/nucleotide-count/.merlin +1 -1
- data/tracks/ocaml/exercises/phone-number/.merlin +1 -1
- data/tracks/ocaml/exercises/prime-factors/.merlin +1 -1
- data/tracks/ocaml/exercises/raindrops/.merlin +1 -1
- data/tracks/ocaml/exercises/react/.merlin +1 -1
- data/tracks/ocaml/exercises/rectangles/.merlin +1 -1
- data/tracks/ocaml/exercises/rna-transcription/.merlin +1 -1
- data/tracks/ocaml/exercises/run-length-encoding/.merlin +1 -1
- data/tracks/ocaml/exercises/say/.merlin +1 -1
- data/tracks/ocaml/exercises/space-age/.merlin +1 -1
- data/tracks/ocaml/exercises/triangle/.merlin +1 -1
- data/tracks/ocaml/exercises/word-count/.merlin +1 -1
- data/tracks/ocaml/exercises/zipper/.merlin +1 -1
- data/tracks/typescript/config/maintainers.json +2 -2
- metadata +37 -12
- data/tracks/clojure/exercises/two-fer/README.md +0 -19
- data/tracks/clojure/exercises/two-fer/src/example.clj +0 -5
- data/tracks/clojure/exercises/two-fer/src/two_fer.clj +0 -5
- data/tracks/clojure/exercises/two-fer/test/two_fer_test.clj +0 -12
- data/tracks/erlang/exercises/pangram/include/exercism.hrl +0 -11
@@ -1,4 +1,4 @@
|
|
1
|
-
(defproject
|
2
|
-
:description "
|
3
|
-
:url "https://github.com/exercism/clojure/tree/master/exercises/
|
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,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
|
-
|
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
|
-
|
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
|
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
|
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`:
|
@@ -3,9 +3,8 @@
|
|
3
3
|
-export([is_pangram/1, test_version/0]).
|
4
4
|
|
5
5
|
is_pangram(Sentence) ->
|
6
|
-
|
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,
|
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
|
-
-
|
4
|
-
-
|
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(
|
10
|
+
?assertNot(pangram:is_pangram("")).
|
12
11
|
|
13
12
|
perfect_lower_case_pangram_test() ->
|
14
|
-
?assert(
|
13
|
+
?assert(pangram:is_pangram("abcdefghijklmnopqrstuvwxyz")).
|
15
14
|
|
16
15
|
pangram_with_only_lower_case_test() ->
|
17
|
-
?assert(
|
16
|
+
?assert(pangram:is_pangram("the quick brown fox jumps over the lazy dog")).
|
18
17
|
|
19
18
|
missing_character_x_test() ->
|
20
|
-
?assertNot(
|
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(
|
22
|
+
?assertNot(pangram:is_pangram("five boxing wizards jump quickly at it")).
|
24
23
|
|
25
24
|
pangram_with_underscores_test() ->
|
26
|
-
?assert(
|
25
|
+
?assert(pangram:is_pangram("the_quick_brown_fox_jumps_over_the_lazy_dog")).
|
27
26
|
|
28
27
|
pangram_with_numbers_test() ->
|
29
|
-
?assert(
|
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(
|
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(
|
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(
|
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
|
-
|
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
|
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.
|
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
|
64
|
-
| true, false -> sprintf "%i:%s
|
65
|
-
| false, true -> sprintf "%s:%s
|
66
|
-
| false, false -> sprintf "%s
|
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
|
-
|>
|
71
|
+
|> Seq.toList
|
76
72
|
|
77
|
-
let grep
|
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
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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(
|
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
|
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
|
-
|
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
|
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
|
-
|
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
|
87
|
-
let flags = "-i"
|
88
|
-
let
|
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
|
-
|
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
|
99
|
-
let files = [paradiseLostFileName]
|
100
|
-
|
101
|
-
let expected =
|
102
|
-
sprintf "%s\n" paradiseLostFileName
|
86
|
+
let expected = ["paradise-lost.txt"]
|
103
87
|
|
104
|
-
|
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
|
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
|
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
|
-
|
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
|
135
|
-
|
136
|
-
|
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
|
-
|
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
|
148
|
-
|
149
|
-
|
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
|
-
|
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
|
157
|
-
let files = [midsummerNightFileName]
|
158
|
-
|
159
|
-
let expected = ""
|
142
|
+
let expected: string list = []
|
160
143
|
|
161
|
-
|
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
|
171
|
-
|
153
|
+
[ "Achilles sing, O Goddess! Peleus' son;";
|
154
|
+
"The noble Chief Achilles from the son" ]
|
172
155
|
|
173
|
-
|
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
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
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
|
-
|
212
|
-
|
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,
|
230
|
-
let
|
231
|
-
let
|
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
|
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
|
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
|
-
|
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
|
-
|
276
|
-
|
277
|
-
|
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
|
-
|
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
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
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
|
-
|
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,
|
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
|
-
|
303
|
-
|
227
|
+
[ "iliad.txt";
|
228
|
+
"paradise-lost.txt" ]
|
304
229
|
|
305
|
-
|
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
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
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
|
-
|
335
|
-
|
336
|
-
|
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
|
-
|
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
|
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
|
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
|
-
|
283
|
+
createFiles() |> ignore
|
284
|
+
grep files flags pattern |> should equal expected
|
360
285
|
|
361
|
-
[<
|
362
|
-
|
363
|
-
|
364
|
-
|
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
|
371
|
-
|
372
|
-
let expected = ""
|
291
|
+
let expected: string list = []
|
373
292
|
|
374
|
-
|
293
|
+
createFiles() |> ignore
|
294
|
+
grep files flags pattern |> should equal expected
|
295
|
+
|