trackler 2.0.0.8 → 2.0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (226) hide show
  1. checksums.yaml +4 -4
  2. data/common/exercises/bob/canonical-data.json +1 -20
  3. data/common/exercises/raindrops/canonical-data.json +18 -0
  4. data/common/exercises/sublist/canonical-data.json +5 -0
  5. data/lib/trackler/version.rb +1 -1
  6. data/tracks/clojure/config.json +5 -0
  7. data/tracks/clojure/exercises/pig-latin/project.clj +4 -0
  8. data/tracks/clojure/exercises/pig-latin/src/example.clj +49 -0
  9. data/tracks/clojure/exercises/pig-latin/test/pig_latin_test.clj +92 -0
  10. data/tracks/clojure/exercises/robot-name/src/example.clj +8 -11
  11. data/tracks/clojure/exercises/robot-name/test/robot_name_test.clj +23 -18
  12. data/tracks/crystal/config.json +6 -0
  13. data/tracks/crystal/exercises/acronym/spec/acronym_spec.cr +7 -7
  14. data/tracks/crystal/exercises/forth/spec/forth_spec.cr +198 -0
  15. data/tracks/crystal/exercises/forth/src/example.cr +187 -0
  16. data/tracks/crystal/exercises/hello-world/spec/hello_world_spec.cr +3 -3
  17. data/tracks/crystal/src/generator/exercises/acronym.cr +1 -1
  18. data/tracks/crystal/src/generator/exercises/exercise_generator.cr +3 -2
  19. data/tracks/crystal/src/generator/exercises/forth.cr +56 -0
  20. data/tracks/crystal/src/generator/exercises/templates/example.tt +2 -2
  21. data/tracks/crystal/src/generator/spec/exercise_generator_spec.cr +5 -3
  22. data/tracks/csharp/exercises/wordy/WordyTest.cs +2 -2
  23. data/tracks/elixir/config.json +83 -70
  24. data/tracks/fsharp/exercises/wordy/WordyTest.fs +1 -1
  25. data/tracks/go/config.json +28 -3
  26. data/tracks/go/exercises/all-your-base/all_your_base_test.go +185 -0
  27. data/tracks/go/exercises/all-your-base/example.go +60 -0
  28. data/tracks/go/exercises/isogram/example.go +15 -0
  29. data/tracks/go/exercises/isogram/isogram_test.go +50 -0
  30. data/tracks/go/exercises/ledger/ledger.go +2 -2
  31. data/tracks/go/exercises/pangram/example.go +32 -0
  32. data/tracks/go/exercises/pangram/pangram_test.go +43 -0
  33. data/tracks/go/exercises/protein-translation/example.go +59 -0
  34. data/tracks/go/exercises/protein-translation/protein_translation_test.go +69 -0
  35. data/tracks/go/exercises/tree-building/tree_building.go +1 -1
  36. data/tracks/go/exercises/twelve-days/example.go +57 -0
  37. data/tracks/go/exercises/twelve-days/twelve_days_test.go +79 -0
  38. data/tracks/haskell/.travis.yml +13 -8
  39. data/tracks/haskell/config.json +6 -0
  40. data/tracks/haskell/exercises/accumulate/stack.yaml +1 -1
  41. data/tracks/haskell/exercises/all-your-base/stack.yaml +1 -1
  42. data/tracks/haskell/exercises/allergies/stack.yaml +1 -1
  43. data/tracks/haskell/exercises/alphametics/stack.yaml +1 -1
  44. data/tracks/haskell/exercises/anagram/stack.yaml +1 -1
  45. data/tracks/haskell/exercises/atbash-cipher/stack.yaml +1 -1
  46. data/tracks/haskell/exercises/bank-account/stack.yaml +1 -1
  47. data/tracks/haskell/exercises/beer-song/stack.yaml +1 -1
  48. data/tracks/haskell/exercises/binary/stack.yaml +1 -1
  49. data/tracks/haskell/exercises/binary-search-tree/stack.yaml +1 -1
  50. data/tracks/haskell/exercises/bob/stack.yaml +1 -1
  51. data/tracks/haskell/exercises/bowling/HINTS.md +19 -0
  52. data/tracks/haskell/exercises/bowling/examples/success-standard/package.yaml +16 -0
  53. data/tracks/haskell/exercises/bowling/examples/success-standard/src/Bowling.hs +84 -0
  54. data/tracks/haskell/exercises/bowling/package.yaml +19 -0
  55. data/tracks/haskell/exercises/bowling/src/Bowling.hs +9 -0
  56. data/tracks/haskell/exercises/bowling/stack.yaml +1 -0
  57. data/tracks/haskell/exercises/bowling/test/Tests.hs +143 -0
  58. data/tracks/haskell/exercises/change/stack.yaml +1 -1
  59. data/tracks/haskell/exercises/clock/stack.yaml +1 -1
  60. data/tracks/haskell/exercises/connect/stack.yaml +1 -1
  61. data/tracks/haskell/exercises/crypto-square/stack.yaml +1 -1
  62. data/tracks/haskell/exercises/custom-set/stack.yaml +1 -1
  63. data/tracks/haskell/exercises/difference-of-squares/stack.yaml +1 -1
  64. data/tracks/haskell/exercises/dominoes/stack.yaml +1 -1
  65. data/tracks/haskell/exercises/etl/stack.yaml +1 -1
  66. data/tracks/haskell/exercises/food-chain/stack.yaml +1 -1
  67. data/tracks/haskell/exercises/forth/stack.yaml +1 -1
  68. data/tracks/haskell/exercises/gigasecond/stack.yaml +1 -1
  69. data/tracks/haskell/exercises/go-counting/stack.yaml +1 -1
  70. data/tracks/haskell/exercises/grade-school/stack.yaml +1 -1
  71. data/tracks/haskell/exercises/grains/stack.yaml +1 -1
  72. data/tracks/haskell/exercises/hamming/stack.yaml +1 -1
  73. data/tracks/haskell/exercises/hexadecimal/stack.yaml +1 -1
  74. data/tracks/haskell/exercises/house/stack.yaml +1 -1
  75. data/tracks/haskell/exercises/kindergarten-garden/stack.yaml +1 -1
  76. data/tracks/haskell/exercises/largest-series-product/stack.yaml +1 -1
  77. data/tracks/haskell/exercises/leap/stack.yaml +1 -1
  78. data/tracks/haskell/exercises/lens-person/stack.yaml +1 -1
  79. data/tracks/haskell/exercises/linked-list/stack.yaml +1 -1
  80. data/tracks/haskell/exercises/list-ops/stack.yaml +1 -1
  81. data/tracks/haskell/exercises/luhn/stack.yaml +1 -1
  82. data/tracks/haskell/exercises/matrix/stack.yaml +1 -1
  83. data/tracks/haskell/exercises/meetup/stack.yaml +1 -1
  84. data/tracks/haskell/exercises/minesweeper/stack.yaml +1 -1
  85. data/tracks/haskell/exercises/nth-prime/stack.yaml +1 -1
  86. data/tracks/haskell/exercises/nucleotide-count/stack.yaml +1 -1
  87. data/tracks/haskell/exercises/ocr-numbers/stack.yaml +1 -1
  88. data/tracks/haskell/exercises/octal/stack.yaml +1 -1
  89. data/tracks/haskell/exercises/palindrome-products/stack.yaml +1 -1
  90. data/tracks/haskell/exercises/parallel-letter-frequency/stack.yaml +1 -1
  91. data/tracks/haskell/exercises/pascals-triangle/stack.yaml +1 -1
  92. data/tracks/haskell/exercises/phone-number/stack.yaml +1 -1
  93. data/tracks/haskell/exercises/pig-latin/stack.yaml +1 -1
  94. data/tracks/haskell/exercises/pov/stack.yaml +1 -1
  95. data/tracks/haskell/exercises/prime-factors/stack.yaml +1 -1
  96. data/tracks/haskell/exercises/pythagorean-triplet/stack.yaml +1 -1
  97. data/tracks/haskell/exercises/queen-attack/stack.yaml +1 -1
  98. data/tracks/haskell/exercises/raindrops/stack.yaml +1 -1
  99. data/tracks/haskell/exercises/rna-transcription/stack.yaml +1 -1
  100. data/tracks/haskell/exercises/robot-name/stack.yaml +1 -1
  101. data/tracks/haskell/exercises/robot-simulator/stack.yaml +1 -1
  102. data/tracks/haskell/exercises/roman-numerals/stack.yaml +1 -1
  103. data/tracks/haskell/exercises/saddle-points/stack.yaml +1 -1
  104. data/tracks/haskell/exercises/say/stack.yaml +1 -1
  105. data/tracks/haskell/exercises/scrabble-score/stack.yaml +1 -1
  106. data/tracks/haskell/exercises/secret-handshake/stack.yaml +1 -1
  107. data/tracks/haskell/exercises/series/stack.yaml +1 -1
  108. data/tracks/haskell/exercises/sgf-parsing/stack.yaml +1 -1
  109. data/tracks/haskell/exercises/sieve/stack.yaml +1 -1
  110. data/tracks/haskell/exercises/simple-cipher/stack.yaml +1 -1
  111. data/tracks/haskell/exercises/simple-linked-list/stack.yaml +1 -1
  112. data/tracks/haskell/exercises/space-age/stack.yaml +1 -1
  113. data/tracks/haskell/exercises/strain/stack.yaml +1 -1
  114. data/tracks/haskell/exercises/sublist/stack.yaml +1 -1
  115. data/tracks/haskell/exercises/sum-of-multiples/stack.yaml +1 -1
  116. data/tracks/haskell/exercises/triangle/stack.yaml +1 -1
  117. data/tracks/haskell/exercises/trinary/stack.yaml +1 -1
  118. data/tracks/haskell/exercises/word-count/stack.yaml +1 -1
  119. data/tracks/haskell/exercises/wordy/stack.yaml +1 -1
  120. data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -1
  121. data/tracks/haskell/exercises/zipper/stack.yaml +1 -1
  122. data/tracks/java/config.json +13 -1
  123. data/tracks/java/exercises/etl/src/main/java/Etl.java +3 -3
  124. data/tracks/java/exercises/hello-world/GETTING_STARTED.md +1 -1
  125. data/tracks/java/exercises/hello-world/src/main/java/HelloWorld.java +3 -3
  126. data/tracks/java/exercises/minesweeper/build.gradle +17 -0
  127. data/tracks/java/exercises/minesweeper/src/example/java/MinesweeperBoard.java +111 -0
  128. data/tracks/java/exercises/minesweeper/src/main/java/MinesweeperBoard.java +5 -0
  129. data/tracks/java/exercises/minesweeper/src/test/java/MinesweeperBoardTest.java +295 -0
  130. data/tracks/java/exercises/nucleotide-count/src/test/java/NucleotideTest.java +67 -67
  131. data/tracks/java/exercises/series/build.gradle +18 -0
  132. data/tracks/java/exercises/series/src/example/java/Series.java +39 -0
  133. data/tracks/java/exercises/series/src/main/java/.keep +0 -0
  134. data/tracks/java/exercises/series/src/main/java/Series.java +3 -0
  135. data/tracks/java/exercises/series/src/test/java/.keep +0 -0
  136. data/tracks/java/exercises/series/src/test/java/SeriesTest.java +154 -0
  137. data/tracks/java/exercises/settings.gradle +2 -0
  138. data/tracks/javascript/exercises/custom-set/custom-set.spec.js +130 -84
  139. data/tracks/javascript/exercises/custom-set/example-gen.js +200 -0
  140. data/tracks/ocaml/Makefile +5 -1
  141. data/tracks/ocaml/config.json +2 -1
  142. data/tracks/ocaml/exercises/anagram/test.ml +35 -24
  143. data/tracks/ocaml/exercises/bob/example.ml +1 -1
  144. data/tracks/ocaml/exercises/bob/test.ml +53 -40
  145. data/tracks/ocaml/exercises/hamming/test.ml +41 -31
  146. data/tracks/ocaml/exercises/raindrops/test.ml +38 -39
  147. data/tracks/ocaml/tools/test-generator/.merlin +5 -0
  148. data/tracks/ocaml/tools/test-generator/Makefile +15 -0
  149. data/tracks/ocaml/tools/test-generator/_tags +0 -0
  150. data/tracks/ocaml/tools/test-generator/src/codegen.ml +17 -0
  151. data/tracks/ocaml/tools/test-generator/src/codegen.mli +7 -0
  152. data/tracks/ocaml/tools/test-generator/src/leap.json +39 -0
  153. data/tracks/ocaml/tools/test-generator/src/model.ml +31 -0
  154. data/tracks/ocaml/tools/test-generator/src/parser.ml +61 -0
  155. data/tracks/ocaml/tools/test-generator/src/parser.mli +9 -0
  156. data/tracks/ocaml/tools/test-generator/src/special_cases.ml +12 -0
  157. data/tracks/ocaml/tools/test-generator/src/special_cases.mli +7 -0
  158. data/tracks/ocaml/tools/test-generator/src/test_gen.ml +25 -0
  159. data/tracks/ocaml/tools/test-generator/src/test_generator.ml +62 -0
  160. data/tracks/ocaml/tools/test-generator/src/test_generator.mli +6 -0
  161. data/tracks/ocaml/tools/test-generator/src/utils.ml +32 -0
  162. data/tracks/ocaml/tools/test-generator/src/utils.mli +18 -0
  163. data/tracks/ocaml/tools/test-generator/templates/anagram/template.ml +17 -0
  164. data/tracks/ocaml/tools/test-generator/templates/bob/template.ml +15 -0
  165. data/tracks/ocaml/tools/test-generator/templates/hamming/template.ml +30 -0
  166. data/tracks/ocaml/tools/test-generator/templates/leap/template.ml +15 -0
  167. data/tracks/ocaml/tools/test-generator/templates/raindrops/template.ml +15 -0
  168. data/tracks/ocaml/tools/test-generator/templates/word-count/template.ml +19 -0
  169. data/tracks/ocaml/tools/test-generator/test/all_tests.ml +11 -0
  170. data/tracks/ocaml/tools/test-generator/test/codegen_test.ml +20 -0
  171. data/tracks/ocaml/tools/test-generator/test/model_test.ml +27 -0
  172. data/tracks/ocaml/tools/test-generator/test/parser_test.ml +73 -0
  173. data/tracks/ocaml/tools/test-generator/test/special_cases_test.ml +22 -0
  174. data/tracks/ocaml/tools/test-generator/test/test_generator_test.ml +11 -0
  175. data/tracks/ocaml/tools/test-generator/test/utils_test.ml +21 -0
  176. data/tracks/perl5/config.json +1 -1
  177. data/tracks/perl6/accumulate/accumulate.t +8 -2
  178. data/tracks/perl6/anagram/Example.pm +1 -1
  179. data/tracks/perl6/anagram/anagram.t +7 -8
  180. data/tracks/perl6/binary/Example.pm +1 -1
  181. data/tracks/perl6/binary/binary.t +7 -8
  182. data/tracks/perl6/bob/bob.t +1 -3
  183. data/tracks/perl6/config.json +1 -0
  184. data/tracks/perl6/grains/grains.t +7 -2
  185. data/tracks/perl6/leap/leap.t +3 -1
  186. data/tracks/perl6/raindrops/raindrops.t +8 -2
  187. data/tracks/perl6/rna-transcription/rna_transcription.t +8 -9
  188. data/tracks/perl6/robot-name/robot.t +8 -9
  189. data/tracks/perl6/scrabble-score/Example.pm +1 -1
  190. data/tracks/perl6/scrabble-score/scrabble_score.t +8 -2
  191. data/tracks/perl6/word-count/word_count.t +8 -2
  192. data/tracks/php/config.json +5 -0
  193. data/tracks/php/exercises/markdown/example.php +85 -0
  194. data/tracks/php/exercises/markdown/markdown.php +82 -0
  195. data/tracks/php/exercises/markdown/markdown_test.php +57 -0
  196. data/tracks/python/exercises/hamming/example.py +3 -0
  197. data/tracks/python/exercises/hamming/hamming_test.py +40 -14
  198. data/tracks/python/exercises/rna-transcription/example.py +6 -1
  199. data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +9 -0
  200. data/tracks/ruby/config.json +6 -0
  201. data/tracks/ruby/exercises/dominoes/.version +1 -0
  202. data/tracks/ruby/exercises/dominoes/dominoes_test.rb +149 -0
  203. data/tracks/ruby/exercises/dominoes/example.rb +37 -0
  204. data/tracks/ruby/exercises/dominoes/example.tt +57 -0
  205. data/tracks/ruby/exercises/pangram/.version +1 -1
  206. data/tracks/ruby/exercises/pangram/example.rb +2 -2
  207. data/tracks/ruby/exercises/pangram/example.tt +5 -7
  208. data/tracks/ruby/exercises/pangram/pangram_test.rb +30 -25
  209. data/tracks/ruby/exercises/queen-attack/.version +1 -0
  210. data/tracks/ruby/exercises/queen-attack/example.rb +5 -30
  211. data/tracks/ruby/exercises/queen-attack/example.tt +22 -0
  212. data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +46 -95
  213. data/tracks/ruby/exercises/triangle/.version +1 -0
  214. data/tracks/ruby/exercises/triangle/example.rb +15 -22
  215. data/tracks/ruby/exercises/triangle/example.tt +20 -0
  216. data/tracks/ruby/exercises/triangle/triangle_test.rb +80 -40
  217. data/tracks/ruby/lib/dominoes_cases.rb +23 -0
  218. data/tracks/ruby/lib/pangram_cases.rb +19 -4
  219. data/tracks/ruby/lib/queen_attack_cases.rb +54 -0
  220. data/tracks/ruby/lib/triangle_cases.rb +51 -0
  221. data/tracks/scala/config.json +6 -0
  222. data/tracks/scala/exercises/dominoes/Example.scala +41 -0
  223. data/tracks/scala/exercises/dominoes/build.sbt +3 -0
  224. data/tracks/scala/exercises/dominoes/src/main/scala/Dominoes.scala +4 -0
  225. data/tracks/scala/exercises/dominoes/src/test/scala/DominoesSuite.scala +91 -0
  226. metadata +83 -2
