trackler 2.1.0.2 → 2.1.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/common/exercises/phone-number/canonical-data.json +28 -10
  3. data/common/exercises/phone-number/description.md +19 -13
  4. data/lib/trackler/version.rb +1 -1
  5. data/tracks/go/exercises/bob/.meta/gen.go +1 -3
  6. data/tracks/go/exercises/bob/bob.go +1 -1
  7. data/tracks/go/exercises/bob/bob_test.go +1 -1
  8. data/tracks/go/exercises/bob/cases_test.go +8 -12
  9. data/tracks/go/exercises/bob/example.go +1 -1
  10. data/tracks/go/exercises/largest-series-product/.meta/gen.go +1 -3
  11. data/tracks/go/exercises/largest-series-product/cases_test.go +3 -4
  12. data/tracks/go/exercises/largest-series-product/example.go +1 -1
  13. data/tracks/go/exercises/largest-series-product/largest_series_product_test.go +1 -1
  14. data/tracks/java/exercises/accumulate/src/test/java/AccumulateTest.java +4 -4
  15. data/tracks/java/exercises/acronym/src/test/java/AcronymTest.java +7 -7
  16. data/tracks/java/exercises/all-your-base/src/test/java/BaseConverterTest.java +19 -19
  17. data/tracks/java/exercises/allergies/src/test/java/AllergiesTest.java +18 -18
  18. data/tracks/java/exercises/anagram/src/test/java/AnagramTest.java +15 -15
  19. data/tracks/lisp/docs/INSTALLATION.md +7 -13
  20. data/tracks/python/exercises/bracket-push/bracket_push_test.py +4 -1
  21. data/tracks/python/exercises/isogram/isogram_test.py +5 -1
  22. data/tracks/ruby/README.md +14 -40
  23. data/tracks/ruby/exercises/binary/binary_test.rb +0 -1
  24. data/tracks/ruby/exercises/bracket-push/bracket_push_test.rb +1 -1
  25. data/tracks/ruby/exercises/grains/grains_test.rb +2 -0
  26. data/tracks/ruby/exercises/isogram/isogram_test.rb +0 -1
  27. data/tracks/ruby/exercises/largest-series-product/largest_series_product_test.rb +2 -1
  28. data/tracks/ruby/exercises/luhn/luhn_test.rb +2 -0
  29. data/tracks/ruby/exercises/pangram/pangram_test.rb +0 -1
  30. data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +1 -1
  31. data/tracks/ruby/exercises/rna-transcription/rna_transcription_test.rb +1 -1
  32. data/tracks/ruby/exercises/run-length-encoding/run_length_encoding_test.rb +0 -1
  33. data/tracks/ruby/exercises/say/say_test.rb +2 -0
  34. data/tracks/ruby/exercises/word-count/word_count_test.rb +1 -1
  35. data/tracks/ruby/exercises/wordy/wordy_test.rb +2 -0
  36. data/tracks/ruby/lib/acronym_cases.rb +1 -1
  37. data/tracks/ruby/lib/all_your_base_cases.rb +1 -1
  38. data/tracks/ruby/lib/alphametics_cases.rb +1 -1
  39. data/tracks/ruby/lib/anagram_cases.rb +1 -1
  40. data/tracks/ruby/lib/beer_song_cases.rb +1 -1
  41. data/tracks/ruby/lib/binary_cases.rb +1 -1
  42. data/tracks/ruby/lib/bowling_cases.rb +1 -1
  43. data/tracks/ruby/lib/bracket_push_cases.rb +1 -1
  44. data/tracks/ruby/lib/clock_cases.rb +1 -1
  45. data/tracks/ruby/lib/connect_cases.rb +1 -1
  46. data/tracks/ruby/lib/custom_set_cases.rb +1 -1
  47. data/tracks/ruby/lib/difference_of_squares_cases.rb +1 -1
  48. data/tracks/ruby/lib/dominoes_cases.rb +1 -1
  49. data/tracks/ruby/lib/generator/files/generator_cases.rb +29 -0
  50. data/tracks/ruby/lib/generator/files/track_files.rb +11 -27
  51. data/tracks/ruby/lib/generator/template_values.rb +8 -2
  52. data/tracks/ruby/{exercises/anagram/example.tt → lib/generator/test_template.erb} +2 -2
  53. data/tracks/ruby/lib/gigasecond_cases.rb +1 -0
  54. data/tracks/ruby/lib/grains_cases.rb +1 -1
  55. data/tracks/ruby/lib/hamming_cases.rb +2 -0
  56. data/tracks/ruby/lib/hello_world_cases.rb +1 -1
  57. data/tracks/ruby/lib/isogram_cases.rb +1 -1
  58. data/tracks/ruby/lib/largest_series_product_cases.rb +1 -1
  59. data/tracks/ruby/lib/leap_cases.rb +1 -1
  60. data/tracks/ruby/lib/luhn_cases.rb +2 -0
  61. data/tracks/ruby/lib/nth_prime_cases.rb +1 -1
  62. data/tracks/ruby/lib/ocr_numbers_cases.rb +2 -0
  63. data/tracks/ruby/lib/pangram_cases.rb +1 -1
  64. data/tracks/ruby/lib/pig_latin_cases.rb +2 -0
  65. data/tracks/ruby/lib/queen_attack_cases.rb +1 -1
  66. data/tracks/ruby/lib/raindrops_cases.rb +1 -1
  67. data/tracks/ruby/lib/rna_transcription_cases.rb +1 -1
  68. data/tracks/ruby/lib/roman_numerals_cases.rb +1 -1
  69. data/tracks/ruby/lib/run_length_encoding_cases.rb +8 -6
  70. data/tracks/ruby/lib/say_cases.rb +1 -1
  71. data/tracks/ruby/lib/sieve_cases.rb +10 -3
  72. data/tracks/ruby/lib/tournament_cases.rb +1 -1
  73. data/tracks/ruby/lib/transpose_cases.rb +1 -1
  74. data/tracks/ruby/lib/triangle_cases.rb +1 -1
  75. data/tracks/ruby/lib/two_bucket_cases.rb +1 -1
  76. data/tracks/ruby/lib/word_count_cases.rb +12 -1
  77. data/tracks/ruby/lib/wordy_cases.rb +1 -1
  78. data/tracks/ruby/test/fixtures/xruby/lib/beta_cases.rb +1 -1
  79. data/tracks/ruby/{exercises/acronym/example.tt → test/fixtures/xruby/lib/generator/test_template.erb} +0 -0
  80. data/tracks/ruby/test/generator/files/generate_cases_test.rb +33 -0
  81. data/tracks/ruby/test/generator/files/track_files_test.rb +14 -28
  82. data/tracks/ruby/test/generator/template_values_test.rb +22 -4
  83. data/tracks/rust/config.json +10 -0
  84. data/tracks/rust/exercises/run-length-encoding/Cargo.lock +4 -0
  85. data/tracks/rust/exercises/run-length-encoding/Cargo.toml +6 -0
  86. data/tracks/rust/exercises/run-length-encoding/example.rs +45 -0
  87. data/tracks/rust/exercises/run-length-encoding/tests/run-length-encoding.rs +86 -0
  88. metadata +11 -29
  89. data/tracks/ruby/exercises/binary/example.tt +0 -22
  90. data/tracks/ruby/exercises/bracket-push/example.tt +0 -21
  91. data/tracks/ruby/exercises/clock/example.tt +0 -21
  92. data/tracks/ruby/exercises/custom-set/example.tt +0 -21
  93. data/tracks/ruby/exercises/grains/example.tt +0 -19
  94. data/tracks/ruby/exercises/hamming/example.tt +0 -21
  95. data/tracks/ruby/exercises/isogram/example.tt +0 -22
  96. data/tracks/ruby/exercises/largest-series-product/example.tt +0 -20
  97. data/tracks/ruby/exercises/luhn/example.tt +0 -18
  98. data/tracks/ruby/exercises/nth-prime/example.tt +0 -21
  99. data/tracks/ruby/exercises/ocr-numbers/example.tt +0 -21
  100. data/tracks/ruby/exercises/pangram/example.tt +0 -22
  101. data/tracks/ruby/exercises/pig-latin/example.tt +0 -21
  102. data/tracks/ruby/exercises/queen-attack/example.tt +0 -21
  103. data/tracks/ruby/exercises/raindrops/example.tt +0 -21
  104. data/tracks/ruby/exercises/rna-transcription/example.tt +0 -21
  105. data/tracks/ruby/exercises/roman-numerals/example.tt +0 -21
  106. data/tracks/ruby/exercises/run-length-encoding/example.tt +0 -24
  107. data/tracks/ruby/exercises/say/example.tt +0 -19
  108. data/tracks/ruby/exercises/sieve/example.tt +0 -22
  109. data/tracks/ruby/exercises/triangle/example.tt +0 -21
  110. data/tracks/ruby/exercises/two-bucket/example.tt +0 -21
  111. data/tracks/ruby/exercises/word-count/example.tt +0 -23
  112. data/tracks/ruby/exercises/wordy/example.tt +0 -19
  113. data/tracks/ruby/lib/exercise_cases.rb +0 -2
