trackler 2.2.1.66 → 2.2.1.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/README.md +1 -0
  4. data/tracks/bash/exercises/anagram/anagram_tests.sh +16 -0
  5. data/tracks/bash/exercises/bob/bob_test.sh +28 -0
  6. data/tracks/bash/exercises/difference-of-squares/difference_of_squares_test.sh +3 -0
  7. data/tracks/bash/exercises/error-handling/error_handling_test.sh +5 -0
  8. data/tracks/bash/exercises/gigasecond/gigasecond_test.sh +10 -0
  9. data/tracks/bash/exercises/hamming/hamming_test.sh +15 -0
  10. data/tracks/bash/exercises/leap/leap_test.sh +10 -0
  11. data/tracks/bash/exercises/nucleotide-count/nucleotide_count_test.sh +4 -0
  12. data/tracks/bash/exercises/pangram/pangram_tests.sh +9 -0
  13. data/tracks/bash/exercises/phone-number/phone_number_tests.sh +13 -1
  14. data/tracks/bash/exercises/raindrops/raindrops_test.sh +16 -0
  15. data/tracks/bash/exercises/rna-transcription/rna_transcription_test.sh +8 -0
  16. data/tracks/bash/exercises/two-fer/two_fer_test.sh +3 -0
  17. data/tracks/bash/exercises/word-count/word_count_test.sh +9 -1
  18. data/tracks/c/exercises/hello-world/src/hello_world.c +0 -2
  19. data/tracks/c/exercises/sieve/test/test_sieve.c +13 -16
  20. data/tracks/erlang/config.json +4 -4
  21. data/tracks/fsharp/config.json +12 -0
  22. data/tracks/fsharp/exercises/Exercises.sln +6 -0
  23. data/tracks/fsharp/exercises/rotational-cipher/Example.fs +29 -0
  24. data/tracks/fsharp/exercises/rotational-cipher/Program.fs +1 -0
  25. data/tracks/fsharp/exercises/rotational-cipher/README.md +29 -0
  26. data/tracks/fsharp/exercises/rotational-cipher/RotationalCipher.fs +3 -0
  27. data/tracks/fsharp/exercises/rotational-cipher/RotationalCipher.fsproj +23 -0
  28. data/tracks/fsharp/exercises/rotational-cipher/RotationalCipherTest.fs +49 -0
  29. data/tracks/fsharp/generators/Generators.fs +3 -0
  30. data/tracks/go/exercises/grains/.meta/gen.go +99 -0
  31. data/tracks/go/exercises/grains/cases_test.go +64 -0
  32. data/tracks/go/exercises/grains/grains_test.go +4 -20
  33. data/tracks/go/exercises/space-age/space_age_test.go +3 -1
  34. data/tracks/java/config.json +12 -0
  35. data/tracks/java/exercises/beer-song/.meta/src/reference/java/BeerSong.java +4 -4
  36. data/tracks/java/exercises/diamond/src/main/java/DiamondPrinter.java +9 -0
  37. data/tracks/java/exercises/isbn-verifier/.meta/src/reference/java/IsbnVerifier.java +35 -0
  38. data/tracks/java/exercises/isbn-verifier/.meta/version +1 -0
  39. data/tracks/java/exercises/isbn-verifier/README.md +53 -0
  40. data/tracks/java/exercises/isbn-verifier/build.gradle +18 -0
  41. data/tracks/java/exercises/isbn-verifier/src/main/java/IsbnVerifier.java +7 -0
  42. data/tracks/java/exercises/isbn-verifier/src/test/java/IsbnVerifierTest.java +94 -0
  43. data/tracks/java/exercises/isogram/src/main/java/IsogramChecker.java +7 -0
  44. data/tracks/java/exercises/saddle-points/src/main/java/Matrix.java +13 -0
  45. data/tracks/java/exercises/settings.gradle +1 -0
  46. data/tracks/kotlin/config.json +1 -1
  47. data/tracks/ocaml/exercises/all-your-base/example.ml +1 -1
  48. data/tracks/ocaml/exercises/all-your-base/test.ml +9 -9
  49. data/tracks/perl6/config.json +1 -1
  50. data/tracks/perl6/docs/SNIPPET.txt +2 -2
  51. data/tracks/perl6/exercises/anagram/Anagram.pm6 +4 -1
  52. data/tracks/perl6/exercises/anagram/Example.pm6 +4 -15
  53. data/tracks/perl6/exercises/anagram/anagram.t +2 -2
  54. data/tracks/perl6/exercises/anagram/example.yaml +7 -15
  55. data/tracks/php/config.json +12 -0
  56. data/tracks/php/exercises/run-length-encoding/README.md +42 -0
  57. data/tracks/php/exercises/run-length-encoding/example.php +60 -0
  58. data/tracks/php/exercises/run-length-encoding/run-length-encoding.php +20 -0
  59. data/tracks/php/exercises/run-length-encoding/run-length-encoding_test.php +65 -0
  60. data/tracks/purescript/.travis.yml +1 -1
  61. data/tracks/purescript/bin/test.sh +9 -2
  62. data/tracks/python/config.json +7 -16
  63. data/tracks/r/exercises/hello-world/test_hello-world.R +0 -8
  64. data/tracks/racket/config.json +1 -1
  65. data/tracks/swift/config.json +12 -2
  66. data/tracks/swift/exercises/diamond/Package.swift +5 -0
  67. data/tracks/swift/exercises/diamond/README.md +64 -0
  68. data/tracks/swift/exercises/diamond/Sources/Diamond.swift +1 -0
  69. data/tracks/swift/exercises/diamond/Sources/DiamondExample.swift +30 -0
  70. data/tracks/swift/exercises/diamond/Tests/DiamondTests/DiamondTests.swift +98 -0
  71. data/tracks/swift/exercises/diamond/Tests/LinuxMain.swift +6 -0
  72. metadata +29 -8
  73. data/tracks/java/exercises/diamond/src/main/java/.keep +0 -0
  74. data/tracks/java/exercises/isogram/src/main/java/.keep +0 -0
  75. data/tracks/python/exercises/parallel-letter-frequency/README.md +0 -24
  76. data/tracks/python/exercises/parallel-letter-frequency/example.py +0 -56
  77. data/tracks/python/exercises/parallel-letter-frequency/parallel_letter_frequency.py +0 -2
  78. data/tracks/python/exercises/parallel-letter-frequency/parallel_letter_frequency_test.py +0 -61
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env bats
2
2
 