@@ -4,61 +4,66 @@ gem 'minitest', '>= 5.0.0'
4
4
  require 'minitest/autorun'
5
5
  require_relative 'pangram'
6
6
 
7
- # Test data version:
8
- # deb225e Implement canonical dataset for scrabble-score problem (#255)
9
-
7
+ # Test data version: # 2adfe21
10
8
  class PangramTest < Minitest::Test
11
9
  def test_sentence_empty
12
- str = ''
13
- refute Pangram.is_pangram?(str)
10
+ # skip
11
+ phrase = ''
12
+ refute Pangram.pangram?(phrase), "#{phrase.inspect} is NOT a pangram"
14
13
  end
15
14
 
16
15
  def test_pangram_with_only_lower_case
17
16
  skip
18
- str = 'the quick brown fox jumps over the lazy dog'
19
- assert Pangram.is_pangram?(str)
17
+ phrase = 'the quick brown fox jumps over the lazy dog'
18
+ assert Pangram.pangram?(phrase), "#{phrase.inspect} IS a pangram"
20
19
  end
21
20
 
22
21
  def test_missing_character_x
23
22
  skip
24
- str = 'a quick movement of the enemy will jeopardize five gunboats'
25
- refute Pangram.is_pangram?(str)
23
+ phrase = 'a quick movement of the enemy will jeopardize five gunboats'
24
+ refute Pangram.pangram?(phrase), "#{phrase.inspect} is NOT a pangram"
26
25
  end
