trackler 2.0.6.15 → 2.0.6.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (489) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/go/config.json +5 -1
  4. data/tracks/go/exercises/clock/clock_test.go +13 -8
  5. data/tracks/ruby/.github/ISSUE_TEMPLATE.md +43 -0
  6. data/tracks/ruby/.github/PULL_REQUEST_TEMPLATE.md +36 -0
  7. data/tracks/swift/.swiftlint.yml +8 -3
  8. data/tracks/swift/.travis.yml +26 -17
  9. data/tracks/swift/Dangerfile +0 -7
  10. data/tracks/swift/Package.swift +26 -0
  11. data/tracks/swift/README.md +1 -1
  12. data/tracks/swift/docs/ABOUT.md +9 -1
  13. data/tracks/swift/docs/INSTALLATION.md +10 -2
  14. data/tracks/swift/docs/TESTS.md +45 -80
  15. data/tracks/swift/docs/img/file-inspector.png +0 -0
  16. data/tracks/swift/docs/img/tests-fail.png +0 -0
  17. data/tracks/swift/docs/img/tests-pass.png +0 -0
  18. data/tracks/swift/docs/img/tests.png +0 -0
  19. data/tracks/swift/exercises/accumulate/.gitignore +4 -0
  20. data/tracks/swift/exercises/accumulate/Package.swift +5 -0
  21. data/tracks/swift/exercises/accumulate/{AccumulateExample.swift → Sources/AccumulateExample.swift} +0 -0
  22. data/tracks/swift/exercises/accumulate/Sources/deleteme.swift +1 -0
  23. data/tracks/swift/exercises/accumulate/{AccumulateTest.swift → Tests/AccumulateTests/AccumulateTests.swift} +13 -16
  24. data/tracks/swift/exercises/accumulate/Tests/LinuxMain.swift +6 -0
  25. data/tracks/swift/exercises/acronym/.gitignore +4 -0
  26. data/tracks/swift/exercises/acronym/Package.swift +5 -0
  27. data/tracks/swift/exercises/acronym/{AcronymExample.swift → Sources/AcronymExample.swift} +2 -0
  28. data/tracks/swift/exercises/acronym/Sources/deleteme.swift +1 -0
  29. data/tracks/swift/exercises/acronym/{AcronymTest.swift → Tests/AcronymTests/AcronymTests.swift} +13 -5
  30. data/tracks/swift/exercises/acronym/Tests/LinuxMain.swift +6 -0
  31. data/tracks/swift/exercises/all-your-base/.gitignore +4 -0
  32. data/tracks/swift/exercises/all-your-base/Package.swift +5 -0
  33. data/tracks/swift/exercises/all-your-base/{AllYourBaseExample.swift → Sources/AllYourBaseExample.swift} +0 -0
  34. data/tracks/swift/exercises/all-your-base/Sources/deleteme.swift +1 -0
  35. data/tracks/swift/exercises/all-your-base/{AllYourBaseTest.swift → Tests/AllYourBaseTests/AllYourBaseTests.swift} +27 -6
  36. data/tracks/swift/exercises/all-your-base/Tests/LinuxMain.swift +6 -0
  37. data/tracks/swift/exercises/allergies/.gitignore +4 -0
  38. data/tracks/swift/exercises/allergies/Package.swift +5 -0
  39. data/tracks/swift/exercises/allergies/{AllergiesExample.swift → Sources/AllergiesExample.swift} +0 -0
  40. data/tracks/swift/exercises/allergies/Sources/deleteme.swift +1 -0
  41. data/tracks/swift/exercises/allergies/{AllergiesTest.swift → Tests/AllergiesTests/AllergiesTests.swift} +12 -4
  42. data/tracks/swift/exercises/allergies/Tests/LinuxMain.swift +6 -0
  43. data/tracks/swift/exercises/anagram/.gitignore +4 -0
  44. data/tracks/swift/exercises/anagram/Package.swift +5 -0
  45. data/tracks/swift/exercises/anagram/{AnagramExample.swift → Sources/AnagramExample.swift} +0 -0
  46. data/tracks/swift/exercises/anagram/Sources/deleteme.swift +1 -0
  47. data/tracks/swift/exercises/anagram/{AnagramTest.swift → Tests/AnagramTests/AnagramTests.swift} +17 -4
  48. data/tracks/swift/exercises/anagram/Tests/LinuxMain.swift +6 -0
  49. data/tracks/swift/exercises/atbash-cipher/.gitignore +4 -0
  50. data/tracks/swift/exercises/atbash-cipher/Package.swift +5 -0
  51. data/tracks/swift/exercises/atbash-cipher/{AtbashExample.swift → Sources/AtbashExample.swift} +2 -0
  52. data/tracks/swift/exercises/atbash-cipher/Sources/deleteme.swift +1 -0
  53. data/tracks/swift/exercises/atbash-cipher/{AtbashTest.swift → Tests/AtbashTests/AtbashTests.swift} +15 -4
  54. data/tracks/swift/exercises/atbash-cipher/Tests/LinuxMain.swift +6 -0
  55. data/tracks/swift/exercises/beer-song/.gitignore +4 -0
  56. data/tracks/swift/exercises/beer-song/Package.swift +5 -0
  57. data/tracks/swift/exercises/beer-song/{BeerSongExample.swift → Sources/BeerSongExample.swift} +0 -0
  58. data/tracks/swift/exercises/beer-song/Sources/deleteme.swift +1 -0
  59. data/tracks/swift/exercises/beer-song/{BeerSongTest.swift → Tests/BeerSongTests/BeerSongTests.swift} +12 -4
  60. data/tracks/swift/exercises/beer-song/Tests/LinuxMain.swift +6 -0
  61. data/tracks/swift/exercises/binary-search-tree/.gitignore +4 -0
  62. data/tracks/swift/exercises/binary-search-tree/Package.swift +5 -0
  63. data/tracks/swift/exercises/binary-search-tree/{BinarySearchTreeExample.swift → Sources/BinarySearchTreeExample.swift} +0 -0
  64. data/tracks/swift/exercises/binary-search-tree/Sources/deleteme.swift +1 -0
  65. data/tracks/swift/exercises/binary-search-tree/{BinarySearchTreeTest.swift → Tests/BinarySearchTreeTests/BinarySearchTreeTests.swift} +16 -4
  66. data/tracks/swift/exercises/binary-search-tree/Tests/LinuxMain.swift +6 -0
  67. data/tracks/swift/exercises/binary-search/.gitignore +4 -0
  68. data/tracks/swift/exercises/binary-search/Package.swift +5 -0
  69. data/tracks/swift/exercises/binary-search/{BinarySearchExample.swift → Sources/BinarySearchExample.swift} +0 -0
  70. data/tracks/swift/exercises/binary-search/Sources/deleteme.swift +1 -0
  71. data/tracks/swift/exercises/binary-search/{BinarySearchTest.swift → Tests/BinarySearchTests/BinarySearchTests.swift} +15 -5
  72. data/tracks/swift/exercises/binary-search/Tests/LinuxMain.swift +6 -0
  73. data/tracks/swift/exercises/binary/.gitignore +4 -0
  74. data/tracks/swift/exercises/binary/Package.swift +5 -0
  75. data/tracks/swift/exercises/binary/{BinaryExample.swift → Sources/BinaryExample.swift} +0 -0
  76. data/tracks/swift/exercises/binary/Sources/deleteme.swift +1 -0
  77. data/tracks/swift/exercises/binary/{BinaryTest.swift → Tests/BinaryTests/BinaryTests.swift} +18 -4
  78. data/tracks/swift/exercises/binary/Tests/LinuxMain.swift +6 -0
  79. data/tracks/swift/exercises/bob/.gitignore +4 -0
  80. data/tracks/swift/exercises/bob/Package.swift +5 -0
  81. data/tracks/swift/exercises/bob/{BobExample.swift → Sources/BobExample.swift} +2 -0
  82. data/tracks/swift/exercises/bob/Sources/deleteme.swift +1 -0
  83. data/tracks/swift/exercises/bob/{BobTest.swift → Tests/BobTests/BobTests.swift} +24 -4
  84. data/tracks/swift/exercises/bob/Tests/LinuxMain.swift +6 -0
  85. data/tracks/swift/exercises/bowling/.gitignore +4 -0
  86. data/tracks/swift/exercises/bowling/Package.swift +5 -0
  87. data/tracks/swift/exercises/bowling/{BowlingExample.swift → Sources/BowlingExample.swift} +1 -1
  88. data/tracks/swift/exercises/bowling/Sources/deleteme.swift +1 -0
  89. data/tracks/swift/exercises/bowling/{BowlingTest.swift → Tests/BowlingTests/BowlingTests.swift} +31 -5
  90. data/tracks/swift/exercises/bowling/Tests/LinuxMain.swift +6 -0
  91. data/tracks/swift/exercises/bracket-push/.gitignore +4 -0
  92. data/tracks/swift/exercises/bracket-push/Package.swift +5 -0
  93. data/tracks/swift/exercises/bracket-push/{BracketPushExample.swift → Sources/BracketPushExample.swift} +3 -3
  94. data/tracks/swift/exercises/bracket-push/Sources/deleteme.swift +1 -0
  95. data/tracks/swift/exercises/bracket-push/{BracketPushTest.swift → Tests/BracketPushTests/BracketPushTests.swift} +21 -4
  96. data/tracks/swift/exercises/bracket-push/Tests/LinuxMain.swift +6 -0
  97. data/tracks/swift/exercises/clock/.gitignore +4 -0
  98. data/tracks/swift/exercises/clock/Package.swift +5 -0
  99. data/tracks/swift/exercises/clock/{ClockExample.swift → Sources/ClockExample.swift} +2 -0
  100. data/tracks/swift/exercises/clock/Sources/deleteme.swift +1 -0
  101. data/tracks/swift/exercises/clock/{ClockTest.swift → Tests/ClockTests/ClockTests.swift} +55 -4
  102. data/tracks/swift/exercises/clock/Tests/LinuxMain.swift +6 -0
  103. data/tracks/swift/exercises/crypto-square/.gitignore +4 -0
  104. data/tracks/swift/exercises/crypto-square/Package.swift +5 -0
  105. data/tracks/swift/exercises/crypto-square/{CryptoSquareExample.swift → Sources/CryptoSquareExample.swift} +2 -2
  106. data/tracks/swift/exercises/crypto-square/Sources/deleteme.swift +1 -0
  107. data/tracks/swift/exercises/crypto-square/{CryptoSquareTest.swift → Tests/CryptoSquareTests/CryptoSquareTests.swift} +23 -4
  108. data/tracks/swift/exercises/crypto-square/Tests/LinuxMain.swift +6 -0
  109. data/tracks/swift/exercises/custom-set/.gitignore +4 -0
  110. data/tracks/swift/exercises/custom-set/Package.swift +5 -0
  111. data/tracks/swift/exercises/custom-set/{CustomSetExample.swift → Sources/CustomSetExample.swift} +0 -0
  112. data/tracks/swift/exercises/custom-set/Sources/deleteme.swift +1 -0
  113. data/tracks/swift/exercises/custom-set/{CustomSetTest.swift → Tests/CustomSetTests/CustomSetTests.swift} +21 -5
  114. data/tracks/swift/exercises/custom-set/Tests/LinuxMain.swift +6 -0
  115. data/tracks/swift/exercises/difference-of-squares/.gitignore +4 -0
  116. data/tracks/swift/exercises/difference-of-squares/Package.swift +5 -0
  117. data/tracks/swift/exercises/difference-of-squares/{DifferenceOfSquaresExample.swift → Sources/DifferenceOfSquaresExample.swift} +0 -0
  118. data/tracks/swift/exercises/difference-of-squares/Sources/deleteme.swift +1 -0
  119. data/tracks/swift/exercises/difference-of-squares/{DifferenceOfSquaresTest.swift → Tests/DifferenceOfSquaresTests/DifferenceOfSquaresTests.swift} +16 -4
  120. data/tracks/swift/exercises/difference-of-squares/Tests/LinuxMain.swift +6 -0
  121. data/tracks/swift/exercises/dominoes/.gitignore +4 -0
  122. data/tracks/swift/exercises/dominoes/Package.swift +5 -0
  123. data/tracks/swift/exercises/dominoes/{DominoesExample.swift → Sources/DominoesExample.swift} +0 -0
  124. data/tracks/swift/exercises/dominoes/Sources/deleteme.swift +1 -0
  125. data/tracks/swift/exercises/dominoes/{DominoesTest.swift → Tests/DominoesTests/DominoesTests.swift} +19 -4
  126. data/tracks/swift/exercises/dominoes/Tests/LinuxMain.swift +6 -0
  127. data/tracks/swift/exercises/etl/.gitignore +4 -0
  128. data/tracks/swift/exercises/etl/Package.swift +5 -0
  129. data/tracks/swift/exercises/etl/{EtlExample.swift → Sources/EtlExample.swift} +0 -0
  130. data/tracks/swift/exercises/etl/Sources/deleteme.swift +1 -0
  131. data/tracks/swift/exercises/etl/Tests/EtlTests/EtlTests.swift +59 -0
  132. data/tracks/swift/exercises/etl/Tests/LinuxMain.swift +6 -0
  133. data/tracks/swift/exercises/flatten-array/.gitignore +4 -0
  134. data/tracks/swift/exercises/flatten-array/Package.swift +5 -0
  135. data/tracks/swift/exercises/flatten-array/{FlattenArrayExample.swift → Sources/FlattenArrayExample.swift} +0 -0
  136. data/tracks/swift/exercises/flatten-array/Sources/deleteme.swift +1 -0
  137. data/tracks/swift/exercises/flatten-array/{FlattenArrayTest.swift → Tests/FlattenArrayTests/FlattenArrayTests.swift} +14 -1
  138. data/tracks/swift/exercises/flatten-array/Tests/LinuxMain.swift +6 -0
  139. data/tracks/swift/exercises/food-chain/.gitignore +4 -0
  140. data/tracks/swift/exercises/food-chain/Package.swift +5 -0
  141. data/tracks/swift/exercises/food-chain/{FoodChainExample.swift → Sources/FoodChainExample.swift} +0 -0
  142. data/tracks/swift/exercises/food-chain/Sources/deleteme.swift +1 -0
  143. data/tracks/swift/exercises/food-chain/{FoodChainTest.swift → Tests/FoodChainTests/FoodChainTests.swift} +13 -4
  144. data/tracks/swift/exercises/food-chain/Tests/LinuxMain.swift +6 -0
  145. data/tracks/swift/exercises/gigasecond/.gitignore +4 -0
  146. data/tracks/swift/exercises/gigasecond/Package.swift +5 -0
  147. data/tracks/swift/exercises/gigasecond/{GigasecondExample.swift → Sources/GigasecondExample.swift} +1 -1
  148. data/tracks/swift/exercises/gigasecond/Sources/deleteme.swift +1 -0
  149. data/tracks/swift/exercises/gigasecond/{GigasecondTest.swift → Tests/GigasecondTests/GigasecondTests.swift} +14 -4
  150. data/tracks/swift/exercises/gigasecond/Tests/LinuxMain.swift +6 -0
  151. data/tracks/swift/exercises/grade-school/.gitignore +4 -0
  152. data/tracks/swift/exercises/grade-school/Package.swift +5 -0
  153. data/tracks/swift/exercises/grade-school/{GradeSchoolExample.swift → Sources/GradeSchoolExample.swift} +0 -0
  154. data/tracks/swift/exercises/grade-school/Sources/deleteme.swift +1 -0
  155. data/tracks/swift/exercises/grade-school/{GradeSchoolTest.swift → Tests/GradeSchoolTests/GradeSchoolTests.swift} +17 -13
  156. data/tracks/swift/exercises/grade-school/Tests/LinuxMain.swift +6 -0
  157. data/tracks/swift/exercises/grains/.gitignore +4 -0
  158. data/tracks/swift/exercises/grains/Package.swift +5 -0
  159. data/tracks/swift/exercises/grains/{GrainsExample.swift → Sources/GrainsExample.swift} +1 -1
  160. data/tracks/swift/exercises/grains/Sources/deleteme.swift +1 -0
  161. data/tracks/swift/exercises/grains/{GrainsTest.swift → Tests/GrainsTests/GrainsTests.swift} +19 -5
  162. data/tracks/swift/exercises/grains/Tests/LinuxMain.swift +6 -0
  163. data/tracks/swift/exercises/hamming/.gitignore +4 -0
  164. data/tracks/swift/exercises/hamming/Package.swift +5 -0
  165. data/tracks/swift/exercises/hamming/{HammingExample.swift → Sources/HammingExample.swift} +0 -0
  166. data/tracks/swift/exercises/hamming/Sources/deleteme.swift +1 -0
  167. data/tracks/swift/exercises/hamming/{HammingTest.swift → Tests/HammingTests/HammingTests.swift} +15 -4
  168. data/tracks/swift/exercises/hamming/Tests/LinuxMain.swift +6 -0
  169. data/tracks/swift/exercises/hello-world/.gitignore +4 -0
  170. data/tracks/swift/exercises/hello-world/Package.swift +5 -0
  171. data/tracks/swift/exercises/hello-world/{HelloWorldExample.swift → Sources/HelloWorldExample.swift} +0 -0
  172. data/tracks/swift/exercises/hello-world/Sources/deleteme.swift +1 -0
  173. data/tracks/swift/exercises/hello-world/{helloWorldTest.swift → Tests/HelloWorldTests/HelloWorldTests.swift} +11 -4
  174. data/tracks/swift/exercises/hello-world/Tests/LinuxMain.swift +6 -0
  175. data/tracks/swift/exercises/hexadecimal/.gitignore +4 -0
  176. data/tracks/swift/exercises/hexadecimal/Package.swift +5 -0
  177. data/tracks/swift/exercises/hexadecimal/{HexadecimalExample.swift → Sources/HexadecimalExample.swift} +16 -16
  178. data/tracks/swift/exercises/hexadecimal/Sources/deleteme.swift +1 -0
  179. data/tracks/swift/exercises/hexadecimal/{HexadecimalTest.swift → Tests/HexadecimalTests/HexadecimalTests.swift} +17 -4
  180. data/tracks/swift/exercises/hexadecimal/Tests/LinuxMain.swift +6 -0
  181. data/tracks/swift/exercises/house/.gitignore +4 -0
  182. data/tracks/swift/exercises/house/Package.swift +5 -0
  183. data/tracks/swift/exercises/house/{HouseExample.swift → Sources/HouseExample.swift} +0 -0
  184. data/tracks/swift/exercises/house/Sources/deleteme.swift +1 -0
  185. data/tracks/swift/exercises/house/{HouseTest.swift → Tests/HouseTests/HouseTests.swift} +9 -4
  186. data/tracks/swift/exercises/house/Tests/LinuxMain.swift +6 -0
  187. data/tracks/swift/exercises/isogram/.gitignore +4 -0
  188. data/tracks/swift/exercises/isogram/Package.swift +5 -0
  189. data/tracks/swift/exercises/isogram/{IsogramExample.swift → Sources/IsogramExample.swift} +0 -0
  190. data/tracks/swift/exercises/isogram/Sources/deleteme.swift +1 -0
  191. data/tracks/swift/exercises/isogram/{IsogramTest.swift → Tests/IsogramTests/IsogramTests.swift} +16 -4
  192. data/tracks/swift/exercises/isogram/Tests/LinuxMain.swift +6 -0
  193. data/tracks/swift/exercises/kindergarten-garden/.gitignore +4 -0
  194. data/tracks/swift/exercises/kindergarten-garden/Package.swift +5 -0
  195. data/tracks/swift/exercises/kindergarten-garden/{KindergartenGardenExample.swift → Sources/KindergartenGardenExample.swift} +1 -1
  196. data/tracks/swift/exercises/kindergarten-garden/Sources/deleteme.swift +1 -0
  197. data/tracks/swift/exercises/kindergarten-garden/{KindergartenGardenTest.swift → Tests/KindergartenGardenTests/KindergartenGardenTests.swift} +28 -5
  198. data/tracks/swift/exercises/kindergarten-garden/Tests/LinuxMain.swift +6 -0
  199. data/tracks/swift/exercises/largest-series-product/.gitignore +4 -0
  200. data/tracks/swift/exercises/largest-series-product/Package.swift +5 -0
  201. data/tracks/swift/exercises/largest-series-product/{LargestSeriesProductExample.swift → Sources/LargestSeriesProductExample.swift} +0 -0
  202. data/tracks/swift/exercises/largest-series-product/Sources/deleteme.swift +1 -0
  203. data/tracks/swift/exercises/largest-series-product/{LargestSeriesProductTest.swift → Tests/LargestSeriesProductTests/LargestSeriesProductTests.swift} +24 -4
  204. data/tracks/swift/exercises/largest-series-product/Tests/LinuxMain.swift +6 -0
  205. data/tracks/swift/exercises/leap/.gitignore +4 -0
  206. data/tracks/swift/exercises/leap/Package.swift +5 -0
  207. data/tracks/swift/exercises/leap/{LeapExample.swift → Sources/LeapExample.swift} +0 -0
  208. data/tracks/swift/exercises/leap/Sources/deleteme.swift +1 -0
  209. data/tracks/swift/exercises/leap/{LeapTest.swift → Tests/LeapTests/LeapTests.swift} +11 -4
  210. data/tracks/swift/exercises/leap/Tests/LinuxMain.swift +6 -0
  211. data/tracks/swift/exercises/linked-list/.gitignore +4 -0
  212. data/tracks/swift/exercises/linked-list/Package.swift +5 -0
  213. data/tracks/swift/exercises/linked-list/{LinkedListExample.swift → Sources/LinkedListExample.swift} +3 -3
  214. data/tracks/swift/exercises/linked-list/Sources/deleteme.swift +1 -0
  215. data/tracks/swift/exercises/linked-list/{LinkedListTest.swift → Tests/LinkedListTests/LinkedListTests.swift} +12 -4
  216. data/tracks/swift/exercises/linked-list/Tests/LinuxMain.swift +6 -0
  217. data/tracks/swift/exercises/luhn/.gitignore +4 -0
  218. data/tracks/swift/exercises/luhn/Package.swift +5 -0
  219. data/tracks/swift/exercises/luhn/{LuhnExample.swift → Sources/LuhnExample.swift} +1 -1
  220. data/tracks/swift/exercises/luhn/Sources/deleteme.swift +1 -0
  221. data/tracks/swift/exercises/luhn/Tests/LinuxMain.swift +6 -0
  222. data/tracks/swift/exercises/luhn/{LuhnTest.swift → Tests/LuhnTests/LuhnTests.swift} +16 -4
  223. data/tracks/swift/exercises/matrix/.gitignore +4 -0
  224. data/tracks/swift/exercises/matrix/Package.swift +5 -0
  225. data/tracks/swift/exercises/matrix/{MatrixExample.swift → Sources/MatrixExample.swift} +0 -0
  226. data/tracks/swift/exercises/matrix/Sources/deleteme.swift +1 -0
  227. data/tracks/swift/exercises/matrix/Tests/LinuxMain.swift +6 -0
  228. data/tracks/swift/exercises/matrix/{MatrixTest.swift → Tests/MatrixTests/MatrixTests.swift} +13 -5
  229. data/tracks/swift/exercises/meetup/.gitignore +4 -0
  230. data/tracks/swift/exercises/meetup/Package.swift +5 -0
  231. data/tracks/swift/exercises/meetup/{MeetupExample.swift → Sources/MeetupExample.swift} +1 -1
  232. data/tracks/swift/exercises/meetup/Sources/deleteme.swift +1 -0
  233. data/tracks/swift/exercises/meetup/Tests/LinuxMain.swift +6 -0
  234. data/tracks/swift/exercises/meetup/{MeetupTest.swift → Tests/MeetupTests/MeetupTests.swift} +17 -5
  235. data/tracks/swift/exercises/minesweeper/.gitignore +4 -0
  236. data/tracks/swift/exercises/minesweeper/Package.swift +5 -0
  237. data/tracks/swift/exercises/minesweeper/{MinesweeperExample.swift → Sources/MinesweeperExample.swift} +8 -2
  238. data/tracks/swift/exercises/minesweeper/Sources/deleteme.swift +1 -0
  239. data/tracks/swift/exercises/minesweeper/Tests/LinuxMain.swift +6 -0
  240. data/tracks/swift/exercises/minesweeper/{MinesweeperTest.swift → Tests/MinesweeperTests/MinesweeperTests.swift} +19 -6
  241. data/tracks/swift/exercises/nth-prime/.gitignore +4 -0
  242. data/tracks/swift/exercises/nth-prime/Package.swift +5 -0
  243. data/tracks/swift/exercises/nth-prime/{NthPrimeExample.swift → Sources/NthPrimeExample.swift} +5 -1
  244. data/tracks/swift/exercises/nth-prime/Sources/deleteme.swift +1 -0
  245. data/tracks/swift/exercises/nth-prime/Tests/LinuxMain.swift +6 -0
  246. data/tracks/swift/exercises/nth-prime/Tests/NthPrimeTests/NthPrimeTests.swift +34 -0
  247. data/tracks/swift/exercises/nucleotide-count/.gitignore +4 -0
  248. data/tracks/swift/exercises/nucleotide-count/Package.swift +5 -0
  249. data/tracks/swift/exercises/nucleotide-count/{NucleotideCountExample.swift → Sources/NucleotideCountExample.swift} +1 -1
  250. data/tracks/swift/exercises/nucleotide-count/Sources/deleteme.swift +1 -0
  251. data/tracks/swift/exercises/nucleotide-count/Tests/LinuxMain.swift +6 -0
  252. data/tracks/swift/exercises/nucleotide-count/{NucleotideCountTest.swift → Tests/NucleotideCountTests/NucleotideCountTests.swift} +17 -5
  253. data/tracks/swift/exercises/ocr-numbers/.gitignore +4 -0
  254. data/tracks/swift/exercises/ocr-numbers/Package.swift +5 -0
  255. data/tracks/swift/exercises/ocr-numbers/{OcrNumbersExample.swift → Sources/OcrNumbersExample.swift} +0 -0
  256. data/tracks/swift/exercises/ocr-numbers/Sources/deleteme.swift +1 -0
  257. data/tracks/swift/exercises/ocr-numbers/Tests/LinuxMain.swift +6 -0
  258. data/tracks/swift/exercises/ocr-numbers/{OcrNumbersTest.swift → Tests/OcrNumbersTests/OcrNumbersTests.swift} +25 -5
  259. data/tracks/swift/exercises/octal/.gitignore +4 -0
  260. data/tracks/swift/exercises/octal/Package.swift +5 -0
  261. data/tracks/swift/exercises/octal/{OctalExample.swift → Sources/OctalExample.swift} +5 -1
  262. data/tracks/swift/exercises/octal/Sources/deleteme.swift +1 -0
  263. data/tracks/swift/exercises/octal/Tests/LinuxMain.swift +6 -0
  264. data/tracks/swift/exercises/octal/{OctalTest.swift → Tests/OctalTests/OctalTests.swift} +22 -5
  265. data/tracks/swift/exercises/palindrome-products/.gitignore +4 -0
  266. data/tracks/swift/exercises/palindrome-products/Package.swift +5 -0
  267. data/tracks/swift/exercises/palindrome-products/{PalindromeProductsExample.swift → Sources/PalindromeProductsExample.swift} +1 -0
  268. data/tracks/swift/exercises/palindrome-products/Sources/deleteme.swift +1 -0
  269. data/tracks/swift/exercises/palindrome-products/Tests/LinuxMain.swift +6 -0
  270. data/tracks/swift/exercises/palindrome-products/{PalindromeProductsTest.swift → Tests/PalindromeProductsTests/PalindromeProductsTests.swift} +12 -5
  271. data/tracks/swift/exercises/pangram/.gitignore +4 -0
  272. data/tracks/swift/exercises/pangram/Package.swift +5 -0
  273. data/tracks/swift/exercises/pangram/{PangramExample.swift → Sources/PangramExample.swift} +0 -0
  274. data/tracks/swift/exercises/pangram/Sources/deleteme.swift +1 -0
  275. data/tracks/swift/exercises/pangram/Tests/LinuxMain.swift +6 -0
  276. data/tracks/swift/exercises/pangram/{PangramTest.swift → Tests/PangramTests/PangramTests.swift} +16 -5
  277. data/tracks/swift/exercises/pascals-triangle/.gitignore +4 -0
  278. data/tracks/swift/exercises/pascals-triangle/Package.swift +5 -0
  279. data/tracks/swift/exercises/pascals-triangle/{PascalsTriangleExample.swift → Sources/PascalsTriangleExample.swift} +0 -0
  280. data/tracks/swift/exercises/pascals-triangle/Sources/deleteme.swift +1 -0
  281. data/tracks/swift/exercises/pascals-triangle/Tests/LinuxMain.swift +6 -0
  282. data/tracks/swift/exercises/pascals-triangle/{PascalsTriangleTest.swift → Tests/PascalsTriangleTests/PascalsTriangleTests.swift} +13 -5
  283. data/tracks/swift/exercises/perfect-numbers/.gitignore +4 -0
  284. data/tracks/swift/exercises/perfect-numbers/Package.swift +5 -0
  285. data/tracks/swift/exercises/perfect-numbers/{PerfectNumbersExample.swift → Sources/PerfectNumbersExample.swift} +0 -0
  286. data/tracks/swift/exercises/perfect-numbers/Sources/deleteme.swift +1 -0
  287. data/tracks/swift/exercises/perfect-numbers/Tests/LinuxMain.swift +6 -0
  288. data/tracks/swift/exercises/perfect-numbers/{PerfectNumbersTest.swift → Tests/PerfectNumbersTests/PerfectNumbersTests.swift} +11 -4
  289. data/tracks/swift/exercises/phone-number/.gitignore +4 -0
  290. data/tracks/swift/exercises/phone-number/Package.swift +5 -0
  291. data/tracks/swift/exercises/phone-number/{PhoneNumberExample.swift → Sources/PhoneNumberExample.swift} +2 -0
  292. data/tracks/swift/exercises/phone-number/Sources/deleteme.swift +1 -0
  293. data/tracks/swift/exercises/phone-number/Tests/LinuxMain.swift +6 -0
  294. data/tracks/swift/exercises/phone-number/{PhoneNumberTest.swift → Tests/PhoneNumberTests/PhoneNumberTests.swift} +16 -5
  295. data/tracks/swift/exercises/pig-latin/.gitignore +4 -0
  296. data/tracks/swift/exercises/pig-latin/Package.swift +5 -0
  297. data/tracks/swift/exercises/pig-latin/{PigLatinExample.swift → Sources/PigLatinExample.swift} +2 -0
  298. data/tracks/swift/exercises/pig-latin/Sources/deleteme.swift +1 -0
  299. data/tracks/swift/exercises/pig-latin/Tests/LinuxMain.swift +6 -0
  300. data/tracks/swift/exercises/pig-latin/{PigLatinTest.swift → Tests/PigLatinTests/PigLatinTests.swift} +22 -4
  301. data/tracks/swift/exercises/poker/.gitignore +4 -0
  302. data/tracks/swift/exercises/poker/Package.swift +5 -0
  303. data/tracks/swift/exercises/poker/{PokerExample.swift → Sources/PokerExample.swift} +3 -1
  304. data/tracks/swift/exercises/poker/Sources/deleteme.swift +1 -0
  305. data/tracks/swift/exercises/poker/Tests/LinuxMain.swift +6 -0
  306. data/tracks/swift/exercises/poker/{PokerTest.swift → Tests/PokerTests/PokerTests.swift} +10 -5
  307. data/tracks/swift/exercises/prime-factors/.gitignore +4 -0
  308. data/tracks/swift/exercises/prime-factors/Package.swift +5 -0
  309. data/tracks/swift/exercises/prime-factors/{PrimeFactorsExample.swift → Sources/PrimeFactorsExample.swift} +0 -0
  310. data/tracks/swift/exercises/prime-factors/Sources/deleteme.swift +1 -0
  311. data/tracks/swift/exercises/prime-factors/Tests/LinuxMain.swift +6 -0
  312. data/tracks/swift/exercises/prime-factors/{PrimeFactorsTest.swift → Tests/PrimeFactorsTests/PrimeFactorsTests.swift} +18 -5
  313. data/tracks/swift/exercises/pythagorean-triplet/.gitignore +4 -0
  314. data/tracks/swift/exercises/pythagorean-triplet/Package.swift +5 -0
  315. data/tracks/swift/exercises/pythagorean-triplet/{PythagoreanTripletExample.swift → Sources/PythagoreanTripletExample.swift} +5 -1
  316. data/tracks/swift/exercises/pythagorean-triplet/Sources/deleteme.swift +1 -0
  317. data/tracks/swift/exercises/pythagorean-triplet/Tests/LinuxMain.swift +6 -0
  318. data/tracks/swift/exercises/pythagorean-triplet/{PythagoreanTripletTest.swift → Tests/PythagoreanTripletTests/PythagoreanTripletTests.swift} +15 -4
  319. data/tracks/swift/exercises/queen-attack/.gitignore +4 -0
  320. data/tracks/swift/exercises/queen-attack/Package.swift +5 -0
  321. data/tracks/swift/exercises/queen-attack/{QueenAttackExample.swift → Sources/QueenAttackExample.swift} +0 -0
  322. data/tracks/swift/exercises/queen-attack/Sources/deleteme.swift +1 -0
  323. data/tracks/swift/exercises/queen-attack/Tests/LinuxMain.swift +6 -0
  324. data/tracks/swift/exercises/queen-attack/{QueenAttackTest.swift → Tests/QueenAttackTests/QueenAttackTests.swift} +24 -6
  325. data/tracks/swift/exercises/raindrops/.gitignore +4 -0
  326. data/tracks/swift/exercises/raindrops/Package.swift +5 -0
  327. data/tracks/swift/exercises/raindrops/{RaindropsExample.swift → Sources/RaindropsExample.swift} +0 -0
  328. data/tracks/swift/exercises/raindrops/Sources/deleteme.swift +1 -0
  329. data/tracks/swift/exercises/raindrops/Tests/LinuxMain.swift +6 -0
  330. data/tracks/swift/exercises/raindrops/{RaindropsTest.swift → Tests/RaindropsTests/RaindropsTests.swift} +23 -5
  331. data/tracks/swift/exercises/rna-transcription/.gitignore +4 -0
  332. data/tracks/swift/exercises/rna-transcription/Package.swift +5 -0
  333. data/tracks/swift/exercises/rna-transcription/{RnaTranscriptionExample.swift → Sources/RnaTranscriptionExample.swift} +0 -0
  334. data/tracks/swift/exercises/rna-transcription/Sources/deleteme.swift +1 -0
  335. data/tracks/swift/exercises/rna-transcription/Tests/LinuxMain.swift +6 -0
  336. data/tracks/swift/exercises/rna-transcription/Tests/RnaTranscriptionTests/RnaTranscriptionTests.swift +34 -0
  337. data/tracks/swift/exercises/robot-name/.gitignore +4 -0
  338. data/tracks/swift/exercises/robot-name/Package.swift +5 -0
  339. data/tracks/swift/exercises/robot-name/{RobotNameExample.swift → Sources/RobotNameExample.swift} +9 -4
  340. data/tracks/swift/exercises/robot-name/Sources/deleteme.swift +1 -0
  341. data/tracks/swift/exercises/robot-name/Tests/LinuxMain.swift +6 -0
  342. data/tracks/swift/exercises/robot-name/{RobotNameTest.swift → Tests/RobotNameTests/RobotNameTests.swift} +19 -5
  343. data/tracks/swift/exercises/robot-simulator/.gitignore +4 -0
  344. data/tracks/swift/exercises/robot-simulator/Package.swift +5 -0
  345. data/tracks/swift/exercises/robot-simulator/{RobotSimulatorExample.swift → Sources/RobotSimulatorExample.swift} +0 -0
  346. data/tracks/swift/exercises/robot-simulator/Sources/deleteme.swift +1 -0
  347. data/tracks/swift/exercises/robot-simulator/Tests/LinuxMain.swift +6 -0
  348. data/tracks/swift/exercises/robot-simulator/{RobotSimulatorTest.swift → Tests/RobotSimulatorTests/RobotSimulatorTests.swift} +31 -5
  349. data/tracks/swift/exercises/roman-numerals/.gitignore +4 -0
  350. data/tracks/swift/exercises/roman-numerals/Package.swift +5 -0
  351. data/tracks/swift/exercises/roman-numerals/{RomanNumeralsExample.swift → Sources/RomanNumeralsExample.swift} +0 -0
  352. data/tracks/swift/exercises/roman-numerals/Sources/deleteme.swift +1 -0
  353. data/tracks/swift/exercises/roman-numerals/Tests/LinuxMain.swift +6 -0
  354. data/tracks/swift/exercises/roman-numerals/{RomanNumeralsTest.swift → Tests/RomanNumeralsTests/RomanNumeralsTests.swift} +25 -5
  355. data/tracks/swift/exercises/run-length-encoding/.gitignore +4 -0
  356. data/tracks/swift/exercises/run-length-encoding/Package.swift +5 -0
  357. data/tracks/swift/exercises/run-length-encoding/{RunLengthEncodingExample.swift → Sources/RunLengthEncodingExample.swift} +0 -0
  358. data/tracks/swift/exercises/run-length-encoding/Sources/deleteme.swift +1 -0
  359. data/tracks/swift/exercises/run-length-encoding/Tests/LinuxMain.swift +6 -0
  360. data/tracks/swift/exercises/run-length-encoding/{RunLengthEncodingTest.swift → Tests/RunLengthEncodingTests/RunLengthEncodingTests.swift} +15 -5
  361. data/tracks/swift/exercises/saddle-points/.gitignore +4 -0
  362. data/tracks/swift/exercises/saddle-points/Package.swift +5 -0
  363. data/tracks/swift/exercises/saddle-points/{SaddlePointsExample.swift → Sources/SaddlePointsExample.swift} +0 -0
  364. data/tracks/swift/exercises/saddle-points/Sources/deleteme.swift +1 -0
  365. data/tracks/swift/exercises/saddle-points/Tests/LinuxMain.swift +6 -0
  366. data/tracks/swift/exercises/saddle-points/{SaddlePointsTest.swift → Tests/SaddlePointsTests/SaddlePointsTests.swift} +17 -5
  367. data/tracks/swift/exercises/scrabble-score/.gitignore +4 -0
  368. data/tracks/swift/exercises/scrabble-score/Package.swift +5 -0
  369. data/tracks/swift/exercises/scrabble-score/{ScrabbleScoreExample.swift → Sources/ScrabbleScoreExample.swift} +2 -0
  370. data/tracks/swift/exercises/scrabble-score/Sources/deleteme.swift +1 -0
  371. data/tracks/swift/exercises/scrabble-score/Tests/LinuxMain.swift +6 -0
  372. data/tracks/swift/exercises/scrabble-score/{ScrabbleScoreTest.swift → Tests/ScrabbleScoreTests/ScrabbleScoreTests.swift} +16 -5
  373. data/tracks/swift/exercises/secret-handshake/.gitignore +4 -0
  374. data/tracks/swift/exercises/secret-handshake/Package.swift +5 -0
  375. data/tracks/swift/exercises/secret-handshake/{SecretHandshakeExample.swift → Sources/SecretHandshakeExample.swift} +0 -0
  376. data/tracks/swift/exercises/secret-handshake/Sources/deleteme.swift +1 -0
  377. data/tracks/swift/exercises/secret-handshake/Tests/LinuxMain.swift +6 -0
  378. data/tracks/swift/exercises/secret-handshake/{SecretHandshakeTest.swift → Tests/SecretHandshakeTests/SecretHandshakeTests.swift} +15 -5
  379. data/tracks/swift/exercises/series/.gitignore +4 -0
  380. data/tracks/swift/exercises/series/Package.swift +5 -0
  381. data/tracks/swift/exercises/series/{SeriesExample.swift → Sources/SeriesExample.swift} +0 -0
  382. data/tracks/swift/exercises/series/Sources/deleteme.swift +1 -0
  383. data/tracks/swift/exercises/series/Tests/LinuxMain.swift +6 -0
  384. data/tracks/swift/exercises/series/{SeriesTest.swift → Tests/SeriesTests/SeriesTests.swift} +21 -5
  385. data/tracks/swift/exercises/sieve/.gitignore +4 -0
  386. data/tracks/swift/exercises/sieve/Package.swift +5 -0
  387. data/tracks/swift/exercises/sieve/{SieveExample.swift → Sources/SieveExample.swift} +0 -0
  388. data/tracks/swift/exercises/sieve/Sources/deleteme.swift +1 -0
  389. data/tracks/swift/exercises/sieve/Tests/LinuxMain.swift +6 -0
  390. data/tracks/swift/exercises/sieve/{SieveTest.swift → Tests/SieveTests/SieveTests.swift} +9 -5
  391. data/tracks/swift/exercises/simple-cipher/.gitignore +4 -0
  392. data/tracks/swift/exercises/simple-cipher/Package.swift +5 -0
  393. data/tracks/swift/exercises/simple-cipher/{SimpleCipherExample.swift → Sources/SimpleCipherExample.swift} +14 -3
  394. data/tracks/swift/exercises/simple-cipher/Sources/deleteme.swift +1 -0
  395. data/tracks/swift/exercises/simple-cipher/Tests/LinuxMain.swift +6 -0
  396. data/tracks/swift/exercises/simple-cipher/{SimpleCipherTest.swift → Tests/SimpleCipherTests/SimpleCipherTests.swift} +22 -5
  397. data/tracks/swift/exercises/simple-linked-list/.gitignore +4 -0
  398. data/tracks/swift/exercises/simple-linked-list/Package.swift +5 -0
  399. data/tracks/swift/exercises/simple-linked-list/{SimpleLinkedListExample.swift → Sources/SimpleLinkedListExample.swift} +2 -2
  400. data/tracks/swift/exercises/simple-linked-list/Sources/deleteme.swift +1 -0
  401. data/tracks/swift/exercises/simple-linked-list/Tests/LinuxMain.swift +6 -0
  402. data/tracks/swift/exercises/simple-linked-list/{SimpleLinkedListTest.swift → Tests/SimpleLinkedListTests/SimpleLinkedListTests.swift} +16 -6
  403. data/tracks/swift/exercises/space-age/.gitignore +4 -0
  404. data/tracks/swift/exercises/space-age/Package.swift +5 -0
  405. data/tracks/swift/exercises/space-age/{SpaceAgeExample.swift → Sources/SpaceAgeExample.swift} +5 -1
  406. data/tracks/swift/exercises/space-age/Sources/deleteme.swift +1 -0
  407. data/tracks/swift/exercises/space-age/Tests/LinuxMain.swift +6 -0
  408. data/tracks/swift/exercises/space-age/{SpaceAgeTest.swift → Tests/SpaceAgeTests/SpaceAgeTests.swift} +17 -5
  409. data/tracks/swift/exercises/strain/.gitignore +4 -0
  410. data/tracks/swift/exercises/strain/Package.swift +5 -0
  411. data/tracks/swift/exercises/strain/{StrainExample.swift → Sources/StrainExample.swift} +0 -0
  412. data/tracks/swift/exercises/strain/Sources/deleteme.swift +1 -0
  413. data/tracks/swift/exercises/strain/Tests/LinuxMain.swift +6 -0
  414. data/tracks/swift/exercises/strain/{StrainTest.swift → Tests/StrainTests/StrainTests.swift} +20 -5
  415. data/tracks/swift/exercises/sublist/.gitignore +4 -0
  416. data/tracks/swift/exercises/sublist/Package.swift +5 -0
  417. data/tracks/swift/exercises/sublist/{SublistExample.swift → Sources/SublistExample.swift} +0 -0
  418. data/tracks/swift/exercises/sublist/Sources/deleteme.swift +1 -0
  419. data/tracks/swift/exercises/sublist/Tests/LinuxMain.swift +6 -0
  420. data/tracks/swift/exercises/sublist/{SubListTest.swift → Tests/SublistTests/SublistTests.swift} +24 -2
  421. data/tracks/swift/exercises/sum-of-multiples/.gitignore +4 -0
  422. data/tracks/swift/exercises/sum-of-multiples/Package.swift +5 -0
  423. data/tracks/swift/exercises/sum-of-multiples/{SumOfMultiplesExample.swift → Sources/SumOfMultiplesExample.swift} +0 -0
  424. data/tracks/swift/exercises/sum-of-multiples/Sources/deleteme.swift +1 -0
  425. data/tracks/swift/exercises/sum-of-multiples/Tests/LinuxMain.swift +6 -0
  426. data/tracks/swift/exercises/sum-of-multiples/{SumOfMultiplesTest.swift → Tests/SumOfMultiplesTests/SumOfMultiplesTests.swift} +18 -5
  427. data/tracks/swift/exercises/tournament/.gitignore +4 -0
  428. data/tracks/swift/exercises/tournament/Package.swift +5 -0
  429. data/tracks/swift/exercises/tournament/{TournamentExample.swift → Sources/TournamentExample.swift} +8 -9
  430. data/tracks/swift/exercises/tournament/Sources/deleteme.swift +1 -0
  431. data/tracks/swift/exercises/tournament/Tests/LinuxMain.swift +6 -0
  432. data/tracks/swift/exercises/tournament/{TournamentTest.swift → Tests/TournamentTests/TournamentTests.swift} +12 -8
  433. data/tracks/swift/exercises/transpose/.gitignore +4 -0
  434. data/tracks/swift/exercises/transpose/Package.swift +5 -0
  435. data/tracks/swift/exercises/transpose/{TransposeExample.swift → Sources/TransposeExample.swift} +2 -0
  436. data/tracks/swift/exercises/transpose/Sources/deleteme.swift +1 -0
  437. data/tracks/swift/exercises/transpose/Tests/LinuxMain.swift +6 -0
  438. data/tracks/swift/exercises/transpose/{TransposeTest.swift → Tests/TransposeTests/TransposeTests.swift} +18 -5
  439. data/tracks/swift/exercises/triangle/.gitignore +4 -0
  440. data/tracks/swift/exercises/triangle/Package.swift +5 -0
  441. data/tracks/swift/exercises/triangle/{TriangleExample.swift → Sources/TriangleExample.swift} +0 -0
  442. data/tracks/swift/exercises/triangle/Sources/deleteme.swift +1 -0
  443. data/tracks/swift/exercises/triangle/Tests/LinuxMain.swift +6 -0
  444. data/tracks/swift/exercises/triangle/{TriangleTest.swift → Tests/TriangleTests/TriangleTests.swift} +22 -5
  445. data/tracks/swift/exercises/trinary/.gitignore +4 -0
  446. data/tracks/swift/exercises/trinary/Package.swift +5 -0
  447. data/tracks/swift/exercises/trinary/{TrinaryExample.swift → Sources/TrinaryExample.swift} +5 -1
  448. data/tracks/swift/exercises/trinary/Sources/deleteme.swift +1 -0
  449. data/tracks/swift/exercises/trinary/Tests/LinuxMain.swift +6 -0
  450. data/tracks/swift/exercises/trinary/{TrinaryTest.swift → Tests/TrinaryTests/TrinaryTests.swift} +17 -5
  451. data/tracks/swift/exercises/twelve-days/.gitignore +4 -0
  452. data/tracks/swift/exercises/twelve-days/Package.swift +5 -0
  453. data/tracks/swift/exercises/twelve-days/Sources/TwelveDaysExample.swift +24 -0
  454. data/tracks/swift/exercises/twelve-days/Sources/deleteme.swift +1 -0
  455. data/tracks/swift/exercises/twelve-days/Tests/LinuxMain.swift +6 -0
  456. data/tracks/swift/exercises/twelve-days/{TwelveDaysTest.swift → Tests/TwelveDaysTests/TwelveDaysTests.swift} +21 -4
  457. data/tracks/swift/exercises/word-count/.gitignore +4 -0
  458. data/tracks/swift/exercises/word-count/Package.swift +5 -0
  459. data/tracks/swift/exercises/word-count/{WordCountExample.swift → Sources/WordCountExample.swift} +1 -1
  460. data/tracks/swift/exercises/word-count/Sources/deleteme.swift +1 -0
  461. data/tracks/swift/exercises/word-count/Tests/LinuxMain.swift +6 -0
  462. data/tracks/swift/exercises/word-count/{WordCountTest.swift → Tests/WordCountTests/WordCountTests.swift} +18 -10
  463. data/tracks/swift/exercises/wordy/.gitignore +4 -0
  464. data/tracks/swift/exercises/wordy/Package.swift +5 -0
  465. data/tracks/swift/exercises/wordy/{WordyExample.swift → Sources/WordyExample.swift} +6 -4
  466. data/tracks/swift/exercises/wordy/Sources/deleteme.swift +1 -0
  467. data/tracks/swift/exercises/wordy/Tests/LinuxMain.swift +6 -0
  468. data/tracks/swift/exercises/wordy/{WordyTest.swift → Tests/WordyTests/WordyTests.swift} +23 -5
  469. data/tracks/swift/xswift-test-spm +5 -0
  470. metadata +460 -167
  471. data/tracks/swift/docs/img/tests_001-splash.png +0 -0
  472. data/tracks/swift/docs/img/tests_002-templateChooser.png +0 -0
  473. data/tracks/swift/docs/img/tests_003-nameProject.jpg +0 -0
  474. data/tracks/swift/docs/img/tests_004-saveProject.jpg +0 -0
  475. data/tracks/swift/docs/img/tests_005-folderLayout.png +0 -0
  476. data/tracks/swift/docs/img/tests_006-newProjectInitial.jpg +0 -0
  477. data/tracks/swift/docs/img/tests_007-fileInspectorUpdate.png +0 -0
  478. data/tracks/swift/docs/img/tests_008-templateChooserSwift.png +0 -0
  479. data/tracks/swift/docs/img/tests_009-importTestSource.png +0 -0
  480. data/tracks/swift/docs/img/tests_010-testsImportExample.png +0 -0
  481. data/tracks/swift/docs/img/tests_011-finalLayoutExample.png +0 -0
  482. data/tracks/swift/exercises/etl/EtlTest.swift +0 -51
  483. data/tracks/swift/exercises/nth-prime/NthPrimeTest.swift +0 -27
  484. data/tracks/swift/exercises/rna-transcription/RnaTranscriptionTest.swift +0 -27
  485. data/tracks/swift/exercises/twelve-days/TwelveDaysExample.swift +0 -24
  486. data/tracks/swift/xcodeProject/xSwift Tests/Info.plist +0 -24
  487. data/tracks/swift/xcodeProject/xSwift.xcodeproj/project.pbxproj +0 -1521
  488. data/tracks/swift/xcodeProject/xSwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  489. data/tracks/swift/xcodeProject/xSwift.xcodeproj/xcshareddata/xcschemes/xSwiftTests.xcscheme +0 -99
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d2be37cbc31136941811e051179467879b92babc
4
- data.tar.gz: 14dfc0634c8eacfb96344447eb05bc63dfaafe3d
3
+ metadata.gz: 93c7f99da67e82bacb69b2baa1335f4fe2fcc2da
4
+ data.tar.gz: 789b2e7a4936b344dcefb2dcf594d603889c762f
5
5
  SHA512:
