trackler 2.2.1.22 → 2.2.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/bash/exercises/bob/bob_test.sh +8 -6
  4. data/tracks/bash/exercises/bob/example.sh +30 -6
  5. data/tracks/coffeescript/docs/SNIPPET.txt +4 -0
  6. data/tracks/csharp/generators/Exercises/Allergies.cs +0 -2
  7. data/tracks/csharp/generators/Exercises/Anagram.cs +0 -2
  8. data/tracks/csharp/generators/Exercises/BinarySearch.cs +0 -2
  9. data/tracks/csharp/generators/Exercises/ComplexNumbers.cs +0 -2
  10. data/tracks/csharp/generators/Exercises/RailFenceCipher.cs +1 -2
  11. data/tracks/csharp/generators/Exercises/SpaceAge.cs +0 -3
  12. data/tracks/csharp/generators/Input/CanonicalDataCase.cs +37 -2
  13. data/tracks/dart/docs/SNIPPET.txt +5 -0
  14. data/tracks/ecmascript/exercises/simple-cipher/simple-cipher.spec.js +5 -1
  15. data/tracks/elm/docs/SNIPPET.txt +10 -0
  16. data/tracks/fortran/docs/SNIPPET.txt +9 -0
  17. data/tracks/fsharp/.gitignore +2 -2
  18. data/tracks/fsharp/.travis.yml +18 -5
  19. data/tracks/fsharp/build.cake +92 -0
  20. data/tracks/fsharp/build.ps1 +81 -0
  21. data/tracks/fsharp/build.sh +56 -33
  22. data/tracks/fsharp/config.json +14 -14
  23. data/tracks/fsharp/docs/INSTALLATION.md +14 -45
  24. data/tracks/fsharp/docs/TESTS.md +12 -25
  25. data/tracks/fsharp/exercises/Exercises.sln +648 -0
  26. data/tracks/fsharp/exercises/accumulate/Accumulate.fs +3 -0
  27. data/tracks/fsharp/exercises/accumulate/Accumulate.fsproj +22 -0
  28. data/tracks/fsharp/exercises/accumulate/AccumulateTest.fs +18 -22
  29. data/tracks/fsharp/exercises/accumulate/HINTS.md +1 -0
  30. data/tracks/fsharp/exercises/accumulate/Program.fs +1 -0
  31. data/tracks/fsharp/exercises/acronym/Acronym.fs +3 -0
  32. data/tracks/fsharp/exercises/acronym/Acronym.fsproj +22 -0
  33. data/tracks/fsharp/exercises/acronym/AcronymTest.fs +18 -24
  34. data/tracks/fsharp/exercises/acronym/Program.fs +1 -0
  35. data/tracks/fsharp/exercises/all-your-base/AllYourBase.fs +3 -0
  36. data/tracks/fsharp/exercises/all-your-base/AllYourBase.fsproj +22 -0
  37. data/tracks/fsharp/exercises/all-your-base/AllYourBaseTest.fs +45 -64
  38. data/tracks/fsharp/exercises/all-your-base/Program.fs +1 -0
  39. data/tracks/fsharp/exercises/allergies/Allergies.fs +9 -0
  40. data/tracks/fsharp/exercises/allergies/Allergies.fsproj +22 -0
  41. data/tracks/fsharp/exercises/allergies/AllergiesTest.fs +47 -51
  42. data/tracks/fsharp/exercises/allergies/Program.fs +1 -0
  43. data/tracks/fsharp/exercises/alphametics/Alphametics.fs +3 -0
  44. data/tracks/fsharp/exercises/alphametics/Alphametics.fsproj +22 -0
  45. data/tracks/fsharp/exercises/alphametics/AlphameticsTest.fs +19 -25
  46. data/tracks/fsharp/exercises/alphametics/Example.fs +13 -13
  47. data/tracks/fsharp/exercises/alphametics/Program.fs +1 -0
  48. data/tracks/fsharp/exercises/anagram/Anagram.fs +3 -0
  49. data/tracks/fsharp/exercises/anagram/Anagram.fsproj +22 -0
  50. data/tracks/fsharp/exercises/anagram/AnagramTest.fs +22 -33
  51. data/tracks/fsharp/exercises/anagram/Program.fs +1 -0
  52. data/tracks/fsharp/exercises/atbash-cipher/AtbashCipher.fs +3 -0
  53. data/tracks/fsharp/exercises/atbash-cipher/AtbashCipher.fsproj +22 -0
  54. data/tracks/fsharp/exercises/atbash-cipher/{AtbashTest.fs → AtbashCipherTest.fs} +18 -24
  55. data/tracks/fsharp/exercises/atbash-cipher/Program.fs +1 -0
  56. data/tracks/fsharp/exercises/bank-account/BankAccount.fs +11 -0
  57. data/tracks/fsharp/exercises/bank-account/BankAccount.fsproj +22 -0
  58. data/tracks/fsharp/exercises/bank-account/BankAccountTest.fs +16 -19
  59. data/tracks/fsharp/exercises/bank-account/Program.fs +1 -0
  60. data/tracks/fsharp/exercises/beer-song/BeerSong.fs +7 -0
  61. data/tracks/fsharp/exercises/beer-song/BeerSong.fsproj +22 -0
  62. data/tracks/fsharp/exercises/beer-song/BeerSongTest.fs +17 -22
  63. data/tracks/fsharp/exercises/beer-song/Program.fs +1 -0
  64. data/tracks/fsharp/exercises/binary-search/BinarySearch.fs +3 -0
  65. data/tracks/fsharp/exercises/binary-search/BinarySearch.fsproj +22 -0
  66. data/tracks/fsharp/exercises/binary-search/BinarySearchTest.fs +21 -28
  67. data/tracks/fsharp/exercises/binary-search/Program.fs +1 -0
  68. data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTree.fs +15 -0
  69. data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTree.fsproj +22 -0
  70. data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTreeTest.fs +31 -38
  71. data/tracks/fsharp/exercises/binary-search-tree/Program.fs +1 -0
  72. data/tracks/fsharp/exercises/bob/Bob.fs +3 -0
  73. data/tracks/fsharp/exercises/bob/Bob.fsproj +22 -0
  74. data/tracks/fsharp/exercises/bob/BobTest.fs +33 -46
  75. data/tracks/fsharp/exercises/bob/Program.fs +1 -0
  76. data/tracks/fsharp/exercises/book-store/BookStore.fs +3 -0
  77. data/tracks/fsharp/exercises/book-store/BookStore.fsproj +22 -0
  78. data/tracks/fsharp/exercises/book-store/BookStoreTest.fs +27 -37
  79. data/tracks/fsharp/exercises/book-store/Program.fs +1 -0
  80. data/tracks/fsharp/exercises/bowling/Bowling.fs +7 -0
  81. data/tracks/fsharp/exercises/bowling/Bowling.fsproj +22 -0
  82. data/tracks/fsharp/exercises/bowling/BowlingTest.fs +75 -97
  83. data/tracks/fsharp/exercises/bowling/Example.fs +1 -1
  84. data/tracks/fsharp/exercises/bowling/Program.fs +1 -0
  85. data/tracks/fsharp/exercises/bracket-push/BracketPush.fs +3 -0
  86. data/tracks/fsharp/exercises/bracket-push/BracketPush.fsproj +22 -0
  87. data/tracks/fsharp/exercises/bracket-push/BracketPushTest.fs +27 -37
  88. data/tracks/fsharp/exercises/bracket-push/Program.fs +1 -0
  89. data/tracks/fsharp/exercises/change/Change.fs +3 -0
  90. data/tracks/fsharp/exercises/change/Change.fsproj +22 -0
  91. data/tracks/fsharp/exercises/change/ChangeTest.fs +19 -25
  92. data/tracks/fsharp/exercises/change/Program.fs +1 -0
  93. data/tracks/fsharp/exercises/circular-buffer/CircularBuffer.fs +11 -0
  94. data/tracks/fsharp/exercises/circular-buffer/CircularBuffer.fsproj +22 -0
  95. data/tracks/fsharp/exercises/circular-buffer/CircularBufferTest.fs +36 -42
  96. data/tracks/fsharp/exercises/circular-buffer/Program.fs +1 -0
  97. data/tracks/fsharp/exercises/clock/Clock.fs +9 -0
  98. data/tracks/fsharp/exercises/clock/Clock.fsproj +22 -0
  99. data/tracks/fsharp/exercises/clock/ClockTest.fs +34 -48
  100. data/tracks/fsharp/exercises/clock/Program.fs +1 -0
  101. data/tracks/fsharp/exercises/connect/Connect.fs +3 -0
  102. data/tracks/fsharp/exercises/connect/Connect.fsproj +22 -0
  103. data/tracks/fsharp/exercises/connect/ConnectTest.fs +19 -25
  104. data/tracks/fsharp/exercises/connect/Program.fs +1 -0
  105. data/tracks/fsharp/exercises/crypto-square/CryptoSquare.fs +44 -0
  106. data/tracks/fsharp/exercises/crypto-square/CryptoSquare.fsproj +22 -0
  107. data/tracks/fsharp/exercises/crypto-square/CryptoSquareTest.fs +28 -39
  108. data/tracks/fsharp/exercises/crypto-square/Program.fs +1 -0
  109. data/tracks/fsharp/exercises/custom-set/CustomSet.fs +29 -0
  110. data/tracks/fsharp/exercises/custom-set/CustomSet.fsproj +22 -0
  111. data/tracks/fsharp/exercises/custom-set/CustomSetTest.fs +77 -119
  112. data/tracks/fsharp/exercises/custom-set/Program.fs +1 -0
  113. data/tracks/fsharp/exercises/diamond/Diamond.fs +3 -0
  114. data/tracks/fsharp/exercises/diamond/Diamond.fsproj +22 -0
  115. data/tracks/fsharp/exercises/diamond/DiamondTest.fs +31 -27
  116. data/tracks/fsharp/exercises/diamond/Program.fs +1 -0
  117. data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquares.fs +7 -0
  118. data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquares.fsproj +22 -0
  119. data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquaresTest.fs +21 -28
  120. data/tracks/fsharp/exercises/difference-of-squares/Program.fs +1 -0
  121. data/tracks/fsharp/exercises/diffie-hellman/DiffieHellman.fs +7 -0
  122. data/tracks/fsharp/exercises/diffie-hellman/DiffieHellman.fsproj +22 -0
  123. data/tracks/fsharp/exercises/diffie-hellman/DiffieHellmanTest.fs +16 -19
  124. data/tracks/fsharp/exercises/diffie-hellman/Program.fs +1 -0
  125. data/tracks/fsharp/exercises/dominoes/Dominoes.fs +3 -0
  126. data/tracks/fsharp/exercises/dominoes/Dominoes.fsproj +22 -0
  127. data/tracks/fsharp/exercises/dominoes/DominoesTest.fs +27 -37
  128. data/tracks/fsharp/exercises/dominoes/Program.fs +1 -0
  129. data/tracks/fsharp/exercises/dot-dsl/DotDsl.fs +15 -0
  130. data/tracks/fsharp/exercises/dot-dsl/DotDsl.fsproj +22 -0
  131. data/tracks/fsharp/exercises/dot-dsl/DotDslTest.fs +27 -31
  132. data/tracks/fsharp/exercises/dot-dsl/Program.fs +1 -0
  133. data/tracks/fsharp/exercises/error-handling/ErrorHandling.fs +11 -0
  134. data/tracks/fsharp/exercises/error-handling/ErrorHandling.fsproj +22 -0
  135. data/tracks/fsharp/exercises/error-handling/ErrorHandlingTest.fs +20 -25
  136. data/tracks/fsharp/exercises/error-handling/Program.fs +1 -0
  137. data/tracks/fsharp/exercises/etl/Etl.fs +3 -0
  138. data/tracks/fsharp/exercises/etl/Etl.fsproj +22 -0
  139. data/tracks/fsharp/exercises/etl/{ETLTest.fs → EtlTest.fs} +11 -13
  140. data/tracks/fsharp/exercises/etl/Program.fs +1 -0
  141. data/tracks/fsharp/exercises/food-chain/FoodChain.fs +5 -0
  142. data/tracks/fsharp/exercises/food-chain/FoodChain.fsproj +22 -0
  143. data/tracks/fsharp/exercises/food-chain/FoodChainTest.fs +13 -16
  144. data/tracks/fsharp/exercises/food-chain/Program.fs +1 -0
  145. data/tracks/fsharp/exercises/forth/Forth.fs +3 -0
  146. data/tracks/fsharp/exercises/forth/Forth.fsproj +22 -0
  147. data/tracks/fsharp/exercises/forth/ForthTest.fs +44 -57
  148. data/tracks/fsharp/exercises/forth/Program.fs +1 -0
  149. data/tracks/fsharp/exercises/gigasecond/Gigasecond.fs +3 -0
  150. data/tracks/fsharp/exercises/gigasecond/Gigasecond.fsproj +22 -0
  151. data/tracks/fsharp/exercises/gigasecond/GigasecondTest.fs +9 -10
  152. data/tracks/fsharp/exercises/gigasecond/Program.fs +1 -0
  153. data/tracks/fsharp/exercises/go-counting/GoCounting.fs +3 -0
  154. data/tracks/fsharp/exercises/go-counting/GoCounting.fsproj +22 -0
  155. data/tracks/fsharp/exercises/go-counting/GoCountingTest.fs +23 -30
  156. data/tracks/fsharp/exercises/go-counting/Program.fs +1 -0
  157. data/tracks/fsharp/exercises/grade-school/Example.fs +1 -1
  158. data/tracks/fsharp/exercises/grade-school/GradeSchool.fs +9 -0
  159. data/tracks/fsharp/exercises/grade-school/GradeSchool.fsproj +22 -0
  160. data/tracks/fsharp/exercises/grade-school/GradeSchoolTest.fs +17 -22
  161. data/tracks/fsharp/exercises/grade-school/Program.fs +1 -0
  162. data/tracks/fsharp/exercises/grains/Grains.fs +6 -0
  163. data/tracks/fsharp/exercises/grains/Grains.fsproj +22 -0
  164. data/tracks/fsharp/exercises/grains/GrainsTest.fs +19 -25
  165. data/tracks/fsharp/exercises/grains/Program.fs +1 -0
  166. data/tracks/fsharp/exercises/grep/Grep.fs +3 -0
  167. data/tracks/fsharp/exercises/grep/Grep.fsproj +22 -0
  168. data/tracks/fsharp/exercises/grep/GrepTest.fs +332 -348
  169. data/tracks/fsharp/exercises/grep/Program.fs +1 -0
  170. data/tracks/fsharp/exercises/hamming/Hamming.fs +3 -0
  171. data/tracks/fsharp/exercises/hamming/Hamming.fsproj +22 -0
  172. data/tracks/fsharp/exercises/hamming/HammingTest.fs +15 -19
  173. data/tracks/fsharp/exercises/hamming/Program.fs +1 -0
  174. data/tracks/fsharp/exercises/hangman/Hangman.fs +3 -0
  175. data/tracks/fsharp/exercises/hangman/Hangman.fsproj +22 -0
  176. data/tracks/fsharp/exercises/hangman/HangmanTest.fs +30 -34
  177. data/tracks/fsharp/exercises/hangman/Program.fs +1 -0
  178. data/tracks/fsharp/exercises/hello-world/HelloWorld.fs +3 -0
  179. data/tracks/fsharp/exercises/hello-world/HelloWorld.fsproj +22 -0
  180. data/tracks/fsharp/exercises/hello-world/HelloWorldTest.fs +5 -4
  181. data/tracks/fsharp/exercises/hello-world/Program.fs +1 -0
  182. data/tracks/fsharp/exercises/house/House.fs +3 -0
  183. data/tracks/fsharp/exercises/house/House.fsproj +22 -0
  184. data/tracks/fsharp/exercises/house/HouseTest.fs +5 -4
  185. data/tracks/fsharp/exercises/house/Program.fs +1 -0
  186. data/tracks/fsharp/exercises/isogram/Isogram.fs +3 -0
  187. data/tracks/fsharp/exercises/isogram/Isogram.fsproj +22 -0
  188. data/tracks/fsharp/exercises/isogram/IsogramTest.fs +21 -28
  189. data/tracks/fsharp/exercises/isogram/Program.fs +1 -0
  190. data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGarden.fs +9 -0
  191. data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGarden.fsproj +22 -0
  192. data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGardenTest.fs +51 -0
  193. data/tracks/fsharp/exercises/kindergarten-garden/Program.fs +1 -0
  194. data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProduct.fs +3 -0
  195. data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProduct.fsproj +22 -0
  196. data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProductTest.fs +27 -22
  197. data/tracks/fsharp/exercises/largest-series-product/Program.fs +1 -0
  198. data/tracks/fsharp/exercises/leap/Leap.fs +3 -0
  199. data/tracks/fsharp/exercises/leap/Leap.fsproj +22 -0
  200. data/tracks/fsharp/exercises/leap/LeapTest.fs +11 -13
  201. data/tracks/fsharp/exercises/leap/Program.fs +1 -0
  202. data/tracks/fsharp/exercises/ledger/Ledger.fsproj +22 -0
  203. data/tracks/fsharp/exercises/ledger/LedgerTest.fs +23 -22
  204. data/tracks/fsharp/exercises/ledger/Program.fs +1 -0
  205. data/tracks/fsharp/exercises/lens-person/LensPerson.fs +1 -22
  206. data/tracks/fsharp/exercises/lens-person/LensPerson.fsproj +23 -0
  207. data/tracks/fsharp/exercises/lens-person/LensPersonTest.fs +11 -13
  208. data/tracks/fsharp/exercises/lens-person/Program.fs +1 -0
  209. data/tracks/fsharp/exercises/linked-list/LinkedList.fs +13 -0
  210. data/tracks/fsharp/exercises/linked-list/LinkedList.fsproj +22 -0
  211. data/tracks/fsharp/exercises/linked-list/LinkedListTest.fs +28 -33
  212. data/tracks/fsharp/exercises/linked-list/Program.fs +1 -0
  213. data/tracks/fsharp/exercises/list-ops/ListOps.fs +17 -0
  214. data/tracks/fsharp/exercises/list-ops/ListOps.fsproj +22 -0
  215. data/tracks/fsharp/exercises/list-ops/ListOpsTest.fs +51 -73
  216. data/tracks/fsharp/exercises/list-ops/Program.fs +1 -0
  217. data/tracks/fsharp/exercises/luhn/Luhn.fs +3 -0
  218. data/tracks/fsharp/exercises/luhn/Luhn.fsproj +22 -0
  219. data/tracks/fsharp/exercises/luhn/LuhnTest.fs +28 -39
  220. data/tracks/fsharp/exercises/luhn/Program.fs +1 -0
  221. data/tracks/fsharp/exercises/markdown/Markdown.fsproj +22 -0
  222. data/tracks/fsharp/exercises/markdown/MarkdownTest.fs +21 -20
  223. data/tracks/fsharp/exercises/markdown/Program.fs +1 -0
  224. data/tracks/fsharp/exercises/matrix/Matrix.fs +7 -0
  225. data/tracks/fsharp/exercises/matrix/Matrix.fsproj +22 -0
  226. data/tracks/fsharp/exercises/matrix/MatrixTest.fs +76 -48
  227. data/tracks/fsharp/exercises/matrix/Program.fs +1 -0
  228. data/tracks/fsharp/exercises/meetup/Meetup.fs +7 -0
  229. data/tracks/fsharp/exercises/meetup/Meetup.fsproj +22 -0
  230. data/tracks/fsharp/exercises/meetup/MeetupTest.fs +67 -60
  231. data/tracks/fsharp/exercises/meetup/Program.fs +1 -0
  232. data/tracks/fsharp/exercises/minesweeper/Minesweeper.fs +3 -0
  233. data/tracks/fsharp/exercises/minesweeper/Minesweeper.fsproj +22 -0
  234. data/tracks/fsharp/exercises/minesweeper/MinesweeperTest.fs +17 -22
  235. data/tracks/fsharp/exercises/minesweeper/Program.fs +1 -0
  236. data/tracks/fsharp/exercises/nth-prime/NthPrime.fs +3 -0
  237. data/tracks/fsharp/exercises/nth-prime/NthPrime.fsproj +22 -0
  238. data/tracks/fsharp/exercises/nth-prime/NthPrimeTest.fs +25 -34
  239. data/tracks/fsharp/exercises/nth-prime/Program.fs +1 -0
  240. data/tracks/fsharp/exercises/nucleotide-count/NucleotideCount.fs +5 -0
  241. data/tracks/fsharp/exercises/nucleotide-count/NucleotideCount.fsproj +22 -0
  242. data/tracks/fsharp/exercises/nucleotide-count/NucleotideCountTest.fs +17 -21
  243. data/tracks/fsharp/exercises/nucleotide-count/Program.fs +1 -0
  244. data/tracks/fsharp/exercises/ocr-numbers/OcrNumbers.fs +3 -0
  245. data/tracks/fsharp/exercises/ocr-numbers/OcrNumbers.fsproj +22 -0
  246. data/tracks/fsharp/exercises/ocr-numbers/OcrNumbersTest.fs +33 -46
  247. data/tracks/fsharp/exercises/ocr-numbers/Program.fs +1 -0
  248. data/tracks/fsharp/exercises/palindrome-products/PalindromeProducts.fs +5 -0
  249. data/tracks/fsharp/exercises/palindrome-products/PalindromeProducts.fsproj +22 -0
  250. data/tracks/fsharp/exercises/palindrome-products/PalindromeProductsTest.fs +54 -0
  251. data/tracks/fsharp/exercises/palindrome-products/Program.fs +1 -0
  252. data/tracks/fsharp/exercises/pangram/Pangram.fs +3 -0
  253. data/tracks/fsharp/exercises/pangram/Pangram.fsproj +22 -0
  254. data/tracks/fsharp/exercises/pangram/PangramTest.fs +23 -31
  255. data/tracks/fsharp/exercises/pangram/Program.fs +1 -0
  256. data/tracks/fsharp/exercises/parallel-letter-frequency/ParallelLetterFrequency.fs +3 -0
  257. data/tracks/fsharp/exercises/parallel-letter-frequency/ParallelLetterFrequency.fsproj +22 -0
  258. data/tracks/fsharp/exercises/parallel-letter-frequency/ParallelLetterFrequencyTest.fs +27 -35
  259. data/tracks/fsharp/exercises/parallel-letter-frequency/Program.fs +1 -0
  260. data/tracks/fsharp/exercises/pascals-triangle/PascalsTriangle.fs +3 -0
  261. data/tracks/fsharp/exercises/pascals-triangle/PascalsTriangle.fsproj +22 -0
  262. data/tracks/fsharp/exercises/pascals-triangle/PascalsTriangleTest.fs +15 -19
  263. data/tracks/fsharp/exercises/pascals-triangle/Program.fs +1 -0
  264. data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbers.fs +5 -0
  265. data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbers.fsproj +22 -0
  266. data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbersTest.fs +18 -14
  267. data/tracks/fsharp/exercises/perfect-numbers/Program.fs +1 -0
  268. data/tracks/fsharp/exercises/phone-number/PhoneNumber.fs +3 -0
  269. data/tracks/fsharp/exercises/phone-number/PhoneNumber.fsproj +22 -0
  270. data/tracks/fsharp/exercises/phone-number/PhoneNumberTest.fs +23 -31
  271. data/tracks/fsharp/exercises/phone-number/Program.fs +1 -0
  272. data/tracks/fsharp/exercises/pig-latin/PigLatin.fs +3 -0
  273. data/tracks/fsharp/exercises/pig-latin/PigLatin.fsproj +22 -0
  274. data/tracks/fsharp/exercises/pig-latin/PigLatinTest.fs +39 -44
  275. data/tracks/fsharp/exercises/pig-latin/Program.fs +1 -0
  276. data/tracks/fsharp/exercises/poker/Poker.fs +3 -0
  277. data/tracks/fsharp/exercises/poker/Poker.fsproj +22 -0
  278. data/tracks/fsharp/exercises/poker/PokerTest.fs +40 -56
  279. data/tracks/fsharp/exercises/poker/Program.fs +1 -0
  280. data/tracks/fsharp/exercises/pov/Pov.fs +3 -0
  281. data/tracks/fsharp/exercises/pov/Pov.fsproj +22 -0
  282. data/tracks/fsharp/exercises/pov/PovTest.fs +23 -31
  283. data/tracks/fsharp/exercises/pov/Program.fs +1 -0
  284. data/tracks/fsharp/exercises/prime-factors/Example.fs +1 -1
  285. data/tracks/fsharp/exercises/prime-factors/PrimeFactors.fs +3 -0
  286. data/tracks/fsharp/exercises/prime-factors/PrimeFactors.fsproj +22 -0
  287. data/tracks/fsharp/exercises/prime-factors/PrimeFactorsTest.fs +22 -30
  288. data/tracks/fsharp/exercises/prime-factors/Program.fs +1 -0
  289. data/tracks/fsharp/exercises/protein-translation/Program.fs +1 -0
  290. data/tracks/fsharp/exercises/protein-translation/ProteinTranslation.fs +3 -0
  291. data/tracks/fsharp/exercises/protein-translation/ProteinTranslation.fsproj +22 -0
  292. data/tracks/fsharp/exercises/protein-translation/ProteinTranslationTest.fs +41 -36
  293. data/tracks/fsharp/exercises/proverb/Program.fs +1 -0
  294. data/tracks/fsharp/exercises/proverb/Proverb.fs +5 -0
  295. data/tracks/fsharp/exercises/proverb/Proverb.fsproj +22 -0
  296. data/tracks/fsharp/exercises/proverb/ProverbTest.fs +11 -13
  297. data/tracks/fsharp/exercises/pythagorean-triplet/Program.fs +1 -0
  298. data/tracks/fsharp/exercises/pythagorean-triplet/PythagoreanTriplet.fs +7 -0
  299. data/tracks/fsharp/exercises/pythagorean-triplet/PythagoreanTriplet.fsproj +22 -0
  300. data/tracks/fsharp/exercises/pythagorean-triplet/PythagoreanTripletTest.fs +19 -20
  301. data/tracks/fsharp/exercises/queen-attack/Program.fs +1 -0
  302. data/tracks/fsharp/exercises/queen-attack/QueenAttack.fs +3 -0
  303. data/tracks/fsharp/exercises/queen-attack/QueenAttack.fsproj +22 -0
  304. data/tracks/fsharp/exercises/queen-attack/QueenAttackTest.fs +19 -25
  305. data/tracks/fsharp/exercises/rail-fence-cipher/Program.fs +1 -0
  306. data/tracks/fsharp/exercises/rail-fence-cipher/RailFenceCipher.fs +5 -0
  307. data/tracks/fsharp/exercises/rail-fence-cipher/RailFenceCipher.fsproj +22 -0
  308. data/tracks/fsharp/exercises/rail-fence-cipher/RailFenceCipherTest.fs +15 -19
  309. data/tracks/fsharp/exercises/raindrops/Program.fs +1 -0
  310. data/tracks/fsharp/exercises/raindrops/Raindrops.fs +3 -0
  311. data/tracks/fsharp/exercises/raindrops/Raindrops.fsproj +22 -0
  312. data/tracks/fsharp/exercises/raindrops/RaindropsTest.fs +30 -24
  313. data/tracks/fsharp/exercises/react/Program.fs +1 -0
  314. data/tracks/fsharp/exercises/react/React.fs +3 -0
  315. data/tracks/fsharp/exercises/react/React.fsproj +22 -0
  316. data/tracks/fsharp/exercises/react/ReactTest.fs +26 -31
  317. data/tracks/fsharp/exercises/rectangles/Program.fs +1 -0
  318. data/tracks/fsharp/exercises/rectangles/Rectangles.fs +3 -0
  319. data/tracks/fsharp/exercises/rectangles/Rectangles.fsproj +22 -0
  320. data/tracks/fsharp/exercises/rectangles/RectanglesTest.fs +23 -31
  321. data/tracks/fsharp/exercises/rna-transcription/Program.fs +1 -0
  322. data/tracks/fsharp/exercises/rna-transcription/RnaTranscription.fs +3 -0
  323. data/tracks/fsharp/exercises/rna-transcription/RnaTranscription.fsproj +22 -0
  324. data/tracks/fsharp/exercises/rna-transcription/RnaTranscriptionTest.fs +26 -0
  325. data/tracks/fsharp/exercises/robot-name/Program.fs +1 -0
  326. data/tracks/fsharp/exercises/robot-name/RobotName.fs +7 -0
  327. data/tracks/fsharp/exercises/robot-name/RobotName.fsproj +22 -0
  328. data/tracks/fsharp/exercises/robot-name/RobotNameTest.fs +12 -13
  329. data/tracks/fsharp/exercises/robot-simulator/Program.fs +1 -0
  330. data/tracks/fsharp/exercises/robot-simulator/RobotSimulator.fs +13 -0
  331. data/tracks/fsharp/exercises/robot-simulator/RobotSimulator.fsproj +22 -0
  332. data/tracks/fsharp/exercises/robot-simulator/RobotSimulatorTest.fs +16 -20
  333. data/tracks/fsharp/exercises/roman-numerals/Program.fs +1 -0
  334. data/tracks/fsharp/exercises/roman-numerals/RomanNumerals.fs +3 -0
  335. data/tracks/fsharp/exercises/roman-numerals/RomanNumerals.fsproj +22 -0
  336. data/tracks/fsharp/exercises/roman-numerals/RomanNumeralsTest.fs +28 -0
  337. data/tracks/fsharp/exercises/run-length-encoding/Program.fs +1 -0
  338. data/tracks/fsharp/exercises/run-length-encoding/RunLengthEncoding.fs +5 -0
  339. data/tracks/fsharp/exercises/run-length-encoding/RunLengthEncoding.fsproj +22 -0
  340. data/tracks/fsharp/exercises/run-length-encoding/RunLengthEncodingTest.fs +17 -22
  341. data/tracks/fsharp/exercises/saddle-points/Program.fs +1 -0
  342. data/tracks/fsharp/exercises/saddle-points/SaddlePoints.fs +3 -0
  343. data/tracks/fsharp/exercises/saddle-points/SaddlePoints.fsproj +22 -0
  344. data/tracks/fsharp/exercises/saddle-points/{SaddlePointTest.fs → SaddlePointsTest.fs} +13 -16
  345. data/tracks/fsharp/exercises/say/Program.fs +1 -0
  346. data/tracks/fsharp/exercises/say/Say.fs +3 -0
  347. data/tracks/fsharp/exercises/say/Say.fsproj +22 -0
  348. data/tracks/fsharp/exercises/say/SayTest.fs +35 -49
  349. data/tracks/fsharp/exercises/scale-generator/Program.fs +1 -0
  350. data/tracks/fsharp/exercises/scale-generator/ScaleGenerator.fs +3 -0
  351. data/tracks/fsharp/exercises/scale-generator/ScaleGenerator.fsproj +22 -0
  352. data/tracks/fsharp/exercises/scale-generator/ScaleGeneratorTest.fs +31 -43
  353. data/tracks/fsharp/exercises/scrabble-score/Program.fs +1 -0
  354. data/tracks/fsharp/exercises/scrabble-score/ScrabbleScore.fs +3 -0
  355. data/tracks/fsharp/exercises/scrabble-score/ScrabbleScore.fsproj +22 -0
  356. data/tracks/fsharp/exercises/scrabble-score/ScrabbleScoreTest.fs +18 -24
  357. data/tracks/fsharp/exercises/secret-handshake/Program.fs +1 -0
  358. data/tracks/fsharp/exercises/secret-handshake/SecretHandshake.fs +3 -0
  359. data/tracks/fsharp/exercises/secret-handshake/SecretHandshake.fsproj +22 -0
  360. data/tracks/fsharp/exercises/secret-handshake/SecretHandshakeTest.fs +17 -22
  361. data/tracks/fsharp/exercises/series/Program.fs +1 -0
  362. data/tracks/fsharp/exercises/series/Series.fs +3 -0
  363. data/tracks/fsharp/exercises/series/Series.fsproj +22 -0
  364. data/tracks/fsharp/exercises/series/SeriesTest.fs +53 -55
  365. data/tracks/fsharp/exercises/sgf-parsing/Program.fs +1 -0
  366. data/tracks/fsharp/exercises/sgf-parsing/SgfParsing.fs +3 -0
  367. data/tracks/fsharp/exercises/sgf-parsing/SgfParsing.fsproj +22 -0
  368. data/tracks/fsharp/exercises/sgf-parsing/SgfParsingTest.fs +27 -37
  369. data/tracks/fsharp/exercises/sieve/Program.fs +1 -0
  370. data/tracks/fsharp/exercises/sieve/Sieve.fs +3 -0
  371. data/tracks/fsharp/exercises/sieve/Sieve.fsproj +22 -0
  372. data/tracks/fsharp/exercises/sieve/SieveTest.fs +19 -21
  373. data/tracks/fsharp/exercises/simple-cipher/Program.fs +1 -0
  374. data/tracks/fsharp/exercises/simple-cipher/SimpleCipher.fs +7 -0
  375. data/tracks/fsharp/exercises/simple-cipher/SimpleCipher.fsproj +22 -0
  376. data/tracks/fsharp/exercises/simple-cipher/SimpleCipherTest.fs +39 -54
  377. data/tracks/fsharp/exercises/simple-linked-list/Program.fs +1 -0
  378. data/tracks/fsharp/exercises/simple-linked-list/SimpleLinkedList.fs +36 -0
  379. data/tracks/fsharp/exercises/simple-linked-list/SimpleLinkedList.fsproj +22 -0
  380. data/tracks/fsharp/exercises/simple-linked-list/SimpleLinkedListTest.fs +36 -40
  381. data/tracks/fsharp/exercises/space-age/Program.fs +1 -0
  382. data/tracks/fsharp/exercises/space-age/SpaceAge.fs +5 -0
  383. data/tracks/fsharp/exercises/space-age/SpaceAge.fsproj +22 -0
  384. data/tracks/fsharp/exercises/space-age/SpaceAgeTest.fs +26 -32
  385. data/tracks/fsharp/exercises/strain/Program.fs +1 -0
  386. data/tracks/fsharp/exercises/strain/Strain.fs +5 -0
  387. data/tracks/fsharp/exercises/strain/Strain.fsproj +22 -0
  388. data/tracks/fsharp/exercises/strain/StrainTest.fs +28 -47
  389. data/tracks/fsharp/exercises/sublist/Program.fs +1 -0
  390. data/tracks/fsharp/exercises/sublist/Sublist.fs +5 -0
  391. data/tracks/fsharp/exercises/sublist/Sublist.fsproj +22 -0
  392. data/tracks/fsharp/exercises/sublist/SublistTest.fs +39 -55
  393. data/tracks/fsharp/exercises/sum-of-multiples/Program.fs +1 -0
  394. data/tracks/fsharp/exercises/sum-of-multiples/SumOfMultiples.fs +3 -0
  395. data/tracks/fsharp/exercises/sum-of-multiples/SumOfMultiples.fsproj +22 -0
  396. data/tracks/fsharp/exercises/sum-of-multiples/SumOfMultiplesTest.fs +15 -19
  397. data/tracks/fsharp/exercises/tournament/Program.fs +1 -0
  398. data/tracks/fsharp/exercises/tournament/Tournament.fs +3 -0
  399. data/tracks/fsharp/exercises/tournament/Tournament.fsproj +22 -0
  400. data/tracks/fsharp/exercises/tournament/TournamentTest.fs +9 -10
  401. data/tracks/fsharp/exercises/transpose/Program.fs +1 -0
  402. data/tracks/fsharp/exercises/transpose/Transpose.fs +3 -0
  403. data/tracks/fsharp/exercises/transpose/Transpose.fsproj +22 -0
  404. data/tracks/fsharp/exercises/transpose/TransposeTest.fs +25 -34
  405. data/tracks/fsharp/exercises/tree-building/Program.fs +1 -0
  406. data/tracks/fsharp/exercises/tree-building/TreeBuilding.fsproj +22 -0
  407. data/tracks/fsharp/exercises/tree-building/TreeBuildingTest.fs +84 -82
  408. data/tracks/fsharp/exercises/triangle/Program.fs +1 -0
  409. data/tracks/fsharp/exercises/triangle/Triangle.fs +8 -0
  410. data/tracks/fsharp/exercises/triangle/Triangle.fsproj +22 -0
  411. data/tracks/fsharp/exercises/triangle/TriangleTest.fs +31 -43
  412. data/tracks/fsharp/exercises/twelve-days/Program.fs +1 -0
  413. data/tracks/fsharp/exercises/twelve-days/TwelveDays.fs +7 -0
  414. data/tracks/fsharp/exercises/twelve-days/TwelveDays.fsproj +22 -0
  415. data/tracks/fsharp/exercises/twelve-days/TwelveDaysTest.fs +31 -43
  416. data/tracks/fsharp/exercises/two-bucket/Program.fs +1 -0
  417. data/tracks/fsharp/exercises/two-bucket/TwoBucket.fs +3 -0
  418. data/tracks/fsharp/exercises/two-bucket/TwoBucket.fsproj +22 -0
  419. data/tracks/fsharp/exercises/two-bucket/TwoBucketTest.fs +11 -13
  420. data/tracks/fsharp/exercises/two-fer/Program.fs +1 -0
  421. data/tracks/fsharp/exercises/two-fer/TwoFer.fs +3 -0
  422. data/tracks/fsharp/exercises/two-fer/TwoFer.fsproj +22 -0
  423. data/tracks/fsharp/exercises/two-fer/TwoFerTest.fs +9 -10
  424. data/tracks/fsharp/exercises/variable-length-quantity/Program.fs +1 -0
  425. data/tracks/fsharp/exercises/variable-length-quantity/VariableLengthQuantity.fs +3 -0
  426. data/tracks/fsharp/exercises/variable-length-quantity/VariableLengthQuantity.fsproj +22 -0
  427. data/tracks/fsharp/exercises/variable-length-quantity/VariableLengthQuantityTest.fs +42 -50
  428. data/tracks/fsharp/exercises/word-count/Program.fs +1 -0
  429. data/tracks/fsharp/exercises/word-count/WordCount.fs +3 -0
  430. data/tracks/fsharp/exercises/word-count/WordCount.fsproj +22 -0
  431. data/tracks/fsharp/exercises/word-count/WordCountTest.fs +27 -37
  432. data/tracks/fsharp/exercises/word-search/Program.fs +1 -0
  433. data/tracks/fsharp/exercises/word-search/WordSearch.fs +3 -0
  434. data/tracks/fsharp/exercises/word-search/WordSearch.fsproj +22 -0
  435. data/tracks/fsharp/exercises/word-search/WordSearchTest.fs +23 -31
  436. data/tracks/fsharp/exercises/wordy/Program.fs +1 -0
  437. data/tracks/fsharp/exercises/wordy/Wordy.fs +3 -0
  438. data/tracks/fsharp/exercises/wordy/Wordy.fsproj +22 -0
  439. data/tracks/fsharp/exercises/wordy/WordyTest.fs +34 -48
  440. data/tracks/fsharp/exercises/zebra-puzzle/Example.fs +1 -1
  441. data/tracks/fsharp/exercises/zebra-puzzle/Program.fs +1 -0
  442. data/tracks/fsharp/exercises/zebra-puzzle/ZebraPuzzle.fs +3 -0
  443. data/tracks/fsharp/exercises/zebra-puzzle/ZebraPuzzle.fsproj +22 -0
  444. data/tracks/fsharp/exercises/zebra-puzzle/ZebraPuzzleTest.fs +9 -9
  445. data/tracks/fsharp/exercises/zipper/Program.fs +1 -0
  446. data/tracks/fsharp/exercises/zipper/Zipper.fs +3 -0
  447. data/tracks/fsharp/exercises/zipper/Zipper.fsproj +22 -0
  448. data/tracks/fsharp/exercises/zipper/ZipperTest.fs +19 -25
  449. data/tracks/javascript/exercises/simple-linked-list/example.js +4 -3
  450. data/tracks/javascript/exercises/simple-linked-list/simple-linked-list.spec.js +3 -0
  451. data/tracks/nim/docs/SNIPPET.txt +2 -0
  452. data/tracks/perl5/docs/SNIPPET.txt +9 -0
  453. data/tracks/php/docs/SNIPPET.txt +6 -0
  454. data/tracks/pony/docs/SNIPPET.txt +2 -0
  455. data/tracks/powershell/docs/SNIPPET.txt +4 -0
  456. data/tracks/prolog/docs/SNIPPET.txt +6 -0
  457. data/tracks/python/exercises/simple-cipher/README.md +1 -1
  458. data/tracks/vimscript/docs/SNIPPET.txt +4 -0
  459. metadata +334 -17
  460. data/tracks/fsharp/.paket/paket.bootstrapper.exe +0 -0
  461. data/tracks/fsharp/build.cmd +0 -14
  462. data/tracks/fsharp/build.fsx +0 -65
  463. data/tracks/fsharp/exercises/app.config +0 -11
  464. data/tracks/fsharp/exercises/exercises.fsproj +0 -225
  465. data/tracks/fsharp/exercises/kindergarten-garden/KinderGartenGardenTest.fs +0 -55
  466. data/tracks/fsharp/exercises/paket.references +0 -4
  467. data/tracks/fsharp/exercises/palindrome-products/PalindromeTest.fs +0 -60
  468. data/tracks/fsharp/exercises/rna-transcription/RNATranscriptionTest.fs +0 -29
  469. data/tracks/fsharp/exercises/roman-numerals/RomanNumeralTest.fs +0 -26
  470. data/tracks/fsharp/paket.dependencies +0 -8
  471. data/tracks/fsharp/paket.lock +0 -11