27
26
 
28
27
  def test_another_missing_character_x
29
28
  skip
30
- str = 'the quick brown fish jumps over the lazy dog'
31
- refute Pangram.is_pangram?(str)
29
+ phrase = 'the quick brown fish jumps over the lazy dog'
30
+ refute Pangram.pangram?(phrase), "#{phrase.inspect} is NOT a pangram"
32
31
  end
33
32
 
34
33
  def test_pangram_with_underscores
35
34
  skip
36
- str = 'the_quick_brown_fox_jumps_over_the_lazy_dog'
37
- assert Pangram.is_pangram?(str)
35
+ phrase = 'the_quick_brown_fox_jumps_over_the_lazy_dog'
36
+ assert Pangram.pangram?(phrase), "#{phrase.inspect} IS a pangram"
38
37
  end
39
38
 
40
39
  def test_pangram_with_numbers
41
40
  skip
42
- str = 'the 1 quick brown fox jumps over the 2 lazy dogs'
43
- assert Pangram.is_pangram?(str)
41
+ phrase = 'the 1 quick brown fox jumps over the 2 lazy dogs'
42
+ assert Pangram.pangram?(phrase), "#{phrase.inspect} IS a pangram"
44
43
  end
45
44
 
46
45
  def test_missing_letters_replaced_by_numbers