6
- metadata.gz: f9e6fcb733742f7201eca5aff89b7e19de23e040ff3809a77aff1459483226f59b2bab528e70b862149656512677e018025f367be6233c23dfb2e8769b6f9ed5
7
- data.tar.gz: b39e788481896ab1b612425a7922dd249defb2c7b6c30091c15b9deeca895ecfc421372d2023c11bfde097ec4297166b9e5917949774a83697ddba7c8d0ea40c
6
+ metadata.gz: d558ac9c0cea44feb34714b50a7447eda5c3cc0ff7f3ac6c8e9e357f073117ea060ae7b3867d3be38d2f37903275c5b07196bc1c6870754956c7081bb5a33bb0
7
+ data.tar.gz: d206b1b48daee6f9d5a178f4c50dadec5874bfbf42a0103671bdae92d5994c2c2d116ba6f0e119d538c2204a1b2ddd0c9f8e459c4d2bc0982bb5d5efb6b7bf0b
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.0.6.15"
2
+ VERSION = "2.0.6.16"
3
3
  end
@@ -145,7 +145,11 @@
145
145
  {
146
146
  "difficulty": 1,
147
147
  "slug": "etl",
148
- "topics": []
148
+ "topics": [
149
+ "Control-flow (loops)",
150
+ "Maps",
151
+ "Transforming"
152
+ ]
149
153
  },