3
3
  @test 'Complement of cytosine is guanine' {
4
+ #skip
4
5
  run bash rna_transcription.sh C
5
6
 
6
7
  [ "$status" -eq 0 ]
@@ -8,6 +9,7 @@
8
9
  }
9
10
 
10
11
  @test 'Complement of guanine is cytosine' {
12
+ skip
11
13
  run bash rna_transcription.sh G
12
14
 
13
15
  [ "$status" -eq 0 ]
@@ -15,6 +17,7 @@
15
17
  }
16
18
 
17
19
  @test 'Complement of thymine is adenine' {
20
+ skip
18
21
  run bash rna_transcription.sh T
19
22
 
20
23
  [ "$status" -eq 0 ]
@@ -22,6 +25,7 @@
22
25
  }
23
26
 
24
27
  @test 'Complement of adenine is uracil' {
28
+ skip
25
29
  run bash rna_transcription.sh A
26
30
 
27
31
  [ "$status" -eq 0 ]
@@ -29,6 +33,7 @@
29
33
  }
30
34
 
31
35
  @test 'Complement of long string' {
36
+ skip
32
37
  run bash rna_transcription.sh ACGTGGTCTTAA
33
38
 
34
39
  [ "$status" -eq 0 ]
@@ -36,6 +41,7 @@
36
41
  }
37
42
 
38
43
  @test 'Handles invalid character' {
44
+ skip
39
45
  run bash rna_transcription.sh U
40
46
 
41
47
  [ "$status" -eq 1 ]
@@ -43,6 +49,7 @@
43
49
  }
44
50
 
45
51
  @test 'Handles completely invalid string' {
52
+ skip
46
53
  run bash rna_transcription.sh XXXX
47
54
 
48
55
  [ "$status" -eq 1 ]
@@ -50,6 +57,7 @@
50
57
  }
51
58
 