47
46
  skip
48
- str = '7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog'
49
- refute Pangram.is_pangram?(str)
47
+ phrase = '7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog'
48
+ refute Pangram.pangram?(phrase), "#{phrase.inspect} is NOT a pangram"
50
49
  end
51
50
 
52
51
  def test_pangram_with_mixed_case_and_punctuation
53
52
  skip
54
- str = '"Five quacking Zephyrs jolt my wax bed."'
55
- assert Pangram.is_pangram?(str)
53
+ phrase = '"Five quacking Zephyrs jolt my wax bed."'
54
+ assert Pangram.pangram?(phrase), "#{phrase.inspect} IS a pangram"
56
55
  end
57
56
 
58
57
  def test_pangram_with_non_ascii_characters
59
58
  skip
60
- str = 'Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich.'
61
- assert Pangram.is_pangram?(str)
59
+ phrase = 'Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich.'
60
+ assert Pangram.pangram?(phrase), "#{phrase.inspect} IS a pangram"
61
+ end
62
+
63
+ def test_panagram_in_alphabet_other_than_ascii
64
+ skip
65
+ phrase = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства.'
66
+ refute Pangram.pangram?(phrase), "#{phrase.inspect} is NOT a pangram"
62
67
  end
63
68
 
64
69
  # Problems in exercism evolve over time, as we find better ways to ask