@@ -20,7 +20,7 @@ public class AllergiesTest {
20
20
  assertEquals(false, allergies.isAllergicTo(Allergen.CATS));
21
21
  }
22
22
 
23
- @Ignore
23
+ @Ignore("Remove to run test")
24
24
  @Test
25
25
  public void allergicToEggs() {
26
26
  Allergies allergies = new Allergies(1);
@@ -28,7 +28,7 @@ public class AllergiesTest {
28
28
  assertEquals(true, allergies.isAllergicTo(Allergen.EGGS));
29
29
  }
30
30
 
31
- @Ignore
31
+ @Ignore("Remove to run test")
32
32
  @Test
33
33
  public void allergicToPeanuts() {
34
34
  Allergies allergies = new Allergies(2);
@@ -36,7 +36,7 @@ public class AllergiesTest {
36
36
  assertEquals(true, allergies.isAllergicTo(Allergen.PEANUTS));
37
37
  }
38
38
 
39
- @Ignore
39
+ @Ignore("Remove to run test")
40
40
  @Test
41
41
  public void allergicToShellfish() {
42
42
  Allergies allergies = new Allergies(4);
@@ -44,7 +44,7 @@ public class AllergiesTest {
44
44
  assertEquals(true, allergies.isAllergicTo(Allergen.SHELLFISH));
45
45
  }
46
46
 
47
- @Ignore
47
+ @Ignore("Remove to run test")
48
48
  @Test
49
49
  public void allergicToStrawberries() {
50
50
  Allergies allergies = new Allergies(8);
@@ -52,7 +52,7 @@ public class AllergiesTest {
52
52
  assertEquals(true, allergies.isAllergicTo(Allergen.STRAWBERRIES));
53
53
  }
54
54
 
55
- @Ignore
55
+ @Ignore("Remove to run test")
56
56
  @Test
57
57
  public void allergicToTomatoes() {
58
58
  Allergies allergies = new Allergies(16);
@@ -60,7 +60,7 @@ public class AllergiesTest {
60
60
  assertEquals(true, allergies.isAllergicTo(Allergen.TOMATOES));
61
61
  }
62
62
 
63
- @Ignore
63
+ @Ignore("Remove to run test")
64
64
  @Test
65
65
  public void allergicToChocolate() {
66
66
  Allergies allergies = new Allergies(32);
@@ -68,7 +68,7 @@ public class AllergiesTest {
68
68
  assertEquals(true, allergies.isAllergicTo(Allergen.CHOCOLATE));
69
69
  }
70
70
 
71
- @Ignore
71
+ @Ignore("Remove to run test")
72
72
  @Test
73
73
  public void allergicToPollen() {
74
74
  Allergies allergies = new Allergies(64);
@@ -76,7 +76,7 @@ public class AllergiesTest {
76
76
  assertEquals(true, allergies.isAllergicTo(Allergen.POLLEN));
77
77
  }
78
78
 
79
- @Ignore
79
+ @Ignore("Remove to run test")
80
80
  @Test
81
81
  public void allergicToCats() {
82
82
  Allergies allergies = new Allergies(128);
@@ -84,7 +84,7 @@ public class AllergiesTest {
84
84
  assertEquals(true, allergies.isAllergicTo(Allergen.CATS));
85
85
  }
86
86
 
87
- @Ignore
87
+ @Ignore("Remove to run test")
88
88
  @Test
89
89
  public void isAllergicToEggsInAdditionToOtherStuff() {
90
90
  Allergies allergies = new Allergies(5);
@@ -94,7 +94,7 @@ public class AllergiesTest {
94
94
  assertEquals(false, allergies.isAllergicTo(Allergen.STRAWBERRIES));
95
95
  }
96
96
 
97
- @Ignore
97
+ @Ignore("Remove to run test")
98
98
  @Test
99
99
  public void noAllergies() {
100
100
  Allergies allergies = new Allergies(0);
@@ -102,7 +102,7 @@ public class AllergiesTest {
102
102
  assertEquals(0, allergies.getList().size());
103
103
  }
104
104
 
105
- @Ignore
105
+ @Ignore("Remove to run test")
106
106
  @Test
107
107
  public void isAllergicToJustEggs() {
108
108
  Allergies allergies = new Allergies(1);
@@ -111,7 +111,7 @@ public class AllergiesTest {
111
111
  assertEquals(expectedAllergens, allergies.getList());
112
112
  }
113
113
 
114
- @Ignore
114
+ @Ignore("Remove to run test")
115
115
  @Test
116
116
  public void isAllergicToJustPeanuts() {
117
117
  Allergies allergies = new Allergies(2);
@@ -120,7 +120,7 @@ public class AllergiesTest {
120
120
  assertEquals(expectedAllergens, allergies.getList());
121
121
  }
122
122
 
123
- @Ignore
123
+ @Ignore("Remove to run test")
124
124
  @Test
125
125
  public void isAllergicToJustStrawberries() {
126
126
  Allergies allergies = new Allergies(8);
@@ -129,7 +129,7 @@ public class AllergiesTest {
129
129
  assertEquals(expectedAllergens, allergies.getList());
130
130
  }
131
131
 
132
- @Ignore
132
+ @Ignore("Remove to run test")
133
133
  @Test
134
134
  public void isAllergicToEggsAndPeanuts() {
135
135
  Allergies allergies = new Allergies(3);
@@ -141,7 +141,7 @@ public class AllergiesTest {
141
141
  assertEquals(expectedAllergens, allergies.getList());
142
142
  }
143
143
 
144
- @Ignore
144
+ @Ignore("Remove to run test")
145
145
  @Test
146
146
  public void isAllergicToEggsAndShellfish() {
147
147
  Allergies allergies = new Allergies(5);
@@ -153,7 +153,7 @@ public class AllergiesTest {
153
153
  assertEquals(expectedAllergens, allergies.getList());
154
154
  }
155
155
 
156
- @Ignore
156
+ @Ignore("Remove to run test")
157
157
  @Test
158
158
  public void isAllergicToLotsOfStuff() {
159
159
  Allergies allergies = new Allergies(248);
@@ -168,7 +168,7 @@ public class AllergiesTest {
168
168
  assertEquals(expectedAllergens, allergies.getList());
169
169
  }
170
170
 
171
- @Ignore
171
+ @Ignore("Remove to run test")
172
172
  @Test
173
173
  public void isAllergicToEverything() {
174
174
  Allergies allergies = new Allergies(255);
@@ -186,7 +186,7 @@ public class AllergiesTest {
186
186
  assertEquals(expectedAllergens, allergies.getList());
187
187
  }
188
188
 
189
- @Ignore
189
+ @Ignore("Remove to run test")
190
190
  @Test
191
191
  public void ignoreNonAllergenScoreParts() {
192
192
  Allergies allergies = new Allergies(509);
@@ -16,7 +16,7 @@ public class AnagramTest {
16
16
  assertTrue(detector.match(Arrays.asList("hello", "world", "zombies", "pants")).isEmpty());
17
17
  }
18
18
 
19
- @Ignore
19
+ @Ignore("Remove to run test")
20
20
  @Test
21
21
  public void testDetectSimpleAnagram() {
22
22
  Anagram detector = new Anagram("ant");
@@ -25,7 +25,7 @@ public class AnagramTest {
25
25
  assertThat(anagram.size(), is(1));
26
26
  }
27
27
 
28
- @Ignore
28
+ @Ignore("Remove to run test")
29
29
  @Test
30
30
  public void testDetectLongerAnagram() {
31
31
  Anagram detector = new Anagram("listen");
@@ -33,7 +33,7 @@ public class AnagramTest {
33
33
  assertThat(anagrams, hasItem("inlets"));
34
34
  }
35
35
 
36
- @Ignore
36
+ @Ignore("Remove to run test")
37
37
  @Test
38
38
  public void testDetectMultipleAnagrams() {
39
39
  Anagram detector = new Anagram("master");
@@ -41,7 +41,7 @@ public class AnagramTest {
41
41
  assertThat(anagrams, allOf(hasItem("maters"), hasItem("stream")));
42
42
  }
43
43
 
44
- @Ignore
44
+ @Ignore("Remove to run test")
45
45
  @Test
46
46
  public void testDetectMultipleAnagramsForLongerWord() {
47
47
  Anagram detector = new Anagram("allergy");
@@ -49,14 +49,14 @@ public class AnagramTest {
49
49
  assertThat(anagrams, allOf(hasItem("gallery"), hasItem("largely"), hasItem("regally")));
50
50
  }
51
51
 
52
- @Ignore
52
+ @Ignore("Remove to run test")
53
53
  @Test
54
54
  public void testDoesNotConfuseDifferentDuplicates() {
55
55
  Anagram detector = new Anagram("galea");
56
56
  assertTrue(detector.match(Arrays.asList("eagle")).isEmpty());
57
57
  }
58
58
 
59
- @Ignore
59
+ @Ignore("Remove to run test")
60
60
  @Test
61
61
  public void testIdenticalWordIsNotAnagram() {
62
62
  Anagram detector = new Anagram("corn");
@@ -65,35 +65,35 @@ public class AnagramTest {
65
65
  assertThat(anagrams.size(), is(1));
66
66
  }
67
67
 
68
- @Ignore
68
+ @Ignore("Remove to run test")
69
69
  @Test
70
70
  public void testIdenticalWordRepeatedIsNotAnagram() {
71
71
  Anagram detector = new Anagram("go");
72
72
  assertTrue(detector.match(Arrays.asList("go Go GO")).isEmpty());
73
73
  }
74
74
 
75
- @Ignore
75
+ @Ignore("Remove to run test")
76
76
  @Test
77
77
  public void testCapitalWordIsNotOwnAnagram() {
78
78
  Anagram detector = new Anagram("BANANA");
79
79
  assertTrue(detector.match(Arrays.asList("Banana")).isEmpty());
80
80
  }
81
81
 
82
- @Ignore
82
+ @Ignore("Remove to run test")
83
83
  @Test
84
84
  public void testEliminateAnagramsWithSameChecksum() {
85
85
  Anagram detector = new Anagram("mass");
86
86
  assertTrue(detector.match(Arrays.asList("last")).isEmpty());
87
87
  }
88
88
 
89
- @Ignore
89
+ @Ignore("Remove to run test")
90
90
  @Test
91
91
  public void testEliminateAnagramSubsets() {
92
92
  Anagram detector = new Anagram("good");
93
93
  assertTrue(detector.match(Arrays.asList("dog", "goody")).isEmpty());
94
94
  }
95
95
 
96
- @Ignore
96
+ @Ignore("Remove to run test")
97
97
  @Test
98
98
  public void testCaseInsensitiveWhenSubjectStartsWithUpperCaseLetter() {
99
99
  Anagram detector = new Anagram("Orchestra");
@@ -101,7 +101,7 @@ public class AnagramTest {
101
101
  assertThat(anagrams, hasItem("carthorse"));
102
102
  }
103
103
 
104
- @Ignore
104
+ @Ignore("Remove to run test")
105
105
  @Test
106
106
  public void testCaseInsensitiveWhenAnagramStartsWithUpperCaseLetter() {
107
107
  Anagram detector = new Anagram("orchestra");
@@ -109,7 +109,7 @@ public class AnagramTest {
109
109
  assertThat(anagrams, hasItem("Carthorse"));
110
110
  }
111
111
 
112
- @Ignore
112
+ @Ignore("Remove to run test")
113
113
  @Test
114
114
  public void testCaseInsensitiveWhenBothAnagramAndSubjectStartWithUpperCaseLetter() {
115
115
  Anagram detector = new Anagram("Orchestra");
@@ -117,14 +117,14 @@ public class AnagramTest {
117
117
  assertThat(anagrams, hasItem("Carthorse"));
118
118
  }
119
119
 
120
- @Ignore
120
+ @Ignore("Remove to run test")
121
121
  @Test
122
122
  public void testWordIsNotItsOwnAnagram() {
123
123
  Anagram detector = new Anagram("banana");
124
124
  assertTrue(detector.match(Arrays.asList("Banana")).isEmpty());
125
125
  }
126
126
 
127
- @Ignore
127
+ @Ignore("Remove to run test")
128
128
  @Test
129
129
  public void testAnagramMustUseAllLettersExactlyOnce() {
130
130
  Anagram detector = new Anagram("tapper");
@@ -8,29 +8,23 @@ brew install sbcl
8
8
  brew install clisp
9
9
  ```
10
10
 
11
- (See their homepages for instructions for installing on other
12
- platforms.)
11
+ See their homepages for instructions for installing on other
12
+ platforms.
13
13
 
14
- Then install [QuickLisp](http://www.quicklisp.org/beta/#installation)
15
- and download
16
- [http://beta.quicklisp.org/quicklisp.lisp](http://beta.quicklisp.org/quicklisp.lisp).
14
+ We will use [QuickLisp](http://www.quicklisp.org/beta/#installation) for Lisp library management. To install QuickLisp:
17
15
 
18
16
  ```bash
19
17
  curl -O http://beta.quicklisp.org/quicklisp.lisp
20
18
  ```
21
19
 
22
- Load it into your running Lisp implementation, and type:
20
+ Now launch lisp, and copy-paste the following expressions to finish QuickLisp installation:
23
21
 
24
22
  ```lisp
25
- (quicklisp-quickstart:install)
23
+ > (quicklisp-quickstart:install) ;; this will install quicklisp
24
+ > (ql:add-to-init-file) ;; this will add quicklisp setup to your init file (recommended)
26
25
  ```
27
26
 
28
- To add the startup code to your init file so that the next time you
29
- start the lisp interpreter QuickLisp will be loaded, type:
30
-
31
- ```lisp
32
- (ql:add-to-init-file)
33
- ```
27
+ See the documentation of your lisp implementation on how to load quicklisp.lisp into lisp.
34
28
 
35
29
  Optionally load lisp-unit:
36
30
 
@@ -3,7 +3,7 @@ import unittest
3
3
  from bracket_push import check_brackets
4
4
 
5
5
 
6
- # test cases adapted from `x-common//canonical-data.json` @ version: 1.0.0
6
+ # test cases adapted from `x-common//canonical-data.json` @ version: 1.1.0
7
7
 
8
8
  class BracketPushTests(unittest.TestCase):
9
9
  def test_paired_square_brackets(self):
@@ -18,6 +18,9 @@ class BracketPushTests(unittest.TestCase):
18
18
  def test_wrong_ordered_brackets(self):
19
19
  self.assertEqual(check_brackets("}{"), False)
20
20
 
21
+ def test_wrong_closing_bracket(self):
22
+ self.assertEqual(check_brackets("{]"), False)
23
+
21
24
  def test_paired_with_whitespace(self):
22
25
  self.assertEqual(check_brackets("{ }"), True)
23
26
 
@@ -1,8 +1,9 @@
1
1
  import unittest
2
+
2
3
  from isogram import is_isogram
3
4
 
4
5
 
5
- # test cases adapted from `x-common//canonical-data.json` @ version: 1.0.0
6
+ # test cases adapted from `x-common//canonical-data.json` @ version: 1.1.0
6
7
 
7
8
  class TestIsogram(unittest.TestCase):
8
9
 
@@ -30,6 +31,9 @@ class TestIsogram(unittest.TestCase):
30
31
  def test_made_up_name_that_is_an_isogram(self):
31
32
  self.assertTrue(is_isogram("Emily Jung Schwartzkopf"))
32
33
 
34
+ def test_duplicated_character_in_the_middle(self):
35
+ self.assertFalse(is_isogram("accentor"))
36
+
33
37
 
34
38
  if __name__ == '__main__':
35
39
  unittest.main()
@@ -64,7 +64,7 @@ Note that flags which have an attached value, like above, must take the form
64
64
 
65
65
  ### Generated Test Suites
66
66
 
67
- If you find an `example.tt` file in a problem directory, then the test suite is
67
+ If you find a `<problem_name>_cases.rb` file in `lib/`, then the test suite is
68
68
  generated from shared data, which can be found in the exercise definition in the [x-common][]
69
69
  repository.
70
70
 
@@ -94,7 +94,8 @@ bin/generate $PROBLEM
94
94
 
95
95
  #### Changing a Generated Exercise
96
96
 
97
- The `$PROBLEM/$PROBLEM_test.rb` will never be edited directly.
97
+ Do not edit `$PROBLEM/$PROBLEM_test.rb`. Any changes you make will be overwritten when
98
+ the file is generated the next time.
98
99
 
99
100
  There are two reasons why a test suite might change:
100
101
 
@@ -114,23 +115,14 @@ the exercise, which lives in the x-common repository.
114
115
  This change will need to be submitted as a pull request to the x-common repository. This pull
115
116
  request needs to be merged before you can regenerate the exercise.
116
117
 
117
- Changes that don't have to do directly with the test inputs and outputs, will
118
- most likely be made to `lib/$PROBLEM_cases.rb` but may also be made to
119
- `exercises/$PROBLEM/example.tt`. Then you can regenerate the exercise with
118
+ Changes that don't have to do directly with the test inputs and outputs should
119
+ be made to `lib/$PROBLEM_cases.rb`. Then you can regenerate the exercise with
120
120
  `bin/generate $PROBLEM`.
121
121
 
122
122
  #### Implementing a Generator
123
123
 
124
- You will need to implement two files and a directory to create a generator:
125
-
126
- 1. `lib/$PROBLEM_cases.rb` - the logic for turning the data into tests.
127
- 1. `exercises/$PROBLEM/example.tt` - the Erb template for the test file, `$PROBLEM_test.rb`.
128
- 1. `exercises/$PROBLEM/.meta/` - metadata directory, currently contains version file
129
-
130
- You will not need to touch the top-level script, `bin/generate`.
131
-
132
- The `bin/generate` command relies on some common logic implemented in `lib/generator.rb`.
133
- You probably won't need to touch that, either.
124
+ You will need to write code to produce the code that goes inside the test methods. Your
125
+ code will live in `lib/$PROBLEM_cases.rb`.
134
126
 
135
127
  `lib/$PROBLEM_cases.rb` contains a derived class of `ExerciseCase` (in `lib/generator/exercise_cases.rb`)
136
128
  which wraps the JSON for a single test case. The default version looks something like this:
@@ -149,7 +141,7 @@ end
149
141
  Instead of `ProblemName` use the CamelCased name of the actual problem. This is important, since
150
142
  the generator script will infer the name of the class from the argument that is passed.
151
143
 
152
- This class must provide the methods used by `example.tt`. The base class provides methods
144
+ This class must provide the methods used by `lib/generator/test_template.erb`. The base class provides methods
153
145
  for the default template for everything except `workload`.
154
146
 
155
147
  `workload` generates the code for the body of a test, including the assertion
@@ -157,34 +149,16 @@ and any setup required. The base class provides a variety of assertion and
157
149
  helper methods. Beyond that, you can implement any helper methods that you need
158
150
  as private methods in your derived class. See below for more information about [the intention of workload](#workload-philosophy)
159
151
 
160
- Finally, you need to create a text template, `example.tt`, as the bases for the test suite.
152
+ If you really must add additional logic to the view template, you can use a custom
153
+ template. Copy `lib/generator/test_template.erb` to your exercise directory, name it
154
+ `exercise.tt`, and customize.
161
155
 
162
- Start with the following boilerplate, and adjust as necessary. Remember, however, to strive
163
- to keep logic out of views.
156
+ You will not need to touch the top-level script, `bin/generate`.
164
157
 
165
- ```
166
- #!/usr/bin/env ruby
167
- gem 'minitest', '>= 5.0.0'
168
- require 'minitest/autorun'
169
- require_relative '$PROBLEM'
170
-
171
- # Common test data version: <%= abbreviated_commit_hash %>
172
- class ProblemNameTest < Minitest::Test
173
- <% test_cases.each do |test_case| %>
174
- def <%= test_case.name %>
175
- <%= test_case.skipped %>
176
- <%= test_case.workload %>
177
- end
158
+ The `bin/generate` command relies on some common logic implemented in `lib/generator.rb`.
159
+ You won't need to touch that, either.
178
160
 
179
- <% end %>
180
- <%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
181
161
 
182
- def test_bookkeeping
183
- skip
184
- assert_equal <%= version %>, BookKeeping::VERSION
185
- end
186
- end
187
- ```
188
162
  ### Workload philosophy.
189
163
 
190
164
  Prioritize educational value over expert comprehension and make sure that