52
59
  @test 'Handles partially invalid string' {
60
+ skip
53
61
  run bash rna_transcription.sh ACGTXCTTAA
54
62
 
55
63
  [ "$status" -eq 1 ]
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env bats
2
2
 
3
3
  @test "When given no name, it should have one for you!" {
4
+ #skip
4
5
  run bash two_fer.sh
5
6
 
6
7
  [ "$status" -eq 0 ]
@@ -8,6 +9,7 @@
8
9
  }
9
10
 
10
11
  @test 'When given "Alice" it should have one for Alice!' {
12
+ skip
11
13
  run bash two_fer.sh Alice
12
14
 
13
15
  [ "$status" -eq 0 ]
@@ -15,6 +17,7 @@
15
17
  }
16
18
 
17
19
  @test 'When given "Bob" it should have one for Bob!' {
20
+ skip
18
21
  run bash two_fer.sh Bob
19
22
 
20
23
  [ "$status" -eq 0 ]
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env bats
2
2
 
3
3
  @test "count one word" {
4
+ #skip
4
5
  run ./word_count.sh "word"
5
6
 
6
7
  [ "$status" -eq 0 ]
@@ -9,6 +10,7 @@
9
10
  }
10
11
 
11
12
  @test "count one of each word" {
13
+ skip
12
14
  run ./word_count.sh "one of each"
13
15
 
14
16
  [ "$status" -eq 0 ]
@@ -19,6 +21,7 @@
19
21
  }
20
22
 
21
23
  @test "multiple occurrences of a word" {
24
+ skip
22
25
  run ./word_count.sh "one fish two fish red fish blue fish"
23
26
 
24
27
  [ "$status" -eq 0 ]
@@ -31,6 +34,7 @@
31
34
  }
32
35
 
33
36
  @test "handle cramped lists" {
37
+ skip
34
38
  run ./word_count.sh "one,two,three"
35
39
 
36
40
  [ "$status" -eq 0 ]
@@ -41,6 +45,7 @@
41
45
  }
42
46
 
43
47
  @test "ignore punctuation" {
48
+ skip
44
49
  run ./word_count.sh "car: carpet as java: javascript!!&@$%^&"
45
50
 
46
51
  [ "$status" -eq 0 ]
@@ -53,6 +58,7 @@
53
58
  }
54
59
 
55
60
  @test "include numbers" {
61
+ skip
56
62
  run ./word_count.sh "testing, 1, 2 testing"
57
63
 
58
64
  [ "$status" -eq 0 ]
@@ -63,6 +69,7 @@
63
69
  }
64
70
 
65
71
  @test "normalize case" {
72
+ skip
66
73
  run ./word_count.sh "go Go GO Stop stop"
67
74
 
68
75
  [ "$status" -eq 0 ]
@@ -72,6 +79,7 @@
72
79
  }
73
80
 
74
81
  @test "handle apostrophes" {
82
+ skip
75
83
  run ./word_count.sh "First: don't laugh. Then: don't cry."
76
84
 
77
85
  [ "$status" -eq 0 ]
@@ -81,4 +89,4 @@
81
89
  echo $output | grep "then: 1"
82
90
  echo $output | grep "cry: 1"
83
91
  echo $output | wc -w | grep "10"
84
- }
92
+ }
@@ -1,5 +1,3 @@
1
- #include <stdio.h>
2
- #include <stddef.h>
3
1
  #include "hello_world.h"
4
2
 
5
3
  const char *hello(void)
@@ -3,6 +3,7 @@
3
3
  #include "../src/sieve.h"
4
4
 
5
5
  static primes_array_t result_array;
6
+ #define ARRAY_LENGTH(x) sizeof(x)/sizeof(x[0])
6
7
 
7
8
  void setUp(void)
8
9
  {
@@ -15,7 +16,6 @@ void tearDown(void)
15
16
  void test_no_primes_under_two(void)
16
17
  {
17
18
  const unsigned int limit = 1;
18
- const primes_array_t expected_prime_array = { 0 };
19
19
  const unsigned int expected_prime_count = 0;
20
20
  unsigned int result_prime_count;
21
21
 
@@ -23,9 +23,6 @@ void test_no_primes_under_two(void)
23
23
 
24
24
  result_prime_count = sieve(limit, result_array);
25
25
  TEST_ASSERT_EQUAL(expected_prime_count, result_prime_count);
26
- TEST_ASSERT_EQUAL(0,
27
- memcmp(expected_prime_array, result_array,
28
- sizeof(result_array)));
29
26
  }
30
27
 
31
28
  void test_find_first_prime(void)
@@ -40,9 +37,9 @@ void test_find_first_prime(void)
40
37
 
41
38
  result_prime_count = sieve(limit, result_array);
42
39
  TEST_ASSERT_EQUAL(expected_prime_count, result_prime_count);
43
- TEST_ASSERT_EQUAL(0,
44
- memcmp(expected_prime_array, result_array,
45
- sizeof(expected_prime_array)));
40
+ TEST_ASSERT_EQUAL_UINT_ARRAY(expected_prime_array, result_array,
41
+ ARRAY_LENGTH(expected_prime_array));
42
+
46
43
  }
47
44
 
48
45
  void test_find_primes_up_to_10(void)
@@ -57,9 +54,9 @@ void test_find_primes_up_to_10(void)
57
54
 
58
55
  result_prime_count = sieve(limit, result_array);
59
56
  TEST_ASSERT_EQUAL(expected_prime_count, result_prime_count);
60
- TEST_ASSERT_EQUAL(0,
61
- memcmp(expected_prime_array, result_array,
62
- sizeof(expected_prime_array)));
57
+ TEST_ASSERT_EQUAL_UINT_ARRAY(expected_prime_array, result_array,
58
+ ARRAY_LENGTH(expected_prime_array));
59
+
63
60
  }