@@ -67,8 +72,9 @@ class PangramTest < Minitest::Test
67
72
  # not your solution.
68
73
  #
69
74
  # Define a constant named VERSION inside of the top level BookKeeping
70
- # module.
71
- # In your file, it will look like this:
75
+ # module, which may be placed near the end of your file.
76
+ #
77
+ # In your file, it will look like this:
72
78
  #
73
79
  # module BookKeeping
74
80
  # VERSION = 1 # Where the version number matches the one in the test.
@@ -76,9 +82,8 @@ class PangramTest < Minitest::Test
76
82
  #
77
83
  # If you are curious, read more about constants on RubyDoc:
78
84
  # http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html
79
-
80
85
  def test_bookkeeping
81
86
  skip
82
- assert_equal 2, BookKeeping::VERSION
87
+ assert_equal 3, BookKeeping::VERSION
83
88
  end
84
89
  end
@@ -1,3 +1,7 @@
1
+ module BookKeeping
2
+ VERSION = 2
3
+ end
4
+
1
5
  class Queens
2
6
  attr_reader :white, :black
3
7
  def initialize(positions = {})
@@ -12,18 +16,6 @@ class Queens
12
16
  on_horizontal? || on_vertical? || on_diagonal?
13
17
  end
14
18
 
15
- def to_s
16
- board = []
17
- (0..7).each do |row|
18
- positions = []
19
- (0..7).each do |column|
20
- positions << draw(row, column)
21
- end
22
- board[row] = positions.join(' ')
23
- end
24
- board.join("\n")
25
- end
26
-
27
19
  private
28
20
 
29
21
  def on_horizontal?
@@ -35,23 +27,6 @@ class Queens
35
27
  end
36
28
 
37
29
  def on_diagonal?
38
- white_diff.abs == black_diff.abs
39
- end
40
-
41
- def black_diff
42
- black[1] - black[0]
43
- end
44
-
45
- def white_diff
46
- white[1] - white[0]
47
- end
48
-
49
- def draw(row, column)
50
- case [row, column]
51
- when white then 'W'
52
- when black then 'B'
53
- else
54
- '_'
55
- end
30
+ (black[0] - white[0]).abs == (black[1] - white[1]).abs
56
31
  end
57
32
  end
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+ gem 'minitest', '>= 5.0.0'
3
+ require 'minitest/autorun'
4
+ require_relative 'queen_attack'
5
+
6
+ # Test data version:
7
+ # <%= sha1 %>
8
+ class QueenTest < Minitest::Test
9
+
10
+ <% test_cases.each do |test_case| %>
11
+ def <%= test_case.test_name %>
12
+ <%= test_case.skipped %>
13
+ <%= test_case.workload %>
14
+ end
15
+
16
+ <% end %>
17
+ <%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
18
+ def test_bookkeeping
19
+ skip
20
+ assert_equal <%= version.next %>, BookKeeping::VERSION
21
+ end
22
+ end
@@ -3,152 +3,103 @@ gem 'minitest', '>= 5.0.0'
3
3
  require 'minitest/autorun'
4
4
  require_relative 'queen_attack'
5
5
 
6
- class QueensTest < Minitest::Test
7
- def test_default_positions
8
- queens = Queens.new
9
- assert_equal [0, 3], queens.white
10
- assert_equal [7, 3], queens.black
11
- end
12
-
13
- def test_specific_placement
14
- skip
15
- queens = Queens.new(white: [3, 7], black: [6, 1])
16
- assert_equal [3, 7], queens.white
17
- assert_equal [6, 1], queens.black
18
- end
6
+ # Test data version:
7
+ # 82eb00d
8
+ class QueenTest < Minitest::Test
19
9
 
20
- def test_multiple_boards_simultaneously
21
- skip
22
- queens1 = Queens.new(white: [3, 7], black: [6, 1])
23
- queens2 = Queens.new(white: [5, 4], black: [7, 7])
24
- assert_equal [3, 7], queens1.white
25
- assert_equal [6, 1], queens1.black
26
- assert_equal [5, 4], queens2.white
27
- assert_equal [7, 7], queens2.black
10
+ def test_queen_with_a_valid_position
11
+ # skip
12
+ Queens.new white: [2, 2]
28
13
  end
29
14
 
30
- def test_cannot_occupy_same_space
15
+ def test_queen_must_have_positive_rank
31
16
  skip
32
17
  assert_raises ArgumentError do
33
- Queens.new(white: [2, 4], black: [2, 4])
18
+ Queens.new white: [-2, 2]
34
19
  end
35
20
  end
36
21
 
37
- def test_queen_must_have_positive_row
22
+ def test_queen_must_have_rank_on_board
38
23
  skip
39
24
  assert_raises ArgumentError do
40
- Queens.new(white: [-2, 2])
25
+ Queens.new white: [8, 4]
41
26
  end
42
27
  end
43
28
 
44
- def test_queen_must_have_positive_column
29
+ def test_queen_must_have_positive_file
45
30
  skip
46
31
  assert_raises ArgumentError do
47
- Queens.new(white: [2, -2])
32
+ Queens.new white: [2, -2]
48
33
  end
49
34
  end