@@ -1,6 +1,7 @@
1
- module GrepTest
1
+ module GrepTest
2
2
 
3
- open NUnit.Framework
3
+ open Xunit
4
+ open FsUnit.Xunit
4
5
 
5
6
  open Grep
6
7
 
@@ -42,349 +43,332 @@ Of Oreb, or of Sinai, didst inspire
42
43
  That Shepherd, who first taught the chosen Seed
43
44
  """
44
45
 
45
- [<OneTimeSetUp>]
46
- let setUp () =
47
- Directory.SetCurrentDirectory(Path.GetTempPath());
48
- File.WriteAllText(iliadFileName, iliadContents)
49
- File.WriteAllText(midsummerNightFileName, midsummerNightContents)
50
- File.WriteAllText(paradiseLostFileName, paradiseLostContents)
51
-
52
- [<OneTimeTearDown>]
53
- let tearDown () =
54
- File.Delete(iliadFileName)
55
- File.Delete(midsummerNightFileName)
56
- File.Delete(paradiseLostFileName)
57
-
58
- [<Test>]
59
- let ``One file, one match, no flags`` () =
60
- let pattern = "Agamemnon"
61
- let flags = ""
62
- let files = [iliadFileName]
63
-
64
- let expected =
65
- "Of Atreus, Agamemnon, King of men.\n"
66
-
67
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
68
-
69
- [<Test>]
70
- [<Ignore("Remove to run test")>]
71
- let ``One file, one match, print line numbers flag`` () =
72
- let pattern = "Forbidden"
73
- let flags = "-n"
74
- let files = [paradiseLostFileName]
75
-
76
- let expected =
77
- "2:Of that Forbidden Tree, whose mortal tast\n"
78
-
79
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
80
-
81
- [<Test>]
82
- [<Ignore("Remove to run test")>]
83
- let ``One file, one match, case-insensitive flag`` () =
84
- let pattern = "Forbidden"
85
- let flags = "-i"
86
- let files = [paradiseLostFileName]
87
-
88
- let expected =
89
- "Of that Forbidden Tree, whose mortal tast\n"
90
-
91
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
92
-
93
- [<Test>]
94
- [<Ignore("Remove to run test")>]
95
- let ``One file, one match, print file names flag`` () =
96
- let pattern = "Forbidden"
97
- let flags = "-l"
98
- let files = [paradiseLostFileName]
99
-
100
- let expected =
101
- sprintf "%s\n" paradiseLostFileName
102
-
103
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
104
-
105
- [<Test>]
106
- [<Ignore("Remove to run test")>]
107
- let ``One file, one match, match entire lines flag`` () =
108
- 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
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
116
-
117
- [<Test>]
118
- [<Ignore("Remove to run test")>]
119
- let ``One file, one match, multiple flags`` () =
120
- let pattern = "OF ATREUS, Agamemnon, KIng of MEN."
121
- let files = [iliadFileName]
122
- let flags = "-n -i -x"
123
- let expected =
124
- "9:Of Atreus, Agamemnon, King of men.\n"
125
-
126
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
127
-
128
- [<Test>]
129
- [<Ignore("Remove to run test")>]
130
- let ``One file, several matches, no flags`` () =
131
- let pattern = "may"
132
- let flags = ""
133
- let files = [midsummerNightFileName]
134
-
135
- let expected =
136
- "Nor how it may concern my modesty,\n" +
137
- "But I beseech your grace that I may know\n" +
138
- "The worst that may befall me in this case,\n"
139
-
140
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
141
-
142
- [<Test>]
143
- [<Ignore("Remove to run test")>]
144
- let ``One file, several matches, print line numbers flag`` () =
145
- let pattern = "may"
146
- let flags = "-n"
147
- let files = [midsummerNightFileName]
148
-
149
- let expected =
150
- "3:Nor how it may concern my modesty,\n" +
151
- "5:But I beseech your grace that I may know\n" +
152
- "6:The worst that may befall me in this case,\n"
153
-
154
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
155
-
156
- [<Test>]
157
- [<Ignore("Remove to run test")>]
158
- let ``One file, several matches, match entire lines flag`` () =
159
- let pattern = "may"
160
- let flags = "-x"
161
- let files = [midsummerNightFileName]
162
-
163
- let expected = ""
164
-
165
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
166
-
167
- [<Test>]
168
- [<Ignore("Remove to run test")>]
169
- let ``One file, several matches, case-insensitive flag`` () =
170
- let pattern = "ACHILLES"
171
- let flags = "-i"
172
- let files = [iliadFileName]
173
-
174
- let expected =
175
- "Achilles sing, O Goddess! Peleus' son;\n" +
176
- "The noble Chief Achilles from the son\n"
177
-
178
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
179
-
180
- [<Test>]
181
- [<Ignore("Remove to run test")>]
182
- let ``One file, several matches, inverted flag`` () =
183
- let pattern = "Of"
184
- let flags = "-v"
185
- let files = [paradiseLostFileName]
186
-
187
- let expected =
188
- "Brought Death into the World, and all our woe,\n" +
189
- "With loss of Eden, till one greater Man\n" +
190
- "Restore us, and regain the blissful Seat,\n" +
191
- "Sing Heav'nly Muse, that on the secret top\n" +
192
- "That Shepherd, who first taught the chosen Seed\n"
193
-
194
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
195
-
196
- [<Test>]
197
- [<Ignore("Remove to run test")>]
198
- let ``One file, case-insensitive and entire line flags`` () =
199
- let pattern = "ATREUS"
200
- let files = [iliadFileName]
201
- let flags = "-i -x"
202
- let expected = ""
203
-
204
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
205
-
206
- [<Test>]
207
- [<Ignore("Remove to run test")>]
208
- let ``One file, case-insensitive and inverted flags`` () =
209
- let pattern = "THE"
210
- let files = [paradiseLostFileName]
211
- let flags = "-i -v"
212
- let expected =
213
- "Of that Forbidden Tree, whose mortal tast\n" +
214
- "With loss of Eden, till one greater Man\n" +
215
- "Of Oreb, or of Sinai, didst inspire\n"
216
-
217
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
218
-
219
- [<Test>]
220
- [<Ignore("Remove to run test")>]
221
- let ``One file, inverted and entire line flags`` () =
222
- let pattern = "the"
223
- let files = [paradiseLostFileName]
224
- let flags = "-v -x"
225
- let expected =
226
- "Of Mans First Disobedience, and the Fruit\n" +
227
- "Of that Forbidden Tree, whose mortal tast\n" +
228
- "Brought Death into the World, and all our woe,\n" +
229
- "With loss of Eden, till one greater Man\n" +
230
- "Restore us, and regain the blissful Seat,\n" +
231
- "Sing Heav'nly Muse, that on the secret top\n" +
232
- "Of Oreb, or of Sinai, didst inspire\n" +
233
- "That Shepherd, who first taught the chosen Seed\n"
234
-
235
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
236
-
237
- [<Test>]
238
- [<Ignore("Remove to run test")>]
239
- let ``One file, case-insensitive, inverted and entire line flags`` () =
240
- let pattern = "if i rEFuse To Wed DeMETrius."
241
- let files = [midsummerNightFileName]
242
- let flags = "-i -v -x"
243
- let expected =
244
- "I do entreat your grace to pardon me.\n" +
245
- "I know not by what power I am made bold,\n" +
246
- "Nor how it may concern my modesty,\n" +
247
- "In such a presence here to plead my thoughts;\n" +
248
- "But I beseech your grace that I may know\n" +
249
- "The worst that may befall me in this case,\n"
250
-
251
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
252
-
253
- [<TestCase("", Ignore = "Remove to run test case")>]
254
- [<TestCase("-n", Ignore = "Remove to run test case")>]
255
- [<TestCase("-l", Ignore = "Remove to run test case")>]
256
- [<TestCase("-x", Ignore = "Remove to run test case")>]
257
- [<TestCase("-i", Ignore = "Remove to run test case")>]
258
- [<TestCase("-n -l -x -i", Ignore = "Remove to run test case")>]
259
- let ``One file, no matches, various flags`` (flags) =
260
- let pattern = "Gandalf"
261
- let files = [iliadFileName]
262
- let expected = ""
263
-
264
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
265
-
266
- [<Test>]
267
- [<Ignore("Remove to run test")>]
268
- let ``Multiple files, one match, no flags`` () =
269
- let pattern = "Agamemnon"
270
- let flags = ""
271
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
272
-
273
- let expected =
274
- sprintf "%s:Of Atreus, Agamemnon, King of men.\n" iliadFileName
275
-
276
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
277
-
278
- [<Test>]
279
- [<Ignore("Remove to run test")>]
280
- let ``Multiple files, several matches, no flags`` () =
281
- let pattern = "may"
282
- let flags = ""
283
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
284
-
285
- let expected =
286
- sprintf "%s:Nor how it may concern my modesty,\n" midsummerNightFileName +
287
- sprintf "%s:But I beseech your grace that I may know\n" midsummerNightFileName +
288
- sprintf "%s:The worst that may befall me in this case,\n" midsummerNightFileName
289
-
290
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
291
-
292
- [<Test>]
293
- [<Ignore("Remove to run test")>]
294
- let ``Multiple files, several matches, print line numbers flag`` () =
295
- let pattern = "that"
296
- let flags = "-n"
297
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
298
-
299
- let expected =
300
- sprintf "%s:5:But I beseech your grace that I may know\n" midsummerNightFileName +
301
- sprintf "%s:6:The worst that may befall me in this case,\n" midsummerNightFileName +
302
- sprintf "%s:2:Of that Forbidden Tree, whose mortal tast\n" paradiseLostFileName +
303
- sprintf "%s:6:Sing Heav'nly Muse, that on the secret top\n" paradiseLostFileName
304
-
305
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
306
-
307
- [<Test>]
308
- [<Ignore("Remove to run test")>]
309
- let ``Multiple files, several matches, print file names flag`` () =
310
- let pattern = "who"
311
- let flags = "-l"
312
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
313
-
314
- let expected =
315
- sprintf "%s\n" iliadFileName +
316
- sprintf "%s\n" paradiseLostFileName
317
-
318
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
319
-
320
- [<Test>]
321
- [<Ignore("Remove to run test")>]
322
- let ``Multiple files, several matches, case-insensitive flag`` () =
323
- let pattern = "TO"
324
- let flags = "-i"
325
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
326
-
327
- let expected =
328
- sprintf "%s:Caused to Achaia's host, sent many a soul\n" iliadFileName +
329
- sprintf "%s:Illustrious into Ades premature,\n" iliadFileName +
330
- sprintf "%s:And Heroes gave (so stood the will of Jove)\n" iliadFileName +
331
- sprintf "%s:To dogs and to all ravening fowls a prey,\n" iliadFileName +
332
- sprintf "%s:I do entreat your grace to pardon me.\n" midsummerNightFileName +
333
- sprintf "%s:In such a presence here to plead my thoughts;\n" midsummerNightFileName +
334
- sprintf "%s:If I refuse to wed Demetrius.\n" midsummerNightFileName +
335
- sprintf "%s:Brought Death into the World, and all our woe,\n" paradiseLostFileName +
336
- sprintf "%s:Restore us, and regain the blissful Seat,\n" paradiseLostFileName +
337
- sprintf "%s:Sing Heav'nly Muse, that on the secret top\n" paradiseLostFileName
338
-
339
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
340
-
341
- [<Test>]
342
- [<Ignore("Remove to run test")>]
343
- let ``Multiple files, several matches, inverted flag`` () =
344
- let pattern = "a"
345
- let flags = "-v"
346
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
347
-
348
- let expected =
349
- sprintf "%s:Achilles sing, O Goddess! Peleus' son;\n" iliadFileName +
350
- sprintf "%s:The noble Chief Achilles from the son\n" iliadFileName +
351
- sprintf "%s:If I refuse to wed Demetrius.\n" midsummerNightFileName
352
-
353
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
354
-
355
- [<Test>]
356
- [<Ignore("Remove to run test")>]
357
- let ``Multiple files, one match, match entire lines flag`` () =
358
- let pattern = "But I beseech your grace that I may know"
359
- let flags = "-x"
360
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
361
-
362
- let expected =
363
- sprintf "%s:But I beseech your grace that I may know\n" midsummerNightFileName
364
-
365
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
366
-
367
- [<Test>]
368
- [<Ignore("Remove to run test")>]
369
- let ``Multiple files, one match, multiple flags`` () =
370
- let pattern = "WITH LOSS OF EDEN, TILL ONE GREATER MAN"
371
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
372
- let flags = "-n -i -x"
373
- let expected =
374
- sprintf "%s:4:With loss of Eden, till one greater Man\n" paradiseLostFileName
375
-
376
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
377
-
378
- [<TestCase("", Ignore = "Remove to run test case")>]
379
- [<TestCase("-n", Ignore = "Remove to run test case")>]
380
- [<TestCase("-l", Ignore = "Remove to run test case")>]
381
- [<TestCase("-x", Ignore = "Remove to run test case")>]
382
- [<TestCase("-i", Ignore = "Remove to run test case")>]
383
- [<TestCase("-n -l -x -i", Ignore = "Remove to run test case")>]
384
- let ``Multiple files, no matches, various flags`` (flags) =
385
- let pattern = "Frodo"
386
- let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
387
-
388
- let expected = ""
389
-
390
- Assert.That(grep pattern flags files, Is.EqualTo(expected))
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)
52
+
53
+ interface System.IDisposable with
54
+ member this.Dispose() =
55
+ File.Delete(iliadFileName)
56
+ File.Delete(midsummerNightFileName)
57
+ File.Delete(paradiseLostFileName)
58
+
59
+ type GrepTest(fixture: GrepFixture) =
60
+ interface IClassFixture<GrepFixture>
61
+
62
+ [<Fact>]
63
+ member this.``One file, one match, no flags`` () =
64
+ let pattern = "Agamemnon"
65
+ let flags = ""
66
+ let files = [iliadFileName]
67
+
68
+ let expected =
69
+ "Of Atreus, Agamemnon, King of men.\n"
70
+
71
+ grep pattern flags files |> should equal expected
72
+
73
+ [<Fact(Skip = "Remove to run test")>]
74
+ member this.``One file, one match, print line numbers flag`` () =
75
+ 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"
81
+
82
+ grep pattern flags files |> should equal expected
83
+
84
+ [<Fact(Skip = "Remove to run test")>]
85
+ 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"
92
+
93
+ grep pattern flags files |> should equal expected
94
+
95
+ [<Fact(Skip = "Remove to run test")>]
96
+ member this.``One file, one match, print file names flag`` () =
97
+ let pattern = "Forbidden"
98
+ let flags = "-l"
99
+ let files = [paradiseLostFileName]
100
+
101
+ let expected =
102
+ sprintf "%s\n" paradiseLostFileName
103
+
104
+ grep pattern flags files |> should equal expected
105
+
106
+ [<Fact(Skip = "Remove to run test")>]
107
+ member this.``One file, one match, match entire lines flag`` () =
108
+ 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
116
+
117
+ [<Fact(Skip = "Remove to run test")>]
118
+ member this.``One file, one match, multiple flags`` () =
119
+ 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"
124
+
125
+ grep pattern flags files |> should equal expected
126
+
127
+ [<Fact(Skip = "Remove to run test")>]
128
+ member this.``One file, several matches, no flags`` () =
129
+ let pattern = "may"
130
+ let flags = ""
131
+ let files = [midsummerNightFileName]
132
+
133
+ 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"
137
+
138
+ grep pattern flags files |> should equal expected
139
+
140
+ [<Fact(Skip = "Remove to run test")>]
141
+ member this.``One file, several matches, print line numbers flag`` () =
142
+ let pattern = "may"
143
+ let flags = "-n"
144
+ let files = [midsummerNightFileName]
145
+
146
+ 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"
150
+
151
+ grep pattern flags files |> should equal expected
152
+
153
+ [<Fact(Skip = "Remove to run test")>]
154
+ member this.``One file, several matches, match entire lines flag`` () =
155
+ let pattern = "may"
156
+ let flags = "-x"
157
+ let files = [midsummerNightFileName]
158
+
159
+ let expected = ""
160
+
161
+ grep pattern flags files |> should equal expected
162
+
163
+ [<Fact(Skip = "Remove to run test")>]
164
+ member this.``One file, several matches, case-insensitive flag`` () =
165
+ let pattern = "ACHILLES"
166
+ let flags = "-i"
167
+ let files = [iliadFileName]
168
+
169
+ let expected =
170
+ "Achilles sing, O Goddess! Peleus' son;\n" +
171
+ "The noble Chief Achilles from the son\n"
172
+
173
+ grep pattern flags files |> should equal expected
174
+
175
+ [<Fact(Skip = "Remove to run test")>]
176
+ member this.``One file, several matches, inverted flag`` () =
177
+ 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
210
+
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
227
+
228
+ [<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) =
251
+ let pattern = "Gandalf"
252
+ let files = [iliadFileName]
253
+ let expected = ""
254
+
255
+ grep pattern flags files |> should equal expected
256
+
257
+ [<Fact(Skip = "Remove to run test")>]
258
+ member this.``Multiple files, one match, no flags`` () =
259
+ 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
265
+
266
+ grep pattern flags files |> should equal expected
267
+
268
+ [<Fact(Skip = "Remove to run test")>]
269
+ member this.``Multiple files, several matches, no flags`` () =
270
+ let pattern = "may"
271
+ let flags = ""
272
+ let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
273
+
274
+ 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
278
+
279
+ grep pattern flags files |> should equal expected
280
+
281
+ [<Fact(Skip = "Remove to run test")>]
282
+ member this.``Multiple files, several matches, print line numbers flag`` () =
283
+ let pattern = "that"
284
+ let flags = "-n"
285
+ let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
286
+
287
+ 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
292
+
293
+ grep pattern flags files |> should equal expected
294
+
295
+ [<Fact(Skip = "Remove to run test")>]
296
+ member this.``Multiple files, several matches, print file names flag`` () =
297
+ let pattern = "who"
298
+ let flags = "-l"
299
+ let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
300
+
301
+ let expected =
302
+ sprintf "%s\n" iliadFileName +
303
+ sprintf "%s\n" paradiseLostFileName
304
+
305
+ grep pattern flags files |> should equal expected
306
+
307
+ [<Fact(Skip = "Remove to run test")>]
308
+ member this.``Multiple files, several matches, case-insensitive flag`` () =
309
+ let pattern = "TO"
310
+ let flags = "-i"
311
+ let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
312
+
313
+ 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
326
+
327
+ [<Fact(Skip = "Remove to run test")>]
328
+ member this.``Multiple files, several matches, inverted flag`` () =
329
+ let pattern = "a"
330
+ let flags = "-v"
331
+ let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
332
+
333
+ 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
337
+
338
+ grep pattern flags files |> should equal expected
339
+
340
+ [<Fact(Skip = "Remove to run test")>]
341
+ member this.``Multiple files, one match, match entire lines flag`` () =
342
+ 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
350
+
351
+ [<Fact(Skip = "Remove to run test")>]
352
+ member this.``Multiple files, one match, multiple flags`` () =
353
+ 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
358
+
359
+ grep pattern flags files |> should equal expected
360
+
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) =
369
+ let pattern = "Frodo"
370
+ let files = [iliadFileName; midsummerNightFileName; paradiseLostFileName]
371
+
372
+ let expected = ""
373
+
374
+ grep pattern flags files |> should equal expected