64
61
 
65
62
  void test_limit_is_prime(void)
@@ -74,9 +71,9 @@ void test_limit_is_prime(void)
74
71
 
75
72
  result_prime_count = sieve(limit, result_array);
76
73
  TEST_ASSERT_EQUAL(expected_prime_count, result_prime_count);
77
- TEST_ASSERT_EQUAL(0,
78
- memcmp(expected_prime_array, result_array,
79
- sizeof(expected_prime_array)));
74
+ TEST_ASSERT_EQUAL_UINT_ARRAY(expected_prime_array, result_array,
75
+ ARRAY_LENGTH(expected_prime_array));
76
+
80
77
  }
81
78
 
82
79
  void test_find_primes_up_to_1000(void)
@@ -105,9 +102,9 @@ void test_find_primes_up_to_1000(void)
105
102
 
106
103
  result_prime_count = sieve(limit, result_array);
107
104
  TEST_ASSERT_EQUAL(expected_prime_count, result_prime_count);
108
- TEST_ASSERT_EQUAL(0,
109
- memcmp(expected_prime_array, result_array,
110
- sizeof(expected_prime_array)));
105
+ TEST_ASSERT_EQUAL_UINT_ARRAY(expected_prime_array, result_array,
106
+ ARRAY_LENGTH(expected_prime_array));
107
+
111
108
  }
112
109
 
113
110
  int main(void)
@@ -103,7 +103,7 @@
103
103
  ]
104
104
  },
105
105
  {
106
- "uuid": "97f3c252-09c1-b380-5f5f-45b6eebec416e2a0830",
106
+ "uuid": "94b997bb-8e8d-4519-ba97-199d0f35a80a",
107
107
  "slug": "isogram",
108
108
  "core": false,
109
109
  "unlocked_by": null,
@@ -113,7 +113,7 @@
113
113
  ]
114
114
  },
115
115
  {
116
- "uuid": "ceb71cdc-098f-d580-179c-732dd8258f8a76cf2be",
116
+ "uuid": "9c092a14-475b-4b1b-ac4b-fb19467367ff",
117
117
  "slug": "pangram",
118
118
  "core": false,
119
119
  "unlocked_by": null,
@@ -213,7 +213,7 @@
213
213
  ]
214
214
  },
215
215
  {
216
- "uuid": "1a8abaa2-04f5-0e80-7986-5fb33995971caeb1496",
216
+ "uuid": "ea369b85-b180-48ca-b602-c40811fc865f",
217
217
  "slug": "two-fer",
218
218
  "core": false,
219
219
  "unlocked_by": null,
@@ -313,7 +313,7 @@
313
313
  ]
314
314
  },
315
315
  {
316
- "uuid": "28b7e4fa-0511-f480-5128-5531913fca21458a2d9",
316
+ "uuid": "9cfae4bf-cff8-49bc-aee9-a37d553cef81",
317
317
  "slug": "sieve",
318
318
  "core": false,
319
319
  "unlocked_by": null,
@@ -696,6 +696,18 @@
696
696
  "unlocked_by": "beer-song",
697
697
  "uuid": "df6f311b-9deb-4d07-9a29-3d881556513e"
698
698
  },