50
35
 
51
- def test_queen_must_have_row_on_board
36
+ def test_queen_must_have_file_on_board
52
37
  skip
53
38
  assert_raises ArgumentError do
54
- Queens.new(white: [8, 4])
39
+ Queens.new white: [4, 8]
55
40
  end
56
41
  end
57
42
 
58
- def test_queen_must_have_column_on_board
43
+ def test_can_not_attack
59
44
  skip
60
- assert_raises ArgumentError do
61
- Queens.new(white: [4, 8])
62
- end
45
+ queens = Queens.new white: [2, 4], black: [6, 6]
46
+ refute queens.attack?
63
47
  end
64
48
 
65
- def test_string_representation
49
+ def test_can_attack_on_same_rank
66
50
  skip
67
- queens = Queens.new(white: [2, 4], black: [6, 6])
68
- board = <<-BOARD.chomp
69
- _ _ _ _ _ _ _ _
70
- _ _ _ _ _ _ _ _
71
- _ _ _ _ W _ _ _
72
- _ _ _ _ _ _ _ _
73
- _ _ _ _ _ _ _ _
74
- _ _ _ _ _ _ _ _
75
- _ _ _ _ _ _ B _
76
- _ _ _ _ _ _ _ _
77
- BOARD
78
- assert_equal board, queens.to_s
79
- end
80
-
81
- def test_another_string_representation
82
- skip
83
- queens = Queens.new(white: [7, 1], black: [0, 0])
84
- board = <<-BOARD.chomp
85
- B _ _ _ _ _ _ _
86
- _ _ _ _ _ _ _ _
87
- _ _ _ _ _ _ _ _
88
- _ _ _ _ _ _ _ _
89
- _ _ _ _ _ _ _ _
90
- _ _ _ _ _ _ _ _
91
- _ _ _ _ _ _ _ _
92
- _ W _ _ _ _ _ _
93
- BOARD
94
- assert_equal board, queens.to_s
95
- end
96
-
97
- def test_yet_another_string_representation
98
- skip
99
- queens = Queens.new(white: [4, 3], black: [3, 4])
100
- board = <<-BOARD.chomp
101
- _ _ _ _ _ _ _ _
102
- _ _ _ _ _ _ _ _
103
- _ _ _ _ _ _ _ _
104
- _ _ _ _ B _ _ _
105
- _ _ _ W _ _ _ _
106
- _ _ _ _ _ _ _ _
107
- _ _ _ _ _ _ _ _
108
- _ _ _ _ _ _ _ _
109
- BOARD
110
- assert_equal board, queens.to_s
111
- end
112
-
113
- def test_cannot_attack
114
- skip
115
- queens = Queens.new(white: [2, 3], black: [4, 7])
116
- assert !queens.attack?
117
- end
118
-
119
- def test_can_attack_on_same_row
120
- skip
121
- queens = Queens.new(white: [2, 4], black: [2, 7])
51
+ queens = Queens.new white: [2, 4], black: [2, 6]
122
52
  assert queens.attack?
123
53
  end
124
54
 
125
- def test_can_attack_on_same_column
55
+ def test_can_attack_on_same_file
126
56
  skip
127
- queens = Queens.new(white: [5, 4], black: [2, 4])
57
+ queens = Queens.new white: [4, 5], black: [2, 5]
128
58
  assert queens.attack?
129
59
  end
130
60
 
131
61
  def test_can_attack_on_first_diagonal
132
62
  skip
133
- queens = Queens.new(white: [1, 1], black: [6, 6])
63
+ queens = Queens.new white: [2, 2], black: [0, 4]
134
64
  assert queens.attack?
135
65
  end
136
66
 
137
67
  def test_can_attack_on_second_diagonal
138
68
  skip
139
- queens = Queens.new(white: [0, 6], black: [1, 7])
69
+ queens = Queens.new white: [2, 2], black: [3, 1]
140
70
  assert queens.attack?
141
71
  end
142
72
 
143
73
  def test_can_attack_on_third_diagonal
144
74
  skip
145
- queens = Queens.new(white: [4, 1], black: [6, 3])
75
+ queens = Queens.new white: [2, 2], black: [1, 1]
146
76
  assert queens.attack?
147
77
  end
148
78
 
149
79
  def test_can_attack_on_fourth_diagonal
150
80
  skip
151
- queens = Queens.new(white: [6, 1], black: [1, 6])
81
+ queens = Queens.new white: [2, 2], black: [5, 5]
152
82
  assert queens.attack?
153
83
  end
84
+
85
+ # Problems in exercism evolve over time, as we find better ways to ask
86
+ # questions.
87
+ # The version number refers to the version of the problem you solved,
88
+ # not your solution.
89
+ #
90
+ # Define a constant named VERSION inside of the top level BookKeeping
91
+ # module, which may be placed near the end of your file.
92
+ #
93
+ # In your file, it will look like this:
94
+ #
95
+ # module BookKeeping
96
+ # VERSION = 1 # Where the version number matches the one in the test.
97
+ # end
98
+ #
99
+ # If you are curious, read more about constants on RubyDoc:
100
+ # http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html
101
+ def test_bookkeeping
102
+ skip
103
+ assert_equal 2, BookKeeping::VERSION
104
+ end
154
105
  end
@@ -0,0 +1 @@
1
+ 1
@@ -1,44 +1,37 @@
1
- class TriangleError < RuntimeError
1
+ module BookKeeping
2
+ VERSION = 1
2
3
  end
3
4
 
4
5
  class Triangle