150
154
  {
151
155
  "difficulty": 1,
@@ -12,15 +12,20 @@ import (
12
12
  // (Clock) Add(minutes int) Clock
13
13
  //
14
14
  // The Add method should also handle subtraction by accepting negative values.
15
- // To satisfy the readme requirement about clocks being equal, values of
16
- // your Clock type need to work with the == operator.
15
+
16
+ // To satisfy the README requirement about clocks being equal, values of
17
+ // your Clock type need to work with the == operator. This means that if your
18
+ // New function returns a pointer rather than a value, your clocks will
19
+ // probably not work with ==.
20
+ //
21
+ // While the time.Time type in the standard library (https://golang.org/pkg/time/#Time)
22
+ // doesn't necessarily need to be used as a basis for your Clock type, it might
23
+ // help to look at how constructors there (Date and Now) return values rather
24
+ // than pointers. Note also how most time.Time methods have value receivers
25
+ // rather than pointer receivers.
17
26
  //
18
- // It might help to study the time.Time type in the standard library
19
- // (https://golang.org/pkg/time/#Time) as a model. See how constructors there
20
- // (Date and Now) return Time values rather than pointers. Note also how
21
- // most time.Time methods have value receivers rather than pointer receivers.
22
- // For more background on this read
23
- // https://github.com/golang/go/wiki/CodeReviewComments#receiver-type.
27
+ // For some useful guidelines on when to use a value receiver or a pointer
28
+ // receiver see: https://github.com/golang/go/wiki/CodeReviewComments#receiver-type
24
29
 
25
30
  const targetTestVersion = 4
26
31
 
@@ -0,0 +1,43 @@
1
+ <!--- Provide a general summary of the issue in the Title above -->
2
+
3
+ ## Expected Behavior
4
+ <!--- If you're describing a bug, tell us what should happen -->
5
+ <!--- If you're suggesting a change/improvement, tell us how it should work -->
6
+
7
+ ## Current Behavior
8
+ <!--- If describing a bug, tell us what happens instead of the expected behavior -->
9
+ <!--- If suggesting a change/improvement, explain the difference from current behavior -->
10
+
11
+ ## Possible Solution
12
+ <!--- Not obligatory, but suggest a fix/reason for the bug, -->
13
+ <!--- or ideas how to implement the addition or change -->
14
+
15
+ ## Steps to Reproduce (for bugs)
16
+ <!--- Provide a link to a live example, or an unambiguous set of steps to -->
17
+ <!--- reproduce this bug. Include code to reproduce, if relevant -->
18
+ 1.
19
+ 2.
20
+ 3.
21
+ 4.
22
+
23
+ ## Context
24
+ <!--- How has this issue affected you? What are you trying to accomplish? -->
25
+ <!--- Providing context helps us come up with a solution that is most useful in the real world -->
26
+
27
+ ## Your Environment
28
+ <!--- Include as many relevant details about the environment you experienced the bug in -->
29
+ * Version used:
30
+ * Environment name and version (e.g. Chrome 39, node.js 5.4):
31
+ * Operating System and version (desktop or mobile):
32
+ * Link to your project:
33
+
34
+ ## Task List
35
+
36
+ * [ ] First Task
37
+ * [ ] Second Task
38
+ * [ ] Third Task
39
+
40
+ ## References and Closures
41
+
42
+ <!--- refernces #000 --->
43
+ <!--- closes #000 --->
@@ -0,0 +1,36 @@
1
+ <!--- Provide a general summary of your changes in the Title above -->
2
+
3
+ ## Description
4
+ <!--- Describe your changes in detail -->
5
+
6
+ ## Motivation and Context
7
+ <!--- Why is this change required? What problem does it solve? -->
8
+ <!--- If it fixes an open issue, please link to the issue here. -->
9
+
10
+ ## How Has This Been Tested?
11
+ <!--- Please describe in detail how you tested your changes. -->
12
+ <!--- Include details of your testing environment, and the tests you ran to -->
13
+ <!--- see how your change affects other areas of the code, etc. -->
14
+
15
+ ## Screenshots (if appropriate):
16
+
17
+ ## Types of changes
18
+ <!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
19
+ - [ ] Bug fix (non-breaking change which fixes an issue)
20
+ - [ ] New feature (non-breaking change which adds functionality)
21
+ - [ ] Breaking change (fix or feature that would cause existing functionality to change)
22
+
23
+ ## References and Closures
24
+
25
+ <!--- refernces #000 -->
26
+ <!--- closes #000 -->
27
+
28
+ ## Checklist:
29
+ <!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
30
+ <!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
31
+ - [ ] My change requires a change to the documentation.
32
+ - [ ] My change relies on a pending issue/pull request
33
+ - [ ] I have updated the documentation accordingly.
34
+ - [ ] I have read the **CONTRIBUTING** document.
35
+ - [ ] I have added tests to cover my changes.
36
+ - [ ] All new and existing tests passed.
@@ -1,15 +1,20 @@
1
- variable_name:
2
- min_length:
1
+ variable_name:
2
+ min_length:
3
3
  warning: 1
4
4
  error: 0
5
5
 
6
+ colon:
7
+ apply_to_dictionaries: false
8
+
6
9
  force_try: warning
7
10
 
8
11
  opt_in_rules:
9
12
  - vertical_whitespace
10
-
13
+ - closure_spacing
14
+
11
15
  disabled_rules: # rule identifiers to exclude from running
12
16
  - function_body_length
13
17
  - line_length
18
+ - trailing_comma
14
19
 
15
20
  reporter: "json"
@@ -1,21 +1,30 @@
1
- language: objective-c
2
- osx_image: xcode8
3
- xcode_project: 'xcodeProject/xSwift.xcodeproj'
4
- xcode_scheme: 'xSwiftTests'
1
+ language: generic
5
2
 
6
3
  before_install:
7
- - gem install danger xcpretty xcpretty-json-formatter
8
- - brew update
9
- - brew outdated swiftlint || brew upgrade swiftlint
10
-
11
- script:
12
- - bin/fetch-configlet
13
- - bin/configlet .
14
- - swiftlint lint --quiet >> lintreport.json
15
- - xcodebuild test -project 'xcodeProject/xSwift.xcodeproj' -scheme 'xSwiftTests' | xcpretty -f `xcpretty-json-formatter`
4
+ - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then gem install danger ; fi
5
+ - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi
6
+ - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew outdated swiftlint || brew upgrade swiftlint ; fi
7
+
8
+ matrix:
9
+ include:
10
+ - script:
11
+ - swiftlint lint --quiet >> lintreport.json
12
+ - ls
13
+ - ./xswift-test-spm
14
+ env: JOB=SPM
15
+ os: osx
16
+ osx_image: xcode8.2
17
+ - script:
18
+ - bin/fetch-configlet
19
+ - bin/configlet .
20
+ - docker run -v `pwd`:/xswift norionomura/sourcekit:302 bash -c "cd /xswift && ./xswift-test-spm"
21
+ env: JOB=Linux
22
+ sudo: required
23
+ services: docker
16
24
 
17
25
  after_success:
18
- - danger
19
- - ls -al
20
- - python -m json.tool lintreport.json
21
- - python -m json.tool build/reports/errors.json
26
+ - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then danger ; fi
27
+ - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ls -al ; fi
28
+
29
+
30
+
@@ -42,10 +42,3 @@ json.each do |object|
42
42
  message(msg, file: shortFile, line: line)
43
43
  end
44
44
  end
45
-
46
- # Reports when the test passed
47
- jsonpath2 = "build/reports/errors.json"
48
- contents2 = File.read jsonpath2
49
- json2 = JSON.parse contents2
50
- firstStrinInArray = json2["tests_summary_messages"][0]
51
- message(firstStrinInArray)
@@ -0,0 +1,26 @@
1
+ import PackageDescription
2
+ import Foundation
3
+
4
+ let path = FileManager.default.currentDirectoryPath + "/config.json"
5
+ var allProblems = [String]()
6
+
7
+ if
8
+ let jsonData = try? Data(contentsOf: URL(fileURLWithPath: path), options: Data.ReadingOptions.mappedIfSafe) ,
9
+ let json = try? JSONSerialization.jsonObject(with: jsonData, options: []) ,
10
+ let jsonDict = json as? [String: Any],
11
+ let exercisesDict = jsonDict["exercises"] as? [[String:Any]],
12
+ let exercises = exercisesDict.map({$0["slug"]}) as? [String],
13
+ let deprecated = jsonDict["deprecated"] as? [String] {
14
+
15
+ allProblems += exercises
16
+ allProblems += deprecated
17
+ } else {
18
+ print("Could not parse config.json at \(path)")
19
+ }
20
+
21
+ let dependencies = allProblems.map { Package.Dependency.Package(url: "./exercises/\($0)/", majorVersion: 1) }
22
+
23
+ let package = Package(
24
+ name: "xswift",
25
+ dependencies: dependencies
26
+ )
@@ -8,7 +8,7 @@ Please see the [contributing guide](https://github.com/exercism/x-api/blob/maste
8
8
 
9
9
  ## Swift Track
10
10
 
11
- We use Travis CI to automatically run all the unit tests on the code that is going to be checked in. In addition we also have [SwiftLint](https://github.com/realm/SwiftLint) set up to make sure that the code is consistent across all exercises. Please run `swiftlint autocorrect --format` on your code before submitting a PR. Also in order for the tests to run they need to be added to the `xcodeProject` project. Make sure all the tests pass locally and that you are using the latest Xcode version otherwise the Travis checks may fail.
11
+ We use Travis CI to automatically run all the unit tests on the code that is going to be checked in. In addition we also have [SwiftLint](https://github.com/realm/SwiftLint) set up to make sure that the code is consistent across all exercises. Please run `swiftlint autocorrect --format` on your code before submitting a PR. Check the travis file to see which version of swift we are testing against. Make sure all the tests pass locally using the swift package manager. Keep in mind that we support Linux so the tests need to also pass on linux on Travis.
12
12
 
13
13
  ## License
14
14
 
@@ -1 +1,9 @@
1
- "Swift is an alternative for the Objective-C language that employs contemporary programming language theory concepts and strives to present a simpler syntax. Swift introduces true named parameters and retains key Objective-C concepts, including protocols, closures and categories, often replacing former syntax with cleaner versions and allowing these concepts to be applied to other language structures, like enums." - https://en.wikipedia.org/wiki/Swift_(programming_language)
1
+ Swift is a modern open source programming language that runs primarily on macOS and Linux. Swift was developed initially by Apple to interoperate with their key frameworks, Cocoa and CocoaTouch, both of which are mostly implemented in Objective-C.
2
+
3
+ Swift is influenced by a large number of existing programming languages, and it incorporates concepts from a wide range of programming methods, everything from scripting to object oriented and functional programming. Apple refers to Swift as a protocol oriented programming language and has expressed the goal of eventually making Swift useful for everything from scripts to an operating system.
4
+
5
+ This [Swift Tour](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html) is an introduction the language.
6
+
7
+ A [deeper overview](https://en.wikipedia.org/wiki/Swift_(programming_language)) of Swift from Wikipedia.
8
+
9
+ Swift is documented in [The Swift Programming Language](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/index.html) and in the [iBooks Store](https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11). The ePub is also available on [Swift.org](https://swift.org/documentation/#the-swift-programming-language).
@@ -1,9 +1,17 @@
1
1
  ## Installing Swift
2
2
 
3
- In order to use Swift, you must be running Xcode version 8.0 or greater.
3
+ ### macOS
4
+
5
+ In order to use the Swift exercises, install Xcode version 8.0 or greater. On the first launch of Xcode, install the command line tools when prompted.
4
6
 
5
7
  The current release version is available at the [Mac App Store](https://itunes.apple.com/us/app/xcode/id497799835?mt=12).
6
8
 
7
9
  Additional versions of Xcode (including the most recent beta) are available at [Apple's developer center](https://developer.apple.com/xcode/downloads/).
8
10
 
9
- All exercises tested with Xcode 8.0 using Swift 3
11
+ All exercises have been tested with Xcode 8.0 using Swift 3.
12
+
13
+ ### Linux
14
+
15
+ The latest release is available on [Swift.org](https://swift.org/download/#releases).
16
+
17
+ Swift.org installation [instructions](https://swift.org/getting-started/#installing-swift).
@@ -1,120 +1,85 @@
1
- ## Xcode Tutorial
1
+ ## Testing Tutorial
2
2
 
3
- This guide explains how to create and configure a Swift-based Xcode project for Exercism.
3
+ This guide explains how to run unit tests for the Exercism Swift exercises using either macOS or Linux.
4
4
 
5
- Apple does not support user-defined project templates in Xcode, and the default templates are more elaborate than those needed for Exercism. This guide bridges that gap.
6
-
7
- These instructions are written with the expectation that some readers will be very new to Xcode. Therefore each step is described in excruciating detail. However, after a few projects, setting up a fresh project should only take a minute.
8
-
9
- _As far as housekeeping chores go, you are closer to the finish line than it appears._
5
+ ### For experienced users:
6
+ 1. `swift test` runs tests
7
+ 2. `swift package generate-xcodeproj` creates an Xcode project
8
+
9
+ To run the tests from the command line, first `cd` to the directory for an exercise (for example, ~/exercism/swift/exercises/hello-world/), then execute `swift test`. This will compile the files in the Sources directory and execute the tests in the Tests directory. Alternatively, open the Xcode project and press Command-U.
10
10
 
11
11
  ### Overview
12
12
 
13
- To complete an Exercism exercise, you will work primarily with three files:
14
-
15
- * **Swift Source** (HelloWorld.swift). This is the file you will create to hold your source code and it is the file you will submit to Exercism.
16
- * **Test Source** (HelloWorldTest.swift). This file is provided by Exercism. It contains the XCTestCase subclass that defines the solution to the exercise. You never edit this file, but you will have to understand it in order to fulfill its expectations. This is also the file where you will trigger the tests and interpret the results.
17
- * **Playground** (MyPlayground.playground) is a scratchpad for drafting code snippets and playing with ideas. The code executes as you type, providing instant feedback.
18
-
19
- When you reach the end of this tutorial, the file inspector in Xcode will look like this.
20
-
21
- ![tests_011-finalLayoutExample](/docs/img/tests_011-finalLayoutExample.png)
22
-
23
- ### Create A New Xcode Project
13
+ The following instructions are written with the expectation that some readers will be very new to test driven development, Exercism, or Xcode. Each step is described in detail.
24
14
 
25
- ![tests_001-splash](/docs/img/tests_001-splash.png)
15
+ **macOS users are encouraged to use Xcode.** The Xcode environment provides detailed error messages compared to those available from the command line.
26
16
 
27
- 1. Choose the second item in the list shown above to create a new project, or press Command-Shift-N.
28
- 2. Select macOS from the row of buttons at the top of the dialog, then choose the Cocoa Application icon as shown in this image:
17
+ Exercism uses the [Swift Package Manager](https://github.com/apple/swift-package-manager/tree/master/Documentation) to package files and tests for Swift. Packages provide a complete set of source files that can be compiled and executed from the command line.
29
18
 
30
- ![tests_002-templatechooser](/docs/img/tests_002-templateChooser.png)
19
+ To complete an Exercism exercise, you will work primarily with two files:
31
20
 
32
- #### Name The Project
33
- ![tests_003-nameproject](/docs/img/tests_003-nameProject.jpg)
21
+ * **Swift Source** (hello-world/Sources/HelloWorld.swift). This is the code file you will submit to Exercism.
22
+ * **Test Source** (hello-world/Tests/HelloWorldTests/HelloWorldTest.swift). This file is provided by Exercism which contains the XCTestCase subclass that defines the solution to the exercise. You never edit this file, but you will have to understand it in order to fulfill its expectations.
34
23
 
35
- 1. Enter `HelloWorld` as the Product Name for the project. Spaces and some punctuation symbols are acceptable, but it is better to avoid them early on. _For other exercises, replace the string `HelloWorld` with the exercise name._
36
- 2. Fill in the Organization Name and Bundle Identifier. The Organization Name field will appear in each source file you create. The Bundle Identifier is not used in this context but should not be left blank.
37
- 3. The Language popup should be Swift, the Include Unit Tests checkbox should be selected. All other checkboxes should be deselected.
24
+ Optionally, Xcode can create a third file for experimentation:
38
25
 
39
- #### Save The Project
40
- ![tests_004-saveproject](/docs/img/tests_004-saveProject.jpg)
41
-
42
- 1. Choose a location to save the project. Anywhere is fine, but a good choice is inside the root folder of the current exercise.
43
- 2. In this example, the Exercism CLI fetched an exercise into a newly created root folder named `hello-world`. The fetched contents include a readme file `README.md` and a Test Source file `HelloWorldTest.swift`.
44
- 3. Create your project as shown in the above image, inside the root folder `hello-world`.
45
- 4. The contents displayed inside the Xcode File Inspector do not match the arrangement of the files on the disk. This is confusing at first, but it makes sense as projects become more complex. You will need a general idea of how the layout is different in order to import files later in this tutorial. If you switch to the Finder to explore the file hierarchy now, the files on disk should look like the image below. Essentially Xcode added a new project folder named `HelloWorld` (highlighted) to the root folder `hello-world`.
46
-
47
- ![tests_005-folderlayout](/docs/img/tests_005-folderLayout.png)
48
-
49
- #### Configure the Initial Files in the Project
50
-
51
- At this point the project's file inspector should look similar to the image on the left. If the `HelloWorldTests` folder is closed, click on the disclosure triangle to reveal its contents. Many of these files are not needed, so let's move them out of the way.
52
-
53
- ![tests_006-newprojectinitial](/docs/img/tests_006-newProjectInitial.jpg)
26
+ * **Playground** (MyPlayground.playground) is a scratchpad for drafting code snippets and playing with ideas. The code executes as you type, providing instant feedback.
54
27
 
55
- 1. Create a new group folder 'Support' inside the main group then drag the unused files into it. As with many tasks in Xcode, there is a shortcut. In this case you could also Command-Click to select all the unneeded files, and choose `File -> New -> Group from Selection` from the contextual menu.
56
- 2. Look at the image above on the right, note the file `HelloWorldTests.swift`. This file was provided by Xcode. Because Exercism supplies its own test file - often with a similar name - the default Xcode file is unnecessary and should be deleted. To delete the file, select it in the File Inspector and press the Delete key. In the confirmation dialog that appears, move the file to the trash.
57
- 3. Next, create a new playground document. First, make sure to select the topmost item in the File Inspector, the item marked with a blue icon that represents the project file.
58
- 4. Xcode provides several different options to create a new playground, including one called New Playground. However, in order for this step to work properly follow this exactly: press Command-N and choose Playground from the template chooser. Click Next, and click Create.
59
28
 
60
- At this stage, the File Inspector should appear like this:
29
+ ### Configuring Xcode
30
+ 1. `cd` to the directory for an exercise (for example, ~/exercism/swift/exercises/hello-world/), then execute `swift package generate-xcodeproj` in the Terminal. This creates an Xcode project in the current directory with the same name as the package. (The generated project file is ideal for unit tests, as it does not include overhead such as launching the iOS simulator or a target application.)
31
+ 2. Open the newly generated project file.
32
+ 3. At this point the project's file inspector should look similar to the following image. If the `HelloWorldTests` folder is closed, click on the disclosure triangle to reveal its contents.
33
+ 4. The items Package.swift, Configs, and Products are boilerplate that do not need modification.
61
34
 
62
- ![tests_007-fileInspectorUpdate](/docs/img/tests_007-fileInspectorUpdate.png)
35
+ ![file inspector](img/file-inspector.png)
63
36
 
64
- #### Make A New Swift Source File For Your Code
37
+ ### Running Tests with Xcode
65
38
 
66
- ![tests_008-templateChooserSwift](/docs/img/tests_008-templateChooserSwift.png)
39
+ Select the test file from the file inspector. You can trigger tests by clicking on one of the diamonds in the gutter of the Tests Source file. The diamond next to the class definition will run all the tests, whereas the diamond next to each individual test will run only that test.
67
40
 
68
- 1. Press Command-N to open the template chooser. Select macOS the Swift File icon, as shown above.
69
- 2. Near the bottom of the Save As dialog that appears next, set the Group to `HelloWorld` and select only `HelloWorld` from the Targets list.
70
- 3. The filename is up to you and can be changed later. The project name, `HelloWorld`, is a good first choice. By convention Swift classes and structs begin with a capital letter, so their source files should as well.
71
- 4. Click Create. **Note this is the file you will submit to the Exercism web site for review.**
41
+ ![tests](img/tests.png)
72
42
 
73
- *Xcode note: If the file appeared in the wrong place, drag it into its preferred position.*
43
+ Tests can also be invoked with Command-U, from the Test Inspector (Command-5), or from the sub-menu under the play button in the top bar. Red errors are normal at this stage.
74
44
 
75
- #### Import The Exercism Test Source File
45
+ ![failing tests](img/tests-fail.png)
76
46
 
77
- In the Finder, locate the root folder `hello-world` for this exercise. Drag the file `HelloWorldTest.swift` into the File Inspector so that it inserts into the `HelloWorldTests` group. When the import dialog appears, it should be set up like this:
47
+ Once all the tests are marked with a green icon, congratulations, you have successfully completed the exercise! Now submit it to the Exercism website for review. If you are impossibly stuck, submit the exercise before it is complete to view how other users solved the exercise.
78
48
 
79
- ![tests_009-importTestSource](/docs/img/tests_009-importTestSource.png)
49
+ ![passing tests](img/tests-pass.png)
80
50
 
81
- Select the newly imported file in the File Inspector to open the source code. Add the line `@testable import HelloWorld` above the class declaration. (When the Xcode project name contains a hyphen, replace it with an underscore. For example, `Word-Count` would become `Word_Count`.) The image below shows how the document should appear. Red errors are likely at this stage, and normal.
51
+ *The Hello-World exercise is a very simple coding problem, but the complexity of Xcode can make even simple exercises complex. We can ignore most of this complexity, because we only need to edit one file. You can always regenerate the Xcode project if something goes wrong.*
82
52
 
83
- ![tests_010-testsImportExample](/docs/img/tests_010-testsImportExample.png)
53
+ ### Xcode Playgrounds
84
54
 
85
- Here is how the file inspector should look now:
55
+ Playgrounds can be useful for brainstorming solutions to the problem. The playground continuously evaluates code as you type, displaying variable states and results as you type.
86
56
 
87
- ![011-finallayoutexample](/docs/img/tests_011-finalLayoutExample.png)
57
+ If you generated an Xcode project, follow these steps:
88
58
 
89
- The housekeeping is finished and Xcode is ready! To review:
59
+ 1. First, make sure to select the topmost item in the File Inspector, the item marked with a blue icon that represents the project file.
60
+ 2. Press Command-N and choose Playground from the template chooser. Click Next, and click Create.
90
61
 
91
- * **HelloWorld.swift** is the Swift Source code file where you code the solution and later submit it to Exercism.
92
- * **HelloWorldTest.swift** is the Test Source code file provided by Exercism. It contains the tests that define the exercise.
93
- * **MyPlayground.playground** is for drafting code snippets and playing with ideas.
62
+ Keep in mind that while playgrounds are useful for drafting code snippets and ideas, code must be moved to the Swift Source file for testing and submission.
94
63
 
95
64
  ### How Tests Are Used
96
65
 
97
- Test driven development is a very iterative process. The first step is to successfully run the tests (see the next section), and have them fail. Remember that the exercise can be solved with code in the application source file alone. Enter your solution into the Swift Source file. As you type, Xcode will continuously update the display with errors that highlight code that will not compile.
98
-
99
- One approach begins with creating a method that returns a correct hard coded value to at least the first test in order for the project to compile. This should confirm that Xcode is passing values between the code and tests properly. Next, create code that generates the expected return value and test again. Keep repeating this basic cycle until all the tests pass.
100
-
101
- #### Running The Tests
102
-
103
- Trigger a test by clicking on one of the diamonds in the gutter of the Tests Source file. The diamond next to the class definition will run all the tests, whereas the diamond next to each individual test will run only that test.
104
-
105
- Tests can also be invoked with Command-U, or from the Test Inspector (Command-5).
66
+ Test driven development is a very iterative process. The first step is to successfully run the tests and have them fail. Remember that the exercise can be solved with code in the application source file alone. Enter your solution into the Swift Source file. Xcode will continuously update the display with errors that highlight code that will not compile.
106
67
 
107
- Once all the tests are marked with a green icon, congratulations, you have successfully completed the exercise! Now submit it to the Exercism website for review. If you are impossibly stuck, submit the exercise before it is complete to view how other users solved the exercise.
108
-
109
- *The Hello-World exercise is a very simple coding problem, but the complexity of Xcode can make even simple exercises challenging. If creating a working solution is problematic, the issue may be with how the project is configured. Consider submitting the unfinished exercise to obtain a solution. Then try repeating this tutorial from the beginning with a fresh Xcode project.*
68
+ One approach begins with "sliming a test" by creating a method that returns a correct hard coded value. Sliming will confirm the project can compile and pass one test. Next, replace the hard coded value with code that generates the expected return value and test again. Keep repeating this cycle until all the tests pass.
110
69
 
111
- ### Submission
70
+ ## Submission
112
71
 
113
72
  1. In the Terminal, navigate to the folder that contains the application source file. In this example, the path would be `~/exercism/swift/hello-world/HelloWorld/HelloWorld/`
114
73
  2. To submit, type `exercism submit HelloWorld.swift` (_Alternatively, you can submit by using the file name with the full path from any directory. A second alternative is to locate the file you need to submit in the Finder. Open the Terminal, type exercism submit followed by a space, then drag the file from the Finder into the Terminal and press return._)
115
74
  3. Once uploaded, a URL will appear that reveals your solution on the Exercism web site.
116
75
  4. The Exercism CLI allows files to be submitted more than once, and each successive iteration will be added alongside the original.
117
76
 
77
+ To review:
78
+
79
+ * **HelloWorld.swift** is the Swift Source code file where you code the solution and later submit it to Exercism.
80
+ * **HelloWorldTest.swift** is the Test Source code file provided by Exercism. It contains the tests that define the exercise.
81
+ * **MyPlayground.playground** is for drafting code snippets and playing with ideas.
82
+
118
83
  ### Participate in Code Reviews
119
84
 
120
85
  After you submit a file, follow the URL presented to show the submission on the web. Bookmark it for future reference. From your submission page you can view how others solved the same problem.
@@ -123,7 +88,7 @@ After you submit a file, follow the URL presented to show the submission on the
123
88
 
124
89
  XCTestCase is the XCTest subclass that contains the test's methods and XCTAssert lines are the expected results. The results are different types depending on how the test is designed.
125
90
 
126
- There is a lot more to learn more about Test Driven Development, XCTAssert Methods and XCTestCase. Unfortunately up-to-date Swift documentation on these topics is short-lived. Although out of date as of when this tutorial was last updated, this curated list of sources contains useful information:
91
+ There is a lot more to learn more about Test Driven Development, XCTAssert Methods and XCTestCase. Unfortunately up-to-date Swift documentation on these topics is short-lived. Although out of date as of when this tutorial was last updated, this list of sources contains useful information:
127
92
 
128
93
  [Apple's Guide on XCTest](https://developer.apple.com/library/tvos/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/02-quick_start.html#//apple_ref/doc/uid/TP40014132-CH2-SW1)
129
94