trackler 2.0.8.22 → 2.0.8.23
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/tracks/csharp/exercises/accumulate/HINTS.md +1 -2
- data/tracks/csharp/exercises/nth-prime/HINTS.md +7 -0
- data/tracks/csharp/exercises/proverb/HINTS.md +3 -0
- data/tracks/go/exercises/trinary/trinary_test.go +1 -1
- data/tracks/go/exercises/twelve-days/twelve_days_test.go +6 -6
- data/tracks/java/.Rhistory +0 -0
- data/tracks/java/config.json +12 -0
- data/tracks/java/exercises/book-store/build.gradle +17 -0
- data/tracks/java/exercises/book-store/src/example/java/.keep +0 -0
- data/tracks/java/exercises/book-store/src/example/java/Bookstore.java +61 -0
- data/tracks/java/exercises/book-store/src/main/java/.keep +0 -0
- data/tracks/java/exercises/book-store/src/test/java/.keep +0 -0
- data/tracks/java/exercises/book-store/src/test/java/BookstoreTest.java +117 -0
- data/tracks/java/exercises/hamming/src/example/java/Hamming.java +11 -2
- data/tracks/java/exercises/hamming/src/test/java/HammingTest.java +9 -10
- data/tracks/java/exercises/isogram/build.gradle +17 -0
- data/tracks/java/exercises/isogram/src/example/java/IsogramChecker.java +34 -0
- data/tracks/java/exercises/isogram/src/main/java/.keep +0 -0
- data/tracks/java/exercises/isogram/src/test/java/IsogramTest.java +80 -0
- data/tracks/java/exercises/raindrops/src/example/java/{Raindrops.java → RaindropConverter.java} +2 -2
- data/tracks/java/exercises/raindrops/src/test/java/{RaindropsTest.java → RaindropConverterTest.java} +3 -3
- data/tracks/java/exercises/settings.gradle +2 -0
- data/tracks/ocaml/.vscode/launch.json +13 -0
- data/tracks/ocaml/config.json +5 -0
- data/tracks/ocaml/exercises/beer-song/test.ml +15 -7
- data/tracks/ocaml/exercises/phone-number/test.ml +2 -2
- data/tracks/ocaml/exercises/prime-factors/test.ml +20 -16
- data/tracks/ocaml/exercises/roman-numerals/test.ml +40 -22
- data/tracks/ocaml/exercises/run-length-encoding/test.ml +6 -4
- data/tracks/ocaml/exercises/space-age/test.ml +20 -35
- data/tracks/ocaml/exercises/triangle/.merlin +5 -0
- data/tracks/ocaml/exercises/triangle/Makefile +11 -0
- data/tracks/ocaml/exercises/triangle/example.ml +17 -0
- data/tracks/ocaml/exercises/triangle/test.ml +48 -0
- data/tracks/ocaml/exercises/triangle/triangle.mli +5 -0
- data/tracks/ocaml/tools/test-generator/.merlin +0 -1
- data/tracks/ocaml/tools/test-generator/Makefile +3 -0
- data/tracks/ocaml/tools/test-generator/src/codegen.ml +1 -1
- data/tracks/ocaml/tools/test-generator/src/controller.ml +22 -10
- data/tracks/ocaml/tools/test-generator/src/debug.ml +12 -0
- data/tracks/ocaml/tools/test-generator/src/special_cases.ml +8 -0
- data/tracks/ocaml/tools/test-generator/src/template.ml +91 -41
- data/tracks/ocaml/tools/test-generator/src/test_gen.ml +2 -1
- data/tracks/ocaml/tools/test-generator/templates/atbash-cipher/template.ml +11 -3
- data/tracks/ocaml/tools/test-generator/templates/beer-song/template.ml +13 -3
- data/tracks/ocaml/tools/test-generator/templates/difference-of-squares/template.ml +17 -3
- data/tracks/ocaml/tools/test-generator/templates/prime-factors/template.ml +25 -0
- data/tracks/ocaml/tools/test-generator/templates/roman-numerals/template.ml +15 -0
- data/tracks/ocaml/tools/test-generator/templates/run-length-encoding/template.ml +19 -3
- data/tracks/ocaml/tools/test-generator/templates/space-age/template.ml +19 -0
- data/tracks/ocaml/tools/test-generator/templates/triangle/template.ml +33 -0
- data/tracks/ocaml/tools/test-generator/test/template_test.ml +8 -7
- data/tracks/powershell/exercises/hamming/hamming.tests.ps1 +4 -4
- metadata +28 -4
@@ -4,64 +4,114 @@ open Codegen
|
|
4
4
|
open Utils
|
5
5
|
|
6
6
|
(* start and finish are the lines where the generated code should be copied *)
|
7
|
-
type
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
type template_part = {
|
8
|
+
start: int;
|
9
|
+
finish: int;
|
10
|
+
template: string;
|
11
|
+
} [@@deriving eq, show]
|
12
|
+
|
13
|
+
type suite = {
|
14
|
+
template_part: template_part;
|
15
|
+
suite_name_line: int;
|
16
|
+
suite_end: int;
|
17
|
+
} [@@deriving eq, show]
|
18
|
+
|
19
|
+
type template =
|
20
|
+
Single of template_part
|
21
|
+
| Multi of (suite list) [@@deriving eq, show]
|
22
|
+
|
23
|
+
type t = {file_text: string;
|
24
|
+
template: template;
|
14
25
|
} [@@deriving eq, show]
|
15
26
|
|
16
27
|
let find_template ~(template_text: string): t option =
|
17
28
|
let open Option.Monad_infix in
|
18
|
-
let str_contains pattern s = String.substr_index s ~pattern |> Option.is_some in
|
19
29
|
let lines = String.split_lines template_text |> List.to_array in
|
20
|
-
let
|
21
|
-
let
|
22
|
-
let
|
23
|
-
let template_lines =
|
24
|
-
let
|
25
|
-
let
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
let test_starts = Array.filter_mapi lines ~f:(fun i l -> if (String.is_substring l ~substring:"(* TEST") then Some i else None) in
|
31
|
+
let test_ends = Array.filter_mapi lines ~f:(fun i l -> if (String.is_substring l ~substring:"END TEST") then Some i else None) in
|
32
|
+
let test_starts_and_ends = Array.zip_exn test_starts test_ends in
|
33
|
+
let template_lines = Array.map test_starts_and_ends ~f:(fun (s,e) -> Array.slice lines (s+1) e) in
|
34
|
+
let suite_name_lines = Array.filter_mapi lines ~f:(fun i l -> if (String.is_prefix l ~prefix:"let (* SUITE ") then Some i else None) in
|
35
|
+
let suite_ends = Array.filter_mapi lines ~f:(fun i l -> if (String.is_prefix l ~prefix:"(* END SUITE *)") then Some i else None) in
|
36
|
+
if Array.is_empty suite_name_lines || Array.is_empty suite_ends
|
37
|
+
then
|
38
|
+
if Array.is_empty test_starts || Array.is_empty test_ends
|
39
|
+
then None
|
40
|
+
else
|
41
|
+
Some {
|
42
|
+
file_text = template_text;
|
43
|
+
template = Single {start = test_starts.(0); finish = test_ends.(0); template = String.concat_array ~sep:"\n" (template_lines.(0))}
|
44
|
+
}
|
45
|
+
else
|
46
|
+
let suites = Array.mapi suite_name_lines ~f:(fun i sn -> {
|
47
|
+
template_part =
|
48
|
+
{
|
49
|
+
start = test_starts.(i);
|
50
|
+
finish = test_ends.(i);
|
51
|
+
template = template_lines.(i) |> String.concat_array ~sep:"\n";
|
52
|
+
};
|
53
|
+
suite_name_line = suite_name_lines.(i);
|
54
|
+
suite_end =suite_ends.(i);
|
55
|
+
}) |> Array.to_list in
|
56
|
+
Some {
|
57
|
+
file_text = template_text;
|
58
|
+
template = Multi suites
|
59
|
+
}
|
34
60
|
|
35
|
-
let fill_tests (template:
|
36
|
-
let lines = String.split_lines
|
61
|
+
let fill_tests (file_text: string) (template: template_part) (substs: subst list): string =
|
62
|
+
let lines = String.split_lines file_text |> List.to_array in
|
37
63
|
let before = Array.slice lines 0 template.start in
|
38
64
|
let subst = Array.of_list (List.map ~f:subst_to_string substs) in
|
39
65
|
let after = Array.slice lines (template.finish + 1) (Array.length lines) in
|
40
66
|
let join = String.concat_array ~sep:"\n" in
|
41
67
|
String.concat [join before; join subst; join after] ~sep:"\n"
|
42
68
|
|
43
|
-
let
|
69
|
+
let array_drop n xs =
|
70
|
+
Array.slice xs n (Array.length xs)
|
71
|
+
|
72
|
+
let list_drop_right n xs =
|
73
|
+
List.slice xs 0 (List.length xs - n)
|
74
|
+
|
75
|
+
let fill_single_suite (file_lines: string array) (suite: suite) (suite_substs: string * subst list): (string, string) Result.t =
|
44
76
|
let open Result.Monad_infix in
|
45
77
|
let (suite_name, substs) = suite_substs in
|
46
|
-
|
47
|
-
|
48
|
-
let lines =
|
49
|
-
Array.replace lines 0 ~f:(String.substr_replace_all ~pattern:"(* SUITE *)
|
50
|
-
let before = Array.slice lines 0 (
|
78
|
+
let suite_name_line = suite.suite_name_line in
|
79
|
+
let suite_end = suite.suite_end in
|
80
|
+
let lines = array_drop suite_name_line file_lines in
|
81
|
+
Array.replace lines 0 ~f:(String.substr_replace_all ~pattern:("(* SUITE " ^ suite_name ^ " *)") ~with_:"");
|
82
|
+
let before = Array.slice lines 0 (suite.template_part.start - suite_name_line) in
|
51
83
|
let subst = Array.of_list (List.map ~f:subst_to_string substs) in
|
52
|
-
let after = Array.slice lines (
|
84
|
+
let after = Array.slice lines (suite.template_part.finish - suite_name_line + 1) (suite_end - suite_name_line) in
|
53
85
|
let join = String.concat_array ~sep:"\n" in
|
54
86
|
Result.return @@ (String.concat [join before; join subst; join after] ~sep:"\n") ^ "\n"
|
55
87
|
|
88
|
+
let matches_suite_name file_lines suite suite_name =
|
89
|
+
let line = file_lines.(suite.suite_name_line) in
|
90
|
+
String.is_substring line ~substring:suite_name
|
91
|
+
|
92
|
+
let to_single = function
|
93
|
+
| (Single s) -> s
|
94
|
+
| _ -> failwith "bug"
|
95
|
+
|
96
|
+
let to_multi = function
|
97
|
+
| Multi suites -> suites
|
98
|
+
| _ -> failwith "unexpected case"
|
99
|
+
|
56
100
|
let fill_suite (template: t) (suite_substs: (string * subst list) list): (string, string) Result.t =
|
101
|
+
let file_lines = String.split_lines template.file_text |> List.to_array in
|
57
102
|
let open Result.Monad_infix in
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
103
|
+
let suites = to_multi template.template in
|
104
|
+
let fill_1_suite text (line, suite): (string, string) Result.t =
|
105
|
+
let suite_subst = List.find_exn suite_substs ~f:(fun (suite_name,_) -> matches_suite_name file_lines suite suite_name) in
|
106
|
+
fill_single_suite file_lines suite suite_subst >>= fun subst ->
|
107
|
+
let suite_name_line = suite.suite_name_line in
|
108
|
+
let before = Array.slice file_lines line suite_name_line |> String.concat_array ~sep:"\n" in
|
109
|
+
let generated = before ^ "\n" ^ subst in
|
110
|
+
Ok generated
|
111
|
+
in
|
112
|
+
let lines = List.rev_map suites ~f:(fun s -> 1 + s.suite_end) |> List.tl_exn |> List.rev |> List.cons 0 in
|
113
|
+
let lines_and_suites = List.zip_exn lines suites in
|
114
|
+
List.map lines_and_suites ~f:(fill_1_suite template.file_text) |> sequence |> Result.map ~f:(String.concat ~sep:"\n") >>= fun all_but_last_part ->
|
115
|
+
let last_suite_line = (List.last_exn suites).suite_end + 1 in
|
116
|
+
let last_part = Array.slice file_lines last_suite_line (Array.length file_lines) |> String.concat_array ~sep:"\n" in
|
117
|
+
Ok (all_but_last_part ^ last_part)
|
@@ -21,8 +21,9 @@ let command =
|
|
21
21
|
+> flag "-c" (optional_with_default "../../../x-common/exercises" is_directory) ~doc:"string Directory containing canonical data."
|
22
22
|
+> flag "-o" (optional_with_default "../../exercises" is_directory) ~doc:"string Directory to output generated tests."
|
23
23
|
+> flag "-g" (optional_with_default (home_dir ^ "/.xocaml-generated") is_directory) ~doc:"string Directory to backup generated tests."
|
24
|
+
+> flag "-f" (optional string) ~doc:"string Filter out files not matching this string."
|
24
25
|
)
|
25
|
-
(fun templates_folder canonical_data_folder output_folder generated_folder () -> Controller.run templates_folder canonical_data_folder output_folder generated_folder)
|
26
|
+
(fun templates_folder canonical_data_folder output_folder generated_folder filter () -> Controller.run templates_folder canonical_data_folder output_folder generated_folder filter)
|
26
27
|
|
27
28
|
let () =
|
28
29
|
Command.run ~version:"0.1" command
|
@@ -4,10 +4,18 @@ open Atbash_cipher
|
|
4
4
|
|
5
5
|
let ae exp got _test_ctxt = assert_equal ~printer:String.to_string exp got
|
6
6
|
|
7
|
-
let (* SUITE *)
|
7
|
+
let (* SUITE encode *)encode_tests = [
|
8
8
|
(* TEST
|
9
9
|
"$description" >::
|
10
|
-
ae $expected (
|
10
|
+
ae $expected (encode $phrase);
|
11
|
+
END TEST *)
|
12
|
+
]
|
13
|
+
(* END SUITE *)
|
14
|
+
|
15
|
+
let (* SUITE decode *)decode_tests = [
|
16
|
+
(* TEST
|
17
|
+
"$description" >::
|
18
|
+
ae $expected (decode $phrase);
|
11
19
|
END TEST *)
|
12
20
|
]
|
13
21
|
(* END SUITE *)
|
@@ -20,5 +28,5 @@ let different_block_size_test = [
|
|
20
28
|
let () =
|
21
29
|
run_test_tt_main (
|
22
30
|
"atbash-cipher tests" >:::
|
23
|
-
List.concat [
|
31
|
+
List.concat [encode_tests; decode_tests; different_block_size_test]
|
24
32
|
)
|
@@ -23,10 +23,20 @@ let zip s1 s2 =
|
|
23
23
|
then ()
|
24
24
|
else failwith @@ "Expected differs from actual: " ^ (diff_message exp got)
|
25
25
|
|
26
|
-
let (* SUITE *)
|
26
|
+
let (* SUITE verse *)verse_tests = [
|
27
27
|
(* TEST
|
28
28
|
"$description" >::
|
29
|
-
ae $expected
|
29
|
+
ae $expected
|
30
|
+
(verse $number);
|
31
|
+
END TEST *)
|
32
|
+
]
|
33
|
+
(* END SUITE *)
|
34
|
+
|
35
|
+
let (* SUITE lyrics *)lyrics_tests = [
|
36
|
+
(* TEST
|
37
|
+
"$description" >::
|
38
|
+
ae $expected
|
39
|
+
(lyrics ~from:$beginning ~until:$end);
|
30
40
|
END TEST *)
|
31
41
|
]
|
32
42
|
(* END SUITE *)
|
@@ -34,5 +44,5 @@ let (* SUITE *)$(suite_name)_tests = [
|
|
34
44
|
let () =
|
35
45
|
run_test_tt_main (
|
36
46
|
"beer song tests" >:::
|
37
|
-
List.concat [
|
47
|
+
List.concat [verse_tests; lyrics_tests]
|
38
48
|
)
|
@@ -4,10 +4,24 @@ open Difference_of_squares
|
|
4
4
|
|
5
5
|
let ae exp got _test_ctxt = assert_equal exp got
|
6
6
|
|
7
|
-
let (* SUITE *)
|
7
|
+
let (* SUITE square_the_sum_of_the_numbers_up_to_the_given_number *)square_of_sum_tests = [
|
8
8
|
(* TEST
|
9
9
|
"$description" >::
|
10
|
-
ae $expected (
|
10
|
+
ae $expected (square_of_sum $number);
|
11
|
+
END TEST *)
|
12
|
+
]
|
13
|
+
(* END SUITE *)
|
14
|
+
let (* SUITE sum_the_squares_of_the_numbers_up_to_the_given_number *)sum_of_squares_tests = [
|
15
|
+
(* TEST
|
16
|
+
"$description" >::
|
17
|
+
ae $expected (sum_of_squares $number);
|
18
|
+
END TEST *)
|
19
|
+
]
|
20
|
+
(* END SUITE *)
|
21
|
+
let (* SUITE subtract_sum_of_squares_from_square_of_sums *)difference_of_squares_tests = [
|
22
|
+
(* TEST
|
23
|
+
"$description" >::
|
24
|
+
ae $expected (difference_of_squares $number);
|
11
25
|
END TEST *)
|
12
26
|
]
|
13
27
|
(* END SUITE *)
|
@@ -15,5 +29,5 @@ let (* SUITE *)$(suite_name)_tests = [
|
|
15
29
|
let () =
|
16
30
|
run_test_tt_main (
|
17
31
|
"difference of squares tests" >:::
|
18
|
-
List.concat [
|
32
|
+
List.concat [square_of_sum_tests; sum_of_squares_tests; difference_of_squares_tests]
|
19
33
|
)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
open Core.Std
|
2
|
+
open OUnit2
|
3
|
+
open Prime_factors
|
4
|
+
|
5
|
+
(* Assert Equals *)
|
6
|
+
let ae exp got _test_ctxt =
|
7
|
+
let printer = List.to_string ~f:Int64.to_string in
|
8
|
+
assert_equal exp got ~printer
|
9
|
+
|
10
|
+
let to_int64s = List.map ~f:Int64.of_int
|
11
|
+
|
12
|
+
(* 64 bits integers are needed for the last number.
|
13
|
+
*
|
14
|
+
* If you happen to use a 64 bits machine normal ints would do as well, but this
|
15
|
+
* works for everybody.
|
16
|
+
*)
|
17
|
+
let tests = [
|
18
|
+
(* TEST
|
19
|
+
"$description" >::
|
20
|
+
ae (to_int64s $expected) (factors_of $(input)L);
|
21
|
+
END TEST *)
|
22
|
+
]
|
23
|
+
|
24
|
+
let () =
|
25
|
+
run_test_tt_main ("prime-factors tests" >::: tests)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
open Core.Std
|
2
|
+
open OUnit2
|
3
|
+
open Roman_numerals
|
4
|
+
|
5
|
+
let ae expected actual _ctx = assert_equal ~printer:Fn.id expected actual
|
6
|
+
|
7
|
+
let tests = [
|
8
|
+
(* TEST
|
9
|
+
"$description" >::
|
10
|
+
ae $expected (to_roman $number);
|
11
|
+
END TEST *)
|
12
|
+
]
|
13
|
+
|
14
|
+
let () =
|
15
|
+
run_test_tt_main ("roman-numerals test" >::: tests)
|
@@ -4,10 +4,26 @@ open Run_length_encoding
|
|
4
4
|
|
5
5
|
let ae exp got _test_ctxt = assert_equal exp got ~printer:Fn.id
|
6
6
|
|
7
|
-
let (* SUITE *)
|
7
|
+
let (* SUITE run-length_encode_a_string *)encode_tests = [
|
8
8
|
(* TEST
|
9
9
|
"$description" >::
|
10
|
-
ae $expected (
|
10
|
+
ae $expected (encode $input);
|
11
|
+
END TEST *)
|
12
|
+
]
|
13
|
+
(* END SUITE *)
|
14
|
+
|
15
|
+
let (* SUITE run-length_decode_a_string *)decode_tests = [
|
16
|
+
(* TEST
|
17
|
+
"$description" >::
|
18
|
+
ae $expected (decode $input);
|
19
|
+
END TEST *)
|
20
|
+
]
|
21
|
+
(* END SUITE *)
|
22
|
+
|
23
|
+
let (* SUITE encode_and_then_decode *)encode_and_then_decode_tests = [
|
24
|
+
(* TEST
|
25
|
+
"$description" >::
|
26
|
+
ae $expected (encode $input |> decode);
|
11
27
|
END TEST *)
|
12
28
|
]
|
13
29
|
(* END SUITE *)
|
@@ -15,5 +31,5 @@ let (* SUITE *)$(suite_name)_tests = [
|
|
15
31
|
let () =
|
16
32
|
run_test_tt_main (
|
17
33
|
"run length encoding tests" >:::
|
18
|
-
List.concat [
|
34
|
+
List.concat [encode_tests; decode_tests; encode_and_then_decode_tests]
|
19
35
|
)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
open Core.Std
|
2
|
+
open OUnit2
|
3
|
+
open Space_age
|
4
|
+
|
5
|
+
(* Assert In Delta *)
|
6
|
+
let ae ~delta:delta exp got _ctxt =
|
7
|
+
let msg = sprintf "Expected %f got %f, difference is greater than %f"
|
8
|
+
exp got delta in
|
9
|
+
assert_bool msg (cmp_float ~epsilon:delta exp got)
|
10
|
+
|
11
|
+
let tests = [
|
12
|
+
(* TEST
|
13
|
+
"$description" >::
|
14
|
+
ae ~delta:0.005 $expected (age_on $planet $seconds);
|
15
|
+
END TEST *)
|
16
|
+
]
|
17
|
+
|
18
|
+
let () =
|
19
|
+
run_test_tt_main ("space-age tests" >::: tests)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
open Core.Std
|
2
|
+
open OUnit2
|
3
|
+
open Triangle
|
4
|
+
|
5
|
+
let ae exp got _test_ctxt = assert_equal exp got ~printer:Bool.to_string
|
6
|
+
|
7
|
+
let (* SUITE returns_true_if_the_triangle_is_equilateral *)equilateral_tests = [
|
8
|
+
(* TEST
|
9
|
+
"$description" >::
|
10
|
+
ae $expected (is_equilateral $sides);
|
11
|
+
END TEST *)
|
12
|
+
]
|
13
|
+
(* END SUITE *)
|
14
|
+
let (* SUITE returns_true_if_the_triangle_is_isosceles *)isoceles_tests = [
|
15
|
+
(* TEST
|
16
|
+
"$description" >::
|
17
|
+
ae $expected (is_isoceles $sides);
|
18
|
+
END TEST *)
|
19
|
+
]
|
20
|
+
(* END SUITE *)
|
21
|
+
let (* SUITE returns_true_if_the_triangle_is_scalene *)scalene_tests = [
|
22
|
+
(* TEST
|
23
|
+
"$description" >::
|
24
|
+
ae $expected (is_scalene $sides);
|
25
|
+
END TEST *)
|
26
|
+
]
|
27
|
+
(* END SUITE *)
|
28
|
+
|
29
|
+
let () =
|
30
|
+
run_test_tt_main (
|
31
|
+
"triangle tests" >:::
|
32
|
+
List.concat [equilateral_tests; isoceles_tests; scalene_tests]
|
33
|
+
)
|
@@ -13,14 +13,15 @@ let template_tests = [
|
|
13
13
|
|
14
14
|
"if there is a test marker in a string then find_template returns where it is" >:: (fun _ctx ->
|
15
15
|
let template_text = In_channel.read_all "test/sample_template.txt" in
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
let expected_single = Single {
|
17
|
+
start = 7;
|
18
|
+
finish = 9;
|
19
|
+
template = "code";
|
20
|
+
} in
|
21
|
+
assert_equal ~printer (Some {file_text = template_text; template = expected_single}) @@ find_template ~template_text
|
21
22
|
);
|
22
23
|
|
23
|
-
"if there is a suite description line then find_template returns where it is" >:: (fun _ctx ->
|
24
|
+
(*"if there is a suite description line then find_template returns where it is" >:: (fun _ctx ->
|
24
25
|
let template_text = In_channel.read_all "test/sample-suite-template.txt" in
|
25
26
|
let template = find_template ~template_text in
|
26
27
|
match template with
|
@@ -56,5 +57,5 @@ let template_tests = [
|
|
56
57
|
assert_equal ~printer:Bool.to_string true (String.substr_index filled ~pattern:"line1" |> Option.is_some);
|
57
58
|
assert_equal ~printer:Bool.to_string true (String.substr_index filled ~pattern:"line2" |> Option.is_some);
|
58
59
|
assert_equal ~printer:Int.to_string 7 (String.count ~f:(fun ch -> ch = '\n') filled);
|
59
|
-
)
|
60
|
+
);*)
|
60
61
|
]
|
@@ -9,7 +9,7 @@ Describe "HammingTest" {
|
|
9
9
|
It "tests log identical strands" {
|
10
10
|
Compute "GGACTGA" "GGACTGA" | Should be 0
|
11
11
|
}
|
12
|
-
|
12
|
+
|
13
13
|
It "tests complete distance in single nucleotide strands" {
|
14
14
|
Compute "A" "G" | Should be 1
|
15
15
|
}
|
@@ -37,7 +37,7 @@ Describe "HammingTest" {
|
|
37
37
|
It "tests non unique character in second strand" {
|
38
38
|
Compute "AGG" "AGA" | Should be 1
|
39
39
|
}
|
40
|
-
|
40
|
+
|
41
41
|
It "tests same nucleotides in different position" {
|
42
42
|
Compute "TAG" "GAT" | Should be 2
|
43
43
|
}
|
@@ -45,7 +45,7 @@ Describe "HammingTest" {
|
|
45
45
|
It "tests large distance" {
|
46
46
|
Compute "GATACA" "GCATAA" | Should be 4
|
47
47
|
}
|
48
|
-
|
48
|
+
|
49
49
|
It "tests large distance in off by one strand" {
|
50
50
|
Compute "GGACGGATTCTG" "AGGACGGATTCT" | Should be 9
|
51
51
|
}
|
@@ -59,6 +59,6 @@ Describe "HammingTest" {
|
|
59
59
|
}
|
60
60
|
|
61
61
|
It "tests disallow second strand longer" {
|
62
|
-
{ Compute
|
62
|
+
{ Compute "ATA" "AGTG" } | Should Throw "Mismatching string lengths"
|
63
63
|
}
|
64
64
|
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trackler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.8.
|
4
|
+
version: 2.0.8.23
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Katrina Owen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -1598,6 +1598,7 @@ files:
|
|
1598
1598
|
- tracks/csharp/exercises/minesweeper/Minesweeper.csproj
|
1599
1599
|
- tracks/csharp/exercises/minesweeper/MinesweeperTest.cs
|
1600
1600
|
- tracks/csharp/exercises/nth-prime/Example.cs
|
1601
|
+
- tracks/csharp/exercises/nth-prime/HINTS.md
|
1601
1602
|
- tracks/csharp/exercises/nth-prime/NthPrime.cs
|
1602
1603
|
- tracks/csharp/exercises/nth-prime/NthPrime.csproj
|
1603
1604
|
- tracks/csharp/exercises/nth-prime/NthPrimeTest.cs
|
@@ -1654,6 +1655,7 @@ files:
|
|
1654
1655
|
- tracks/csharp/exercises/protein-translation/ProteinTranslation.csproj
|
1655
1656
|
- tracks/csharp/exercises/protein-translation/ProteinTranslationTest.cs
|
1656
1657
|
- tracks/csharp/exercises/proverb/Example.cs
|
1658
|
+
- tracks/csharp/exercises/proverb/HINTS.md
|
1657
1659
|
- tracks/csharp/exercises/proverb/Proverb.cs
|
1658
1660
|
- tracks/csharp/exercises/proverb/Proverb.csproj
|
1659
1661
|
- tracks/csharp/exercises/proverb/ProverbTest.cs
|
@@ -4132,6 +4134,7 @@ files:
|
|
4132
4134
|
- tracks/idris/exercises/leap/src/example.idr
|
4133
4135
|
- tracks/idris/img/.keep
|
4134
4136
|
- tracks/idris/img/icon.png
|
4137
|
+
- tracks/java/.Rhistory
|
4135
4138
|
- tracks/java/.git
|
4136
4139
|
- tracks/java/.gitignore
|
4137
4140
|
- tracks/java/.keep
|
@@ -4206,6 +4209,12 @@ files:
|
|
4206
4209
|
- tracks/java/exercises/bob/src/example/java/Bob.java
|
4207
4210
|
- tracks/java/exercises/bob/src/main/java/.keep
|
4208
4211
|
- tracks/java/exercises/bob/src/test/java/BobTest.java
|
4212
|
+
- tracks/java/exercises/book-store/build.gradle
|
4213
|
+
- tracks/java/exercises/book-store/src/example/java/.keep
|
4214
|
+
- tracks/java/exercises/book-store/src/example/java/Bookstore.java
|
4215
|
+
- tracks/java/exercises/book-store/src/main/java/.keep
|
4216
|
+
- tracks/java/exercises/book-store/src/test/java/.keep
|
4217
|
+
- tracks/java/exercises/book-store/src/test/java/BookstoreTest.java
|
4209
4218
|
- tracks/java/exercises/bracket-push/build.gradle
|
4210
4219
|
- tracks/java/exercises/bracket-push/src/example/java/BracketChecker.java
|
4211
4220
|
- tracks/java/exercises/bracket-push/src/main/java/BracketChecker.java
|
@@ -4267,6 +4276,10 @@ files:
|
|
4267
4276
|
- tracks/java/exercises/hexadecimal/src/example/java/Hexadecimal.java
|
4268
4277
|
- tracks/java/exercises/hexadecimal/src/main/java/.keep
|
4269
4278
|
- tracks/java/exercises/hexadecimal/src/test/java/HexadecimalTest.java
|
4279
|
+
- tracks/java/exercises/isogram/build.gradle
|
4280
|
+
- tracks/java/exercises/isogram/src/example/java/IsogramChecker.java
|
4281
|
+
- tracks/java/exercises/isogram/src/main/java/.keep
|
4282
|
+
- tracks/java/exercises/isogram/src/test/java/IsogramTest.java
|
4270
4283
|
- tracks/java/exercises/largest-series-product/build.gradle
|
4271
4284
|
- tracks/java/exercises/largest-series-product/src/example/java/LargestSeriesProductCalculator.java
|
4272
4285
|
- tracks/java/exercises/largest-series-product/src/main/java/LargestSeriesProductCalculator.java
|
@@ -4354,9 +4367,9 @@ files:
|
|
4354
4367
|
- tracks/java/exercises/queen-attack/src/main/java/QueenAttackCalculator.java
|
4355
4368
|
- tracks/java/exercises/queen-attack/src/test/java/QueenAttackCalculatorTest.java
|
4356
4369
|
- tracks/java/exercises/raindrops/build.gradle
|
4357
|
-
- tracks/java/exercises/raindrops/src/example/java/
|
4370
|
+
- tracks/java/exercises/raindrops/src/example/java/RaindropConverter.java
|
4358
4371
|
- tracks/java/exercises/raindrops/src/main/java/.keep
|
4359
|
-
- tracks/java/exercises/raindrops/src/test/java/
|
4372
|
+
- tracks/java/exercises/raindrops/src/test/java/RaindropConverterTest.java
|
4360
4373
|
- tracks/java/exercises/rectangles/build.gradle
|
4361
4374
|
- tracks/java/exercises/rectangles/src/example/java/RectangleCounter.java
|
4362
4375
|
- tracks/java/exercises/rectangles/src/main/java/RectangleCounter.java
|
@@ -5650,6 +5663,7 @@ files:
|
|
5650
5663
|
- tracks/ocaml/.gitignore
|
5651
5664
|
- tracks/ocaml/.travis-ci.sh
|
5652
5665
|
- tracks/ocaml/.travis.yml
|
5666
|
+
- tracks/ocaml/.vscode/launch.json
|
5653
5667
|
- tracks/ocaml/LICENSE
|
5654
5668
|
- tracks/ocaml/Makefile
|
5655
5669
|
- tracks/ocaml/README.md
|
@@ -5833,6 +5847,11 @@ files:
|
|
5833
5847
|
- tracks/ocaml/exercises/space-age/example.ml
|
5834
5848
|
- tracks/ocaml/exercises/space-age/space_age.mli
|
5835
5849
|
- tracks/ocaml/exercises/space-age/test.ml
|
5850
|
+
- tracks/ocaml/exercises/triangle/.merlin
|
5851
|
+
- tracks/ocaml/exercises/triangle/Makefile
|
5852
|
+
- tracks/ocaml/exercises/triangle/example.ml
|
5853
|
+
- tracks/ocaml/exercises/triangle/test.ml
|
5854
|
+
- tracks/ocaml/exercises/triangle/triangle.mli
|
5836
5855
|
- tracks/ocaml/exercises/word-count/.merlin
|
5837
5856
|
- tracks/ocaml/exercises/word-count/Makefile
|
5838
5857
|
- tracks/ocaml/exercises/word-count/example.ml
|
@@ -5854,6 +5873,7 @@ files:
|
|
5854
5873
|
- tracks/ocaml/tools/test-generator/src/canonical_data_checker.ml
|
5855
5874
|
- tracks/ocaml/tools/test-generator/src/codegen.ml
|
5856
5875
|
- tracks/ocaml/tools/test-generator/src/controller.ml
|
5876
|
+
- tracks/ocaml/tools/test-generator/src/debug.ml
|
5857
5877
|
- tracks/ocaml/tools/test-generator/src/files.ml
|
5858
5878
|
- tracks/ocaml/tools/test-generator/src/model.ml
|
5859
5879
|
- tracks/ocaml/tools/test-generator/src/parser.ml
|
@@ -5877,9 +5897,13 @@ files:
|
|
5877
5897
|
- tracks/ocaml/tools/test-generator/templates/minesweeper/template.ml
|
5878
5898
|
- tracks/ocaml/tools/test-generator/templates/pangram/template.ml
|
5879
5899
|
- tracks/ocaml/tools/test-generator/templates/phone-number/template.ml
|
5900
|
+
- tracks/ocaml/tools/test-generator/templates/prime-factors/template.ml
|
5880
5901
|
- tracks/ocaml/tools/test-generator/templates/raindrops/template.ml
|
5902
|
+
- tracks/ocaml/tools/test-generator/templates/roman-numerals/template.ml
|
5881
5903
|
- tracks/ocaml/tools/test-generator/templates/run-length-encoding/template.ml
|
5882
5904
|
- tracks/ocaml/tools/test-generator/templates/say/template.ml
|
5905
|
+
- tracks/ocaml/tools/test-generator/templates/space-age/template.ml
|
5906
|
+
- tracks/ocaml/tools/test-generator/templates/triangle/template.ml
|
5883
5907
|
- tracks/ocaml/tools/test-generator/templates/word-count/template.ml
|
5884
5908
|
- tracks/ocaml/tools/test-generator/test/all_tests.ml
|
5885
5909
|
- tracks/ocaml/tools/test-generator/test/beer-song.json
|