699
+ {
700
+ "core": false,
701
+ "difficulty": 5,
702
+ "slug": "rotational-cipher",
703
+ "topics": [
704
+ "algorithms",
705
+ "strings",
706
+ "transforming"
707
+ ],
708
+ "unlocked_by": "beer-song",
709
+ "uuid": "26b00c8d-6282-48a8-b017-2ed3e6d48267"
710
+ },
699
711
  {
700
712
  "core": false,
701
713
  "difficulty": 5,
@@ -216,6 +216,8 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "CollatzConjecture", "collat
216
216
  EndProject
217
217
  Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "ReverseString", "reverse-string\ReverseString.fsproj", "{A996AAE3-E54D-41F2-9B6A-99EACD6DAAB7}"
218
218
  EndProject
219
+ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "RotationalCipher", "rotational-cipher\RotationalCipher.fsproj", "{91D0A5E0-E39C-472B-87FB-6DD17336AA22}"
220
+ EndProject
219
221
  Global
220
222
  GlobalSection(SolutionConfigurationPlatforms) = preSolution
221
223
  Debug|Any CPU = Debug|Any CPU
@@ -650,6 +652,10 @@ Global
650
652
  {A996AAE3-E54D-41F2-9B6A-99EACD6DAAB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
651
653
  {A996AAE3-E54D-41F2-9B6A-99EACD6DAAB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
652
654
  {A996AAE3-E54D-41F2-9B6A-99EACD6DAAB7}.Release|Any CPU.Build.0 = Release|Any CPU
655
+ {91D0A5E0-E39C-472B-87FB-6DD17336AA22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
656
+ {91D0A5E0-E39C-472B-87FB-6DD17336AA22}.Debug|Any CPU.Build.0 = Debug|Any CPU
657
+ {91D0A5E0-E39C-472B-87FB-6DD17336AA22}.Release|Any CPU.ActiveCfg = Release|Any CPU
658
+ {91D0A5E0-E39C-472B-87FB-6DD17336AA22}.Release|Any CPU.Build.0 = Release|Any CPU
653
659
  EndGlobalSection
654
660
  GlobalSection(SolutionProperties) = preSolution
655
661
  HideSolutionNode = FALSE
@@ -0,0 +1,29 @@
1
+ module RotationalCipher
2
+
3
+ open System
4
+
5
+ let private alphabet = ['a' .. 'z']
6
+
7
+ let private createKey shiftKey =
8
+ alphabet @ alphabet
9
+ |> List.skip shiftKey
10
+ |> List.take (List.length alphabet)
11
+
12
+ let private rotateLetter key c =
13
+ let index = List.findIndex (fun x -> x = Char.ToLower(c)) alphabet
14
+ let rotatedLetter = List.item index key
15
+
16
+ match Char.IsUpper(c) with
17
+ | false -> rotatedLetter
18
+ | true -> Char.ToUpper(rotatedLetter)
19
+
20
+ let private rotateChar shiftKey =
21
+ let key = createKey shiftKey
22
+ let rotate = rotateLetter key
23
+
24
+ fun (c: char) ->
25
+ match Char.IsLetter(c) with
26
+ | false -> c
27
+ | true -> rotate c
28
+
29
+ let rotate shiftKey input = String.map (rotateChar shiftKey) input
@@ -0,0 +1 @@
1
+ module Program = let [<EntryPoint>] main _ = 0
@@ -0,0 +1,29 @@
1
+ Create an implementation of the rotational cipher, also sometimes called the Caesar cipher.
2
+
3
+ The Caesar cipher is a simple shift cipher that relies on
4
+ transposing all the letters in the alphabet using an integer key
5
+ between `0` and `26`. Using a key of `0` or `26` will always yield
6
+ the same output due to modular arithmetic. The letter is shifted
7
+ for as many values as the value of the key.
8
+
9
+ The general notation for rotational ciphers is `ROT + <key>`.
10
+ The most commonly used rotational cipher is `ROT13`.
11
+
12
+ A `ROT13` on the Latin alphabet would be as follows:
13
+
14
+ ```text
15
+ Plain: abcdefghijklmnopqrstuvwxyz
16
+ Cipher: nopqrstuvwxyzabcdefghijklm
17
+ ```
18
+
19
+ It is stronger than the Atbash cipher because it has 27 possible keys, and 25 usable keys.
20
+
21
+ Ciphertext is written out in the same formatting as the input including spaces and punctuation.
22
+
23
+ ## Examples
24
+
25
+ - ROT5 `omg` gives `trl`
26
+ - ROT0 `c` gives `c`
27
+ - ROT26 `Cool` gives `Cool`
28
+ - ROT13 `The quick brown fox jumps over the lazy dog.` gives `Gur dhvpx oebja sbk whzcf bire gur ynml qbt.`
29
+ - ROT13 `Gur dhvpx oebja sbk whzcf bire gur ynml qbt.` gives `The quick brown fox jumps over the lazy dog.`
@@ -0,0 +1,3 @@
1
+ module RotationalCipher
2
+
3
+ let rotate shiftKey text = failwith "You need to implement this function."
@@ -0,0 +1,23 @@
1
+ <Project Sdk="Microsoft.NET.Sdk">
2
+
3
+ <PropertyGroup>
4
+ <TargetFramework>netcoreapp2.0</TargetFramework>
5
+
6
+ <IsPackable>false</IsPackable>
7
+ </PropertyGroup>
8
+
9
+ <ItemGroup>
10
+ <Compile Include="RotationalCipher.fs" />
11
+ <Compile Include="RotationalCipherTest.fs" />
12
+ <Compile Include="Program.fs" />
13
+ </ItemGroup>
14
+
15
+ <ItemGroup>
16
+ <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
17
+ <PackageReference Include="xunit" Version="2.3.1" />
18
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
19
+ <PackageReference Include="FsUnit.xUnit" Version="3.0.0" />
20
+ <DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" />
21
+ </ItemGroup>
22
+
23
+ </Project>
@@ -0,0 +1,49 @@
1
+ // This file was auto-generated based on version 1.1.0 of the canonical data.
2
+
3
+ module RotationalCipherTest
4
+
5
+ open FsUnit.Xunit
6
+ open Xunit
7
+
8
+ open RotationalCipher
9
+
10
+ [<Fact>]
11
+ let ``Rotate a by 0, same output as input`` () =
12
+ rotate 0 "a" |> should equal "a"
13
+
14
+ [<Fact(Skip = "Remove to run test")>]
15
+ let ``Rotate a by 1`` () =
16
+ rotate 1 "a" |> should equal "b"
17
+
18
+ [<Fact(Skip = "Remove to run test")>]
19
+ let ``Rotate a by 26, same output as input`` () =
20
+ rotate 26 "a" |> should equal "a"
21
+
22
+ [<Fact(Skip = "Remove to run test")>]
23
+ let ``Rotate m by 13`` () =
24
+ rotate 13 "m" |> should equal "z"
25
+
26
+ [<Fact(Skip = "Remove to run test")>]
27
+ let ``Rotate n by 13 with wrap around alphabet`` () =
28
+ rotate 13 "n" |> should equal "a"
29
+
30
+ [<Fact(Skip = "Remove to run test")>]
31
+ let ``Rotate capital letters`` () =
32
+ rotate 5 "OMG" |> should equal "TRL"
33
+
34
+ [<Fact(Skip = "Remove to run test")>]
35
+ let ``Rotate spaces`` () =
36
+ rotate 5 "O M G" |> should equal "T R L"
37
+
38
+ [<Fact(Skip = "Remove to run test")>]
39
+ let ``Rotate numbers`` () =
40
+ rotate 4 "Testing 1 2 3 testing" |> should equal "Xiwxmrk 1 2 3 xiwxmrk"
41
+
42
+ [<Fact(Skip = "Remove to run test")>]
43
+ let ``Rotate punctuation`` () =
44
+ rotate 21 "Let's eat, Grandma!" |> should equal "Gzo'n zvo, Bmviyhv!"
45
+
46
+ [<Fact(Skip = "Remove to run test")>]
47
+ let ``Rotate all letters`` () =
48
+ rotate 13 "The quick brown fox jumps over the lazy dog." |> should equal "Gur dhvpx oebja sbk whzcf bire gur ynml qbt."
49
+