5
- attr_reader :a, :b, :c
6
- def initialize(a, b, c)
7
- @a = a
8
- @b = b
9
- @c = c
10
- end
6
+ attr_reader :sides
11
7
 
12
- def kind
13
- fail TriangleError if illegal?
14
- if equilateral?
15
- :equilateral
16
- elsif isosceles?
17
- :isosceles
18
- else
19
- :scalene
8
+ def initialize(sides)
9
+ @sides = sides
10
+ if illegal?
11
+ @sides = []
20
12
  end
21
13
  end
22
14
 
23
- private
24
-
25
- def sides
26
- @sides ||= [a, b, c]
27
- end
28
-
29
15
  def equilateral?
30
16
  sides.uniq.size == 1
31
17
  end
32
18
 
33
19
  def isosceles?
34
- sides.uniq.size == 2
20
+ sides.uniq.size.between?(1, 2)
35
21
  end
36
22
 
23
+ def scalene?
24
+ sides.uniq.size == 3
25
+ end
26
+
27
+ private
28
+
37
29
  def illegal?
38
30
  impossible_length_side? || violates_inequality?
39
31
  end
40
32
 
41
33
  def violates_inequality?
34
+ a, b, c = sides
42
35
  a + b <= c || a + c <= b || b + c <= a
43
36
  end
44
37
 
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+ gem 'minitest', '>= 5.0.0'
3
+ require 'minitest/autorun'
4
+ require_relative 'triangle'
5
+
6
+ # Test data version:
7
+ # <%= sha1 %>
8
+ class TriangleTest < Minitest::Test<% test_cases.each do |test_case| %>
9
+ def <%= test_case.test_name %>
10
+ <%= test_case.skipped %>
11
+ <%= test_case.workload %>
12
+ end
13
+ <% end %>
14
+ <%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
15
+ def test_bookkeeping
16
+ skip
17
+ assert_equal <%= version.next %>, BookKeeping::VERSION
18
+ end
19
+ end
20
+
@@ -3,91 +3,131 @@ gem 'minitest', '>= 5.0.0'
3
3
  require 'minitest/autorun'
4
4
  require_relative 'triangle'
5
5
 
6
+ # Test data version:
7
+ # b806246
6
8
  class TriangleTest < Minitest::Test
7
- def test_equilateral_triangles_have_equal_sides
8
- assert_equal :equilateral, Triangle.new(2, 2, 2).kind
9
+ def test_triangle_is_equilateral_if_all_sides_are_equal
10
+ # skip
11
+ triangle = Triangle.new([2, 2, 2])
12
+ assert triangle.equilateral?, "Expected 'true', triangle is equilateral."
9
13
  end
10
14
 
11
- def test_larger_equilateral_triangles_also_have_equal_sides
15
+ def test_triangle_is_not_equilateral_if_any_side_is_unequal
12
16
  skip
13
- assert_equal :equilateral, Triangle.new(10, 10, 10).kind
17
+ triangle = Triangle.new([2, 3, 2])
18
+ refute triangle.equilateral?, "Expected 'false', triangle is not equilateral."
14
19
  end
15
20
 
16
- def test_isosceles_triangles_have_last_two_sides_equal
21
+ def test_triangle_is_not_equilateral_if_no_sides_are_equal
17
22
  skip
18
- assert_equal :isosceles, Triangle.new(3, 4, 4).kind
23
+ triangle = Triangle.new([5, 4, 6])
24
+ refute triangle.equilateral?, "Expected 'false', triangle is not equilateral."
19
25
  end
20
26
 
21
- def test_isosceles_triangles_have_first_and_last_sides_equal
27
+ def test_all_zero_sides_are_illegal_so_the_triangle_is_not_equilateral
22
28
  skip
23
- assert_equal :isosceles, Triangle.new(4, 3, 4).kind
29
+ triangle = Triangle.new([0, 0, 0])
30
+ refute triangle.equilateral?, "Expected 'false', triangle is not equilateral."
24
31
  end
25
32
 
26
- def test_isosceles_triangles_have_two_first_sides_equal
33
+ def test_equilateral_triangle_sides_may_be_floats
27
34
  skip
28
- assert_equal :isosceles, Triangle.new(4, 4, 3).kind
35
+ triangle = Triangle.new([0.5, 0.5, 0.5])
36
+ assert triangle.equilateral?, "Expected 'true', triangle is equilateral."
29
37
  end
30
38
 
31
- def test_isosceles_triangles_have_in_fact_exactly_two_sides_equal
39
+ def test_triangle_is_isosceles_if_last_two_sides_are_equal
32
40
  skip
33
- assert_equal :isosceles, Triangle.new(10, 10, 2).kind
41
+ triangle = Triangle.new([3, 4, 4])
42
+ assert triangle.isosceles?, "Expected 'true', triangle is isosceles."
34
43
  end
35
44
 
36
- def test_isosceles_triangles_have_unequal_side_larger_than_equal_sides
45
+ def test_triangle_is_isosceles_if_first_two_sides_are_equal
37
46
  skip
38
- assert_equal :isosceles, Triangle.new(4, 7, 4).kind
47
+ triangle = Triangle.new([4, 4, 3])
48
+ assert triangle.isosceles?, "Expected 'true', triangle is isosceles."
39
49
  end
40
50
 
41
- def test_scalene_triangles_have_no_equal_sides
51
+ def test_triangle_is_isosceles_if_first_and_last_sides_are_equal
42
52
  skip
43
- assert_equal :scalene, Triangle.new(3, 4, 5).kind
53
+ triangle = Triangle.new([4, 3, 4])
54
+ assert triangle.isosceles?, "Expected 'true', triangle is isosceles."
44
55
  end
