trackler 2.2.1.88 → 2.2.1.89
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/bowling/canonical-data.json +95 -39
- data/problem-specifications/exercises/gigasecond/canonical-data.json +17 -7
- data/problem-specifications/exercises/pangram/canonical-data.json +32 -12
- data/problem-specifications/exercises/say/canonical-data.json +47 -17
- data/problem-specifications/exercises/sum-of-multiples/canonical-data.json +54 -28
- data/problem-specifications/exercises/triangle/canonical-data.json +52 -18
- data/problem-specifications/exercises/two-bucket/canonical-data.json +38 -26
- data/problem-specifications/exercises/two-fer/canonical-data.json +14 -8
- data/problem-specifications/exercises/word-count/canonical-data.json +35 -13
- data/problem-specifications/exercises/wordy/canonical-data.json +50 -18
- data/tracks/bash/exercises/leap/.meta/version +1 -0
- data/tracks/bash/exercises/leap/example.sh +9 -9
- data/tracks/bash/exercises/leap/leap_test.sh +17 -33
- data/tracks/ceylon/exercises/anagram/source/anagram/AnagramTest.ceylon +1 -1
- data/tracks/ceylon/exercises/bracket-push/source/bracketpush/BracketsTest.ceylon +1 -1
- data/tracks/ceylon/exercises/rna-transcription/source/rnatranscription/RNATest.ceylon +2 -1
- data/tracks/fsharp/build.cake +2 -7
- data/tracks/fsharp/exercises/acronym/AcronymTest.fs +1 -1
- data/tracks/fsharp/exercises/all-your-base/AllYourBase.fs +1 -1
- data/tracks/fsharp/exercises/all-your-base/AllYourBaseTest.fs +43 -43
- data/tracks/fsharp/exercises/all-your-base/Example.fs +5 -5
- data/tracks/fsharp/exercises/allergies/AllergiesTest.fs +1 -1
- data/tracks/fsharp/exercises/alphametics/AlphameticsTest.fs +19 -1
- data/tracks/fsharp/exercises/alphametics/Example.fs +53 -34
- data/tracks/fsharp/exercises/anagram/AnagramTest.fs +1 -1
- data/tracks/fsharp/exercises/atbash-cipher/AtbashCipherTest.fs +1 -1
- data/tracks/fsharp/exercises/beer-song/BeerSongTest.fs +1 -1
- data/tracks/fsharp/exercises/binary-search/BinarySearchTest.fs +1 -1
- data/tracks/fsharp/exercises/bob/BobTest.fs +1 -1
- data/tracks/fsharp/exercises/book-store/BookStoreTest.fs +1 -1
- data/tracks/fsharp/exercises/bracket-push/BracketPushTest.fs +1 -1
- data/tracks/fsharp/exercises/change/ChangeTest.fs +1 -1
- data/tracks/fsharp/exercises/collatz-conjecture/CollatzConjectureTest.fs +1 -1
- data/tracks/fsharp/exercises/connect/ConnectTest.fs +1 -1
- data/tracks/fsharp/exercises/crypto-square/CryptoSquareTest.fs +1 -1
- data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquaresTest.fs +1 -1
- data/tracks/fsharp/exercises/dominoes/DominoesTest.fs +25 -25
- data/tracks/fsharp/exercises/etl/EtlTest.fs +8 -8
- data/tracks/fsharp/exercises/isbn-verifier/IsbnVerifierTest.fs +5 -1
- data/tracks/fsharp/exercises/luhn/LuhnTest.fs +1 -1
- data/tracks/fsharp/exercises/meetup/Example.fs +11 -11
- data/tracks/fsharp/exercises/meetup/Meetup.fs +2 -2
- data/tracks/fsharp/exercises/meetup/MeetupTest.fs +96 -96
- data/tracks/fsharp/exercises/robot-simulator/Example.fs +21 -21
- data/tracks/fsharp/exercises/robot-simulator/RobotSimulator.fs +5 -5
- data/tracks/fsharp/exercises/robot-simulator/RobotSimulatorTest.fs +78 -96
- data/tracks/fsharp/generators/CanonicalData.fs +50 -4
- data/tracks/fsharp/generators/Common.fs +4 -13
- data/tracks/fsharp/generators/Exercise.fs +31 -15
- data/tracks/fsharp/generators/Generators.fs +76 -111
- data/tracks/haskell/exercises/alphametics/package.yaml +1 -1
- data/tracks/haskell/exercises/alphametics/test/Tests.hs +5 -0
- data/tracks/haskell/exercises/bowling/package.yaml +1 -1
- data/tracks/haskell/exercises/pangram/package.yaml +1 -1
- data/tracks/haskell/exercises/say/package.yaml +1 -1
- data/tracks/haskell/exercises/sum-of-multiples/package.yaml +1 -1
- data/tracks/haskell/exercises/word-count/package.yaml +1 -1
- data/tracks/haskell/exercises/wordy/package.yaml +1 -1
- data/tracks/java/exercises/nucleotide-count/.meta/hints.md +58 -0
- data/tracks/java/exercises/nucleotide-count/README.md +62 -0
- metadata +4 -2
@@ -3,6 +3,7 @@ module Generators.Generators
|
|
3
3
|
open System
|
4
4
|
open System.Globalization
|
5
5
|
open Newtonsoft.Json.Linq
|
6
|
+
open CanonicalData
|
6
7
|
open Formatting
|
7
8
|
open Rendering
|
8
9
|
open Exercise
|
@@ -10,9 +11,6 @@ open Exercise
|
|
10
11
|
type Acronym() =
|
11
12
|
inherit GeneratorExercise()
|
12
13
|
|
13
|
-
type AtbashCipher() =
|
14
|
-
inherit GeneratorExercise()
|
15
|
-
|
16
14
|
type AllYourBase() =
|
17
15
|
inherit GeneratorExercise()
|
18
16
|
|
@@ -31,12 +29,13 @@ type Allergies() =
|
|
31
29
|
override this.RenderTestMethodBody canonicalDataCase =
|
32
30
|
if (canonicalDataCase.Property = "allergicTo") then
|
33
31
|
let renderAssertion (jToken: JToken) =
|
34
|
-
let
|
35
|
-
canonicalDataCase.
|
32
|
+
let updatedInput =
|
33
|
+
canonicalDataCase.Input
|
36
34
|
|> Map.add "substance" (jToken.["substance"] |> toAllergen |> box)
|
37
|
-
|> Map.add "expected" (jToken.["result"].ToObject<bool>() |> box)
|
38
35
|
|
39
|
-
{ canonicalDataCase with
|
36
|
+
{ canonicalDataCase with
|
37
|
+
Input = updatedInput
|
38
|
+
Expected = jToken.["result"].ToObject<bool>() |> box }
|
40
39
|
|> this.RenderAssert
|
41
40
|
|> indent 1
|
42
41
|
|
@@ -90,18 +89,15 @@ type Anagram() =
|
|
90
89
|
type ArmstrongNumbers() =
|
91
90
|
inherit GeneratorExercise()
|
92
91
|
|
93
|
-
|
94
|
-
|
95
|
-
|> formatValue
|
92
|
+
type AtbashCipher() =
|
93
|
+
inherit GeneratorExercise()
|
96
94
|
|
97
95
|
type BeerSong() =
|
98
96
|
inherit GeneratorExercise()
|
99
97
|
|
100
|
-
override __.PropertiesUsedAsSutParameter _ = ["startBottles"; "takeDown"]
|
101
|
-
|
102
98
|
override __.PropertiesWithIdentifier _ = ["expected"]
|
103
99
|
|
104
|
-
override __.RenderExpected (_,
|
100
|
+
override __.RenderExpected (_, _, value) =
|
105
101
|
(value :?> JArray)
|
106
102
|
|> normalizeJArray
|
107
103
|
|> Seq.map formatValue
|
@@ -148,10 +144,10 @@ type Change() =
|
|
148
144
|
|
149
145
|
override this.PropertiesWithIdentifier canonicalDataCase = this.Properties canonicalDataCase
|
150
146
|
|
151
|
-
override __.IdentifierTypeAnnotation (canonicalDataCase, key, _) =
|
152
|
-
match key with
|
153
|
-
| "expected" ->
|
154
|
-
match canonicalDataCase.
|
147
|
+
override __.IdentifierTypeAnnotation (canonicalDataCase, key, _) =
|
148
|
+
match key with
|
149
|
+
| "expected" ->
|
150
|
+
match canonicalDataCase.Input.["target"] :?> int64 with
|
155
151
|
| 0L -> Some "int list option"
|
156
152
|
| _ -> None
|
157
153
|
| _ -> None
|
@@ -329,6 +325,9 @@ type Etl() =
|
|
329
325
|
|
330
326
|
override this.RenderExpected (_, _, value) = this.FormatMap<char, int> value
|
331
327
|
|
328
|
+
override __.MapCanonicalDataCaseInput (canonicalDataCase, _) =
|
329
|
+
Map.empty |> Map.add "lettersByScore" (canonicalDataCase.Properties.["input"])
|
330
|
+
|
332
331
|
override this.PropertiesWithIdentifier canonicalDataCase = this.Properties canonicalDataCase
|
333
332
|
|
334
333
|
type FoodChain() =
|
@@ -487,38 +486,37 @@ type Markdown() =
|
|
487
486
|
type Meetup() =
|
488
487
|
inherit GeneratorExercise()
|
489
488
|
|
490
|
-
override __.RenderExpected (
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
DateTime(year, month, day) |> formatDateTime |> parenthesize
|
489
|
+
override __.RenderExpected (_, _, value) =
|
490
|
+
DateTime.Parse(string value)
|
491
|
+
|> formatDateTime
|
492
|
+
|> parenthesize
|
495
493
|
|
496
494
|
override __.RenderInput (canonicalDataCase, key, value) =
|
497
495
|
match key with
|
498
496
|
| "dayofweek" ->
|
499
|
-
sprintf "DayOfWeek.%s" (string canonicalDataCase.
|
497
|
+
sprintf "DayOfWeek.%s" (string canonicalDataCase.Input.["dayofweek"])
|
500
498
|
| "week" ->
|
501
|
-
sprintf "
|
499
|
+
sprintf "Week.%s" (string canonicalDataCase.Input.["week"] |> String.upperCaseFirst)
|
502
500
|
| _ ->
|
503
501
|
base.RenderInput (canonicalDataCase, key, value)
|
504
502
|
|
505
|
-
override __.
|
506
|
-
properties |> Map.add "expected" null // Ensure that the "expected" key exists
|
507
|
-
|
508
|
-
override __.PropertiesUsedAsSutParameter _ =
|
509
|
-
["year"; "month"; "dayofweek"; "week"]
|
503
|
+
override __.PropertiesUsedAsSutParameter _ = ["year"; "month"; "week"; "dayofweek"]
|
510
504
|
|
511
505
|
override __.AdditionalNamespaces = [typeof<DateTime>.Namespace]
|
512
506
|
|
513
507
|
type Minesweeper() =
|
514
508
|
inherit GeneratorExercise()
|
515
509
|
|
516
|
-
|
510
|
+
let renderValue (value: obj) =
|
517
511
|
value :?> JArray
|
518
512
|
|> normalizeJArray
|
519
513
|
|> Seq.map formatValue
|
520
514
|
|> formatMultiLineList
|
521
515
|
|
516
|
+
override __.RenderInput (_, _, value) = renderValue value
|
517
|
+
|
518
|
+
override __.RenderExpected (_, _, value) = renderValue value
|
519
|
+
|
522
520
|
override this.PropertiesWithIdentifier canonicalDataCase = this.Properties canonicalDataCase
|
523
521
|
|
524
522
|
override __.IdentifierTypeAnnotation (_, _, value) =
|
@@ -691,10 +689,10 @@ type Proverb() =
|
|
691
689
|
type QueenAttack() =
|
692
690
|
inherit GeneratorExercise()
|
693
691
|
|
694
|
-
override __.
|
695
|
-
match canonicalDataCase.Property
|
696
|
-
| "create"
|
697
|
-
| _ -> base.
|
692
|
+
override __.MapCanonicalDataCaseExpected (canonicalDataCase, key, value) =
|
693
|
+
match canonicalDataCase.Property with
|
694
|
+
| "create" -> value :?> int64 <> -1L |> box
|
695
|
+
| _ -> base.MapCanonicalDataCaseInputProperty (canonicalDataCase, key, value)
|
698
696
|
|
699
697
|
override __.RenderInput (canonicalDataCase, key, value) =
|
700
698
|
let parsePositionTuple (tupleValue: obj) =
|
@@ -828,94 +826,61 @@ type ReverseString() =
|
|
828
826
|
type RobotSimulator() =
|
829
827
|
inherit GeneratorExercise()
|
830
828
|
|
831
|
-
let
|
829
|
+
let parseInput (input: obj) =
|
830
|
+
let token = input :?> JToken
|
831
|
+
let direction = token.SelectToken "direction" |> Option.ofObj
|
832
|
+
let position = token.SelectToken "position" |> Option.ofObj
|
833
|
+
(direction, position)
|
832
834
|
|
833
|
-
|
835
|
+
let renderDirection (value: JToken) =
|
836
|
+
value.ToObject<string>() |> String.upperCaseFirst
|
834
837
|
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
member private __.RenderCoords (coords: JToken) =
|
839
|
-
(coords.["x"].ToObject<int>(), coords.["y"].ToObject<int>())
|
838
|
+
let renderPosition (position: JToken) =
|
839
|
+
(position.["x"].ToObject<int>(), position.["y"].ToObject<int>())
|
840
840
|
|> formatValue
|
841
841
|
|
842
|
-
|
843
|
-
sprintf "
|
842
|
+
let renderRobot direction position =
|
843
|
+
sprintf "create %s %s" (renderDirection direction) (renderPosition position)
|
844
844
|
|
845
|
-
|
846
|
-
|
845
|
+
let renderInput input =
|
846
|
+
match input with
|
847
|
+
| None, Some position -> renderPosition position
|
848
|
+
| Some direction, None -> renderDirection direction
|
849
|
+
| Some direction, Some position -> renderRobot direction position
|
850
|
+
| None, None -> failwith "No direction or position"
|
847
851
|
|
848
|
-
override __.
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
|
855
|
-
|
856
|
-
)
|
852
|
+
override __.PropertiesWithIdentifier canonicalDataCase =
|
853
|
+
match parseInput canonicalDataCase.Expected with
|
854
|
+
| None, Some _ -> ["robot"; "sut"]
|
855
|
+
| Some _, None -> ["robot"; "sut"]
|
856
|
+
| Some _, Some _ -> ["robot"; "expected"]
|
857
|
+
| None, None -> ["robot"; "sut"; "expected"]
|
858
|
+
|
859
|
+
override __.ToTestMethodBodyAssert canonicalDataCase =
|
860
|
+
let testMethodBodyAssert = base.ToTestMethodBodyAssert(canonicalDataCase)
|
857
861
|
|
858
|
-
|
862
|
+
match parseInput canonicalDataCase.Expected with
|
863
|
+
| None, Some _ -> { testMethodBodyAssert with Sut = sprintf "%s.position" testMethodBodyAssert.Sut }
|
864
|
+
| Some _, None -> { testMethodBodyAssert with Sut = sprintf "%s.direction" testMethodBodyAssert.Sut }
|
865
|
+
| _ -> testMethodBodyAssert
|
866
|
+
|
867
|
+
override __.RenderValueWithoutIdentifier (canonicalDataCase, key, value) =
|
859
868
|
match key with
|
860
|
-
| "robot"
|
861
|
-
|
862
|
-
|
863
|
-
| "expected" ->
|
864
|
-
// here we may need to render full robot object
|
865
|
-
// or just coordinate/direction values
|
866
|
-
let input = value :?> JToken
|
867
|
-
let direction, position = this.GetRobotProperties input
|
868
|
-
match isNull direction, isNull position with
|
869
|
-
| true, false ->
|
870
|
-
this.RenderCoords position
|
871
|
-
| false, true ->
|
872
|
-
this.RenderDirection direction
|
873
|
-
| false, false ->
|
874
|
-
this.DefineRobot ("direction" |> input.SelectToken) ("position" |> input.SelectToken)
|
875
|
-
| true, true ->
|
876
|
-
""
|
877
|
-
| _ -> ""
|
878
|
-
|
879
|
-
override __.RenderValueWithIdentifier (canonicalDataCase, key, value) =
|
880
|
-
match key with
|
881
|
-
| "property" ->
|
882
|
-
let action = value :?> string
|
883
|
-
match action with
|
884
|
-
| "instructions" ->
|
885
|
-
sprintf "let %s = simulate robot %s" resultIdentifierName (canonicalDataCase.Properties.["instructions"] |> formatValue)
|
886
|
-
| "create" ->
|
887
|
-
""
|
888
|
-
| _ ->
|
889
|
-
sprintf "let %s = %s robot" resultIdentifierName action
|
890
|
-
|
891
|
-
| _ ->
|
892
|
-
base.RenderValueWithIdentifier (canonicalDataCase, key, value)
|
869
|
+
| "robot" -> value |> parseInput |> renderInput
|
870
|
+
| "expected" -> value |> parseInput |> renderInput
|
871
|
+
| _ -> base.RenderValueWithoutIdentifier (canonicalDataCase, key, value)
|
893
872
|
|
894
|
-
override
|
873
|
+
override __.RenderSut canonicalDataCase =
|
895
874
|
match canonicalDataCase.Property with
|
896
|
-
| "create" ->
|
897
|
-
|
898
|
-
|
899
|
-
// depends on expected value we may need to
|
900
|
-
// check whole robot or just one of its' properties
|
901
|
-
let direction, position = this.GetRobotProperties (canonicalDataCase.Properties.["expected"] :?> JToken)
|
902
|
-
match isNull direction, isNull position with
|
903
|
-
| true, false ->
|
904
|
-
sprintf "%s.coordinate" resultIdentifierName
|
905
|
-
| false, true ->
|
906
|
-
sprintf "%s.bearing" resultIdentifierName
|
907
|
-
| true, true ->
|
908
|
-
resultIdentifierName
|
909
|
-
| false, false ->
|
910
|
-
match canonicalDataCase.Property with
|
911
|
-
| "create" -> "robot"
|
912
|
-
| _ -> resultIdentifierName
|
913
|
-
|
875
|
+
| "create" -> "robot"
|
876
|
+
| _ -> base.RenderSut canonicalDataCase
|
877
|
+
|
914
878
|
override __.RenderTestMethodName canonicalDataCase =
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
879
|
+
let testMethodName = base.RenderTestMethodName canonicalDataCase
|
880
|
+
|
881
|
+
match canonicalDataCase.Property with
|
882
|
+
| "create" | "instructions" -> testMethodName
|
883
|
+
| _ -> sprintf "%s %s" canonicalDataCase.Property (String.lowerCaseFirst testMethodName)
|
919
884
|
|
920
885
|
type RotationalCipher() =
|
921
886
|
inherit GeneratorExercise()
|
@@ -63,6 +63,11 @@ cases = [ Case { description = "puzzle with three letters"
|
|
63
63
|
-- , expected = Just [('A', 5), ('D', 3), ('E', 4), ('F', 7), ('G', 8),
|
64
64
|
-- ('N', 0), ('O', 2), ('R', 1), ('S', 6), ('T', 9)]
|
65
65
|
-- }
|
66
|
+
-- , Case { description = "puzzle with ten letters and 199 addends"
|
67
|
+
-- , puzzle = "THIS + A + FIRE + THEREFORE + FOR + ALL + HISTORIES + I + TELL + A + TALE + THAT + FALSIFIES + ITS + TITLE + TIS + A + LIE + THE + TALE + OF + THE + LAST + FIRE + HORSES + LATE + AFTER + THE + FIRST + FATHERS + FORESEE + THE + HORRORS + THE + LAST + FREE + TROLL + TERRIFIES + THE + HORSES + OF + FIRE + THE + TROLL + RESTS + AT + THE + HOLE + OF + LOSSES + IT + IS + THERE + THAT + SHE + STORES + ROLES + OF + LEATHERS + AFTER + SHE + SATISFIES + HER + HATE + OFF + THOSE + FEARS + A + TASTE + RISES + AS + SHE + HEARS + THE + LEAST + FAR + HORSE + THOSE + FAST + HORSES + THAT + FIRST + HEAR + THE + TROLL + FLEE + OFF + TO + THE + FOREST + THE + HORSES + THAT + ALERTS + RAISE + THE + STARES + OF + THE + OTHERS + AS + THE + TROLL + ASSAILS + AT + THE + TOTAL + SHIFT + HER + TEETH + TEAR + HOOF + OFF + TORSO + AS + THE + LAST + HORSE + FORFEITS + ITS + LIFE + THE + FIRST + FATHERS + HEAR + OF + THE + HORRORS + THEIR + FEARS + THAT + THE + FIRES + FOR + THEIR + FEASTS + ARREST + AS + THE + FIRST + FATHERS + RESETTLE + THE + LAST + OF + THE + FIRE + HORSES + THE + LAST + TROLL + HARASSES + THE + FOREST + HEART + FREE + AT + LAST + OF + THE + LAST + TROLL + ALL + OFFER + THEIR + FIRE + HEAT + TO + THE + ASSISTERS + FAR + OFF + THE + TROLL + FASTS + ITS + LIFE + SHORTER + AS + STARS + RISE + THE + HORSES + REST + SAFE + AFTER + ALL + SHARE + HOT + FISH + AS + THEIR + AFFILIATES + TAILOR + A + ROOFS + FOR + THEIR + SAFE == FORTRESSES"
|
68
|
+
-- , expected = Just [('A', 1), ('E', 0), ('F', 5), ('H', 8), ('I', 7),
|
69
|
+
-- ('L', 2), ('O', 6), ('R', 3), ('S', 4), ('T', 9)]
|
70
|
+
-- }
|
66
71
|
-- , Case { description = "puzzle with multiplication"
|
67
72
|
-- , puzzle = "IF * DR == DORI"
|
68
73
|
-- , expected = Just [('I', 8), ('F', 2), ('D', 3), ('R', 9), ('O', 1)]
|
@@ -0,0 +1,58 @@
|
|
1
|
+
Since this exercise has difficulty 5 it doesn't come with any starter implementation.
|
2
|
+
This is so that you get to practice creating classes and methods which is an important part of programming in Java.
|
3
|
+
It does mean that when you first try to run the tests, they won't compile.
|
4
|
+
They will give you an error similar to:
|
5
|
+
```
|
6
|
+
path-to-exercism-dir\exercism\java\name-of-exercise\src\test\java\ExerciseClassNameTest.java:14: error: cannot find symbol
|
7
|
+
ExerciseClassName exerciseClassName = new ExerciseClassName();
|
8
|
+
^
|
9
|
+
symbol: class ExerciseClassName
|
10
|
+
location: class ExerciseClassNameTest
|
11
|
+
```
|
12
|
+
This error occurs because the test refers to a class that hasn't been created yet (`ExerciseClassName`).
|
13
|
+
To resolve the error you need to add a file matching the class name in the error to the `src/main/java` directory.
|
14
|
+
For example, for the error above you would add a file called `ExerciseClassName.java`.
|
15
|
+
|
16
|
+
When you try to run the tests again you will get slightly different errors.
|
17
|
+
You might get an error similar to:
|
18
|
+
```
|
19
|
+
constructor ExerciseClassName in class ExerciseClassName cannot be applied to given types;
|
20
|
+
ExerciseClassName exerciseClassName = new ExerciseClassName("some argument");
|
21
|
+
^
|
22
|
+
required: no arguments
|
23
|
+
found: String
|
24
|
+
reason: actual and formal argument lists differ in length
|
25
|
+
```
|
26
|
+
This error means that you need to add a [constructor](https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html) to your new class.
|
27
|
+
If you don't add a constructor, Java will add a default one for you.
|
28
|
+
This default constructor takes no arguments.
|
29
|
+
So if the tests expect your class to have a constructor which takes arguments, then you need to create this constructor yourself.
|
30
|
+
In the example above you could add:
|
31
|
+
```
|
32
|
+
ExerciseClassName(String input) {
|
33
|
+
|
34
|
+
}
|
35
|
+
```
|
36
|
+
That should make the error go away, though you might need to add some more code to your constructor to make the test pass!
|
37
|
+
|
38
|
+
You might also get an error similar to:
|
39
|
+
```
|
40
|
+
error: cannot find symbol
|
41
|
+
assertEquals(expectedOutput, exerciseClassName.someMethod());
|
42
|
+
^
|
43
|
+
symbol: method someMethod()
|
44
|
+
location: variable exerciseClassName of type ExerciseClassName
|
45
|
+
```
|
46
|
+
This error means that you need to add a method called `someMethod` to your new class.
|
47
|
+
In the example above you would add:
|
48
|
+
```
|
49
|
+
String someMethod() {
|
50
|
+
return "";
|
51
|
+
}
|
52
|
+
```
|
53
|
+
Make sure the return type matches what the test is expecting.
|
54
|
+
You can find out which return type it should have by looking at the type of object it's being compared to in the tests.
|
55
|
+
Or you could set your method to return some random type (e.g. `void`), and run the tests again.
|
56
|
+
The new error should tell you which type it's expecting.
|
57
|
+
|
58
|
+
After having resolved these errors you should be ready to start making the tests pass!
|
@@ -12,6 +12,68 @@ Here is an analogy:
|
|
12
12
|
- legos are to lego houses as
|
13
13
|
- words are to sentences as...
|
14
14
|
|
15
|
+
# Java Tips
|
16
|
+
|
17
|
+
Since this exercise has difficulty 5 it doesn't come with any starter implementation.
|
18
|
+
This is so that you get to practice creating classes and methods which is an important part of programming in Java.
|
19
|
+
It does mean that when you first try to run the tests, they won't compile.
|
20
|
+
They will give you an error similar to:
|
21
|
+
```
|
22
|
+
path-to-exercism-dir\exercism\java\name-of-exercise\src\test\java\ExerciseClassNameTest.java:14: error: cannot find symbol
|
23
|
+
ExerciseClassName exerciseClassName = new ExerciseClassName();
|
24
|
+
^
|
25
|
+
symbol: class ExerciseClassName
|
26
|
+
location: class ExerciseClassNameTest
|
27
|
+
```
|
28
|
+
This error occurs because the test refers to a class that hasn't been created yet (`ExerciseClassName`).
|
29
|
+
To resolve the error you need to add a file matching the class name in the error to the `src/main/java` directory.
|
30
|
+
For example, for the error above you would add a file called `ExerciseClassName.java`.
|
31
|
+
|
32
|
+
When you try to run the tests again you will get slightly different errors.
|
33
|
+
You might get an error similar to:
|
34
|
+
```
|
35
|
+
constructor ExerciseClassName in class ExerciseClassName cannot be applied to given types;
|
36
|
+
ExerciseClassName exerciseClassName = new ExerciseClassName("some argument");
|
37
|
+
^
|
38
|
+
required: no arguments
|
39
|
+
found: String
|
40
|
+
reason: actual and formal argument lists differ in length
|
41
|
+
```
|
42
|
+
This error means that you need to add a [constructor](https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html) to your new class.
|
43
|
+
If you don't add a constructor, Java will add a default one for you.
|
44
|
+
This default constructor takes no arguments.
|
45
|
+
So if the tests expect your class to have a constructor which takes arguments, then you need to create this constructor yourself.
|
46
|
+
In the example above you could add:
|
47
|
+
```
|
48
|
+
ExerciseClassName(String input) {
|
49
|
+
|
50
|
+
}
|
51
|
+
```
|
52
|
+
That should make the error go away, though you might need to add some more code to your constructor to make the test pass!
|
53
|
+
|
54
|
+
You might also get an error similar to:
|
55
|
+
```
|
56
|
+
error: cannot find symbol
|
57
|
+
assertEquals(expectedOutput, exerciseClassName.someMethod());
|
58
|
+
^
|
59
|
+
symbol: method someMethod()
|
60
|
+
location: variable exerciseClassName of type ExerciseClassName
|
61
|
+
```
|
62
|
+
This error means that you need to add a method called `someMethod` to your new class.
|
63
|
+
In the example above you would add:
|
64
|
+
```
|
65
|
+
String someMethod() {
|
66
|
+
return "";
|
67
|
+
}
|
68
|
+
```
|
69
|
+
Make sure the return type matches what the test is expecting.
|
70
|
+
You can find out which return type it should have by looking at the type of object it's being compared to in the tests.
|
71
|
+
Or you could set your method to return some random type (e.g. `void`), and run the tests again.
|
72
|
+
The new error should tell you which type it's expecting.
|
73
|
+
|
74
|
+
After having resolved these errors you should be ready to start making the tests pass!
|
75
|
+
|
76
|
+
|
15
77
|
# Running the tests
|
16
78
|
|
17
79
|
You can run all the tests for an exercise by entering
|