45
56
 
46
- def test_2a_equals_b_plus_c_looks_like_equilateral_but_is_not
57
+ def test_equilateral_triangles_are_also_isosceles
47
58
  skip
48
- assert_equal :scalene, Triangle.new(5, 4, 6).kind
59
+ triangle = Triangle.new([4, 4, 4])
60
+ assert triangle.isosceles?, "Expected 'true', triangle is isosceles."
49
61
  end
50
62
 
51
- def test_scalene_triangles_have_no_equal_sides_at_a_larger_scale_too
63
+ def test_triangle_is_not_isosceles_if_no_sides_are_equal
52
64
  skip
53
- assert_equal :scalene, Triangle.new(10, 11, 12).kind
65
+ triangle = Triangle.new([2, 3, 4])
66
+ refute triangle.isosceles?, "Expected 'false', triangle is not isosceles."
54
67
  end
55
68
 
56
- def test_scalene_triangles_have_no_equal_sides_in_descending_order_either
69
+ def test_sides_that_violate_triangle_inequality_are_not_isosceles_even_if_two_are_equal
57
70
  skip
58
- assert_equal :scalene, Triangle.new(5, 4, 2).kind
71
+ triangle = Triangle.new([1, 1, 3])
72
+ refute triangle.isosceles?, "Expected 'false', triangle is not isosceles."
59
73
  end
60
74
 
61
- def test_very_small_triangles_are_legal
75
+ def test_isosceles_triangle_sides_may_be_floats
62
76
  skip
63
- assert_equal :scalene, Triangle.new(0.4, 0.6, 0.3).kind
77
+ triangle = Triangle.new([0.5, 0.4, 0.5])
78
+ assert triangle.isosceles?, "Expected 'true', triangle is isosceles."
64
79
  end
65
80
 
66
- def test_triangles_with_no_size_are_illegal
81
+ def test_triangle_is_scalene_if_no_sides_are_equal
67
82
  skip
68
- assert_raises(TriangleError) do
69
- Triangle.new(0, 0, 0).kind
70
- end
83
+ triangle = Triangle.new([5, 4, 6])
84
+ assert triangle.scalene?, "Expected 'true', triangle is scalene."
71
85
  end
72
86
 
73
- def test_triangles_violating_triangle_inequality_are_illegal
87
+ def test_triangle_is_not_scalene_if_all_sides_are_equal
74
88
  skip
75
- assert_raises(TriangleError) do
76
- Triangle.new(1, 1, 3).kind
77
- end
89
+ triangle = Triangle.new([4, 4, 4])
90
+ refute triangle.scalene?, "Expected 'false', triangle is not scalene."
78
91
  end
79
92
 
80
- def test_triangles_violating_triangle_inequality_are_illegal_2
93
+ def test_triangle_is_not_scalene_if_two_sides_are_equal
81
94
  skip
82
- assert_raises(TriangleError) do
83
- Triangle.new(7, 3, 2).kind
84
- end
95
+ triangle = Triangle.new([4, 4, 3])
96
+ refute triangle.scalene?, "Expected 'false', triangle is not scalene."
85
97
  end
86
98
 
87
- def test_triangles_violating_triangle_inequality_are_illegal_3
99
+ def test_sides_that_violate_triangle_inequality_are_not_scalene_even_if_they_are_all_different
88
100
  skip
89
- assert_raises(TriangleError) do
90
- Triangle.new(1, 3, 1).kind
91
- end
101
+ triangle = Triangle.new([7, 3, 2])
102
+ refute triangle.scalene?, "Expected 'false', triangle is not scalene."
103
+ end
104
+
105
+ def test_scalene_triangle_sides_may_be_floats
106
+ skip
107
+ triangle = Triangle.new([0.5, 0.4, 0.6])
108
+ assert triangle.scalene?, "Expected 'true', triangle is scalene."
109
+ end
110
+
111
+ # Problems in exercism evolve over time, as we find better ways to ask
112
+ # questions.
113
+ # The version number refers to the version of the problem you solved,
114
+ # not your solution.
115
+ #
116
+ # Define a constant named VERSION inside of the top level BookKeeping
117
+ # module, which may be placed near the end of your file.
118
+ #
119
+ # In your file, it will look like this:
120
+ #
121
+ # module BookKeeping
122
+ # VERSION = 1 # Where the version number matches the one in the test.
123
+ # end
124
+ #
125
+ # If you are curious, read more about constants on RubyDoc:
126
+ # http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html
127
+
128
+ def test_bookkeeping
129
+ skip
130
+ assert_equal 1, BookKeeping::VERSION
92
131
  end
93
132
  end
133
+
@@ -0,0 +1,23 @@
1
+ class DominoesCase < OpenStruct
2
+ def test_name
3
+ 'test_%s' % description.gsub("can't", 'can not').gsub(/[= -]+/, '_')
4
+ end
5
+
6
+ def workload
7
+ <<-WL.chomp
8
+ input_dominoes = #{input}
9
+ output_chain = Dominoes.chain(input_dominoes)
10
+ #{can_chain ? 'assert' : 'refute' }_correct_chain(input_dominoes, output_chain)
11
+ WL
12
+ end
13
+
14
+ def skipped
15
+ index.zero? ? '# skip' : 'skip'
16
+ end
17
+ end
18
+
19
+ DominoesCases = proc do |data|
20
+ JSON.parse(data)['cases'].map.with_index do |row, i|
21
+ DominoesCase.new(row.merge('index' => i))
22
+ end
